Charger controles Userform avec derniere ligne non vide

egman

XLDnaute Occasionnel
Bonsoir à tous,

Après plusieurs recherches je n'arrive pas à trouver la solution à mon problème.

J'utilise un Userform pour entrer mes paramètres d'impression
Si je peux me permettre j'ai 3 questions :
1- Pouvoir charger tous les contrôles du userform avec les données de la dernière ligne non vide de ma base qui me sert d'historique, pour ne pas à avoir à retaper tous les paramètres car je n'en change que 2 ou 3 à chaque fois.

2- Pouvoir également visualiser mes dernières modifs en rouge (peu importe la couleur) dans la base et dans les contrôles du userform pour ne pas chercher ce qui a déjà été changé.....si c'est possible

3- Renuméroter les lignes de 1 à la dernière ligne renseignée mais que sur la colonne A sans changer l'ordre du reste des lignes (d'où l'importance de ma TextBox38 au format date + heure)

Je vous joint ci-joint mon fichier qui vous paraitra peut etre plus explicite

D'avance MERCI pour votre aide
 

Pièces jointes

  • _BD_S3D-V02.xlsm
    72.9 KB · Affichages: 87

Modeste

XLDnaute Barbatruc
Bonsoir, difficile de dire d'où vient le message d'erreur ... tout dépend où tu as ajouté cette instruction précisément: après que la variable 'L' a été initialisée? À l'intérieur d'une boucle For où 'i' a été initialisé?
Si tu ne trouves pas, dépose une version actualisée de ton fichier.
 

egman

XLDnaute Occasionnel
Bonsoir, difficile de dire d'où vient le message d'erreur ... tout dépend où tu as ajouté cette instruction précisément: après que la variable 'L' a été initialisée? À l'intérieur d'une boucle For où 'i' a été initialisé?
Si tu ne trouves pas, dépose une version actualisée de ton fichier.
Bonsoir Modeste,

Merci de passer autant de temps avec moi tu as surement plus intéressant comme problème à dépatouiller.
Je l'ai initialisée au début de la Private Sub btnAjout_Click() et pas mise dans une boucle...
Je te joint au cas où le dernier fichier. (quand même bizarre ce bouton d'aide qui ne veut pas s'ouvrir)
 

Pièces jointes

  • _BD_S3D-V02.xlsm
    77.8 KB · Affichages: 71

Modeste

XLDnaute Barbatruc
Bonjour,

Dans les 2 procédures (ajout et modif) tu as chaque fois plusieurs boucles
VB:
For i = x to y
     .Cells(L + 1, i) = Controls("T" & i)
Next
c'est là que je te suggérais d'ajouter le '1 *'.
En multipliant par un le contenu d'une zone de texte, le contenu en question redevient un nombre ... pour autant que ce soit possible! C'est pour ça que j'écrivais: "Si toutes les zones de texte contiennent des données numériques ...". Tu risques d'avoir une erreur si la zone de texte est vide ou qu'elle contient autre chose que des chiffres. C'est aussi pour ça que je demandais où devait apparaître la valeur "Auto": si c'est dans T4, écrire l'équivalent de 1*controls("T4") va générer une erreur. Tu dois donc te poser la question pour chaque zone de texte: "risque-t-elle de contenir autre chose que des données pouvant être converties en valeurs numériques?"
 

egman

XLDnaute Occasionnel
Bonjour,

Dans les 2 procédures (ajout et modif) tu as chaque fois plusieurs boucles
VB:
For i = x to y
     .Cells(L + 1, i) = Controls("T" & i)
Next
c'est là que je te suggérais d'ajouter le '1 *'.
En multipliant par un le contenu d'une zone de texte, le contenu en question redevient un nombre ... pour autant que ce soit possible! C'est pour ça que j'écrivais: "Si toutes les zones de texte contiennent des données numériques ...". Tu risques d'avoir une erreur si la zone de texte est vide ou qu'elle contient autre chose que des chiffres. C'est aussi pour ça que je demandais où devait apparaître la valeur "Auto": si c'est dans T4, écrire l'équivalent de 1*controls("T4") va générer une erreur. Tu dois donc te poser la question pour chaque zone de texte: "risque-t-elle de contenir autre chose que des données pouvant être converties en valeurs numériques?"
Bonjour Modeste,
Merci pour le code à insérer dans les procédures (ajout et modif) et pour les conseils concernant les valeurs des zones de texte .
A priori elles sont toutes au format numérique sauf bien sur la T38 qui est au format (date /heure) et les combobox qui retournent du texte.
Donc ton code doit aller pour toutes les zones de texte du formulaire.

Pour en revenir à mon problème soulevé pour le choix "Auto" ou la valeur de T4 je crois que le mieux est de rajouter une zone de texte pour traiter le "Auto" à part. (ce sera plus simple)

Une dernière remarque :
Il y a quelques années il était possible de faire des dons sur Excel Download pour les programmeurs qui aident les gens comme moi à dépatouiller leurs problèmes. Il est sur qu'un forum sert à échanger mais moyennant une contre partie. Cela n'existe plus ?
Merci
 

Modeste

XLDnaute Barbatruc
traiter le "Auto" à part. (ce sera plus simple)
Ah ça, je n'en sais rien: je ne sais toujours pas ce que tu veux faire o_O
Je suppose que si la case Auto est décochée, on indique une valeur en T4 et on la copie ensuite en colonne Extrusion Width ... si la case est cochée, on n'entre rien dans T4 ... mais qu'indique-t-on dans la cellule de la colonne D? C'est là que tu veux inscrire "Auto" ... ou on laisse la cellule vide?
Teste toujours ceci, tu verras si ça ressemble à ce que tu veux ou si ça t'inspire:
VB:
Private Sub CheckBox1_Click()
With Controls("T4")
If CheckBox1 Then
    .Value = ""
    .Enabled = False
    .BackColor = 15790320
Else
    .Enabled = True
    .BackColor = 16777215
End If
End With
End Sub
Si la case Auto est cochée, T4 est vidée de son contenu, elle est "grisée" et inaccessible. Dans le cas contraire, on peut y entrer une valeur (numérique)

Dans la Sub btnAjout_Click(), on pourrait (puisque toutes les zones de texte subiraient le même traitement), utiliser une boucle similaire à celle que j'ai proposée au début. Elle remplacerait tes 4 boucles For ... Le code de cette procédure deviendrait:
VB:
Private Sub btnAjout_Click()
Dim i As Byte, c As Range, L As Long

If T1 = "" Then Exit Sub
L = Ws.Range("A65536").End(xlUp).Row + 1

Set c = rngDes.Find(T1)
If Not c Is Nothing Then
    If MsgBox(T1 & " déjà dans la base" & vbCrLf & _
        "Enregistrer quand même ?", vbQuestion + vbYesNo, "DOUBLONS !") = 7 Then
        EffaceTout
        Exit Sub
    End If
End If

With Ws
    For i = 0 To UBound(tabloZtxt)
        If Controls("T" & tabloZtxt(i)) <> "" Then .Cells(L, tabloZtxt(i)) = 1 * Controls("T" & tabloZtxt(i))
    Next i
    .Cells(L, 3) = cboMat
    .Cells(L, 21) = cboInt
    .Cells(L, 22) = cboExt
    .Cells(L, 35) = CboSup
    .Cells(L, 38) = T38
End With

EffaceTout
IniUsf

End Sub
De cette manière, si les zones de texte sont vides, on ne fait rien et, dans le cas contraire, on multiplie le contenu par 1, comme proposé.
Attention, il faudra penser à vérifier les erreurs d'encodage (données non-numériques)

Pour ta dernière remarque, on pouvait effectivement, il y a quelques années "supporter XLD" (même si les dons ne servaient pas à payer les contributeurs :p, mais plutôt à couvrir -en partie- les frais de gestion et maintenance du forum). Cette possibilité n'existe plus (m'est avis que la pub a pris le relais)
Notre salaire reste le partage des connaissances et les remerciements.
 

egman

XLDnaute Occasionnel
Ah ça, je n'en sais rien: je ne sais toujours pas ce que tu veux faire o_O
Je suppose que si la case Auto est décochée, on indique une valeur en T4 et on la copie ensuite en colonne Extrusion Width ... si la case est cochée, on n'entre rien dans T4 ... mais qu'indique-t-on dans la cellule de la colonne D? C'est là que tu veux inscrire "Auto" ... ou on laisse la cellule vide?
Teste toujours ceci, tu verras si ça ressemble à ce que tu veux ou si ça t'inspire:
VB:
Private Sub CheckBox1_Click()
With Controls("T4")
If CheckBox1 Then
    .Value = ""
    .Enabled = False
    .BackColor = 15790320
Else
    .Enabled = True
    .BackColor = 16777215
End If
End With
End Sub
Si la case Auto est cochée, T4 est vidée de son contenu, elle est "grisée" et inaccessible. Dans le cas contraire, on peut y entrer une valeur (numérique)

Dans la Sub btnAjout_Click(), on pourrait (puisque toutes les zones de texte subiraient le même traitement), utiliser une boucle similaire à celle que j'ai proposée au début. Elle remplacerait tes 4 boucles For ... Le code de cette procédure deviendrait:
VB:
Private Sub btnAjout_Click()
Dim i As Byte, c As Range, L As Long

If T1 = "" Then Exit Sub
L = Ws.Range("A65536").End(xlUp).Row + 1

Set c = rngDes.Find(T1)
If Not c Is Nothing Then
    If MsgBox(T1 & " déjà dans la base" & vbCrLf & _
        "Enregistrer quand même ?", vbQuestion + vbYesNo, "DOUBLONS !") = 7 Then
        EffaceTout
        Exit Sub
    End If
End If

With Ws
    For i = 0 To UBound(tabloZtxt)
        If Controls("T" & tabloZtxt(i)) <> "" Then .Cells(L, tabloZtxt(i)) = 1 * Controls("T" & tabloZtxt(i))
    Next i
    .Cells(L, 3) = cboMat
    .Cells(L, 21) = cboInt
    .Cells(L, 22) = cboExt
    .Cells(L, 35) = CboSup
    .Cells(L, 38) = T38
End With

EffaceTout
IniUsf

End Sub
De cette manière, si les zones de texte sont vides, on ne fait rien et, dans le cas contraire, on multiplie le contenu par 1, comme proposé.
Attention, il faudra penser à vérifier les erreurs d'encodage (données non-numériques)

Pour ta dernière remarque, on pouvait effectivement, il y a quelques années "supporter XLD" (même si les dons ne servaient pas à payer les contributeurs :p, mais plutôt à couvrir -en partie- les frais de gestion et maintenance du forum). Cette possibilité n'existe plus (m'est avis que la pub a pris le relais)
Notre salaire reste le partage des connaissances et les remerciements.
Bonsoir Modeste,

C'est tout à fait ce que je recherchai : Grisé la T4 quand je cochai la Checkbox1
Effectivement si quand la Checkbox1 est décochée il faudrait pouvoir écrire Auto en Colonne D (mais si l'on ne peut qu'y rentrer une valeur numérique autant la laisser vide. T’embêtes pas, merci. De toutes façons si la case Auto n'est pas cochée c'est pour rentrer une valeur Manuel en T4

Pour le code de la Private Sub btnAjout_Click() faut il le répéter pour celui du bouton MODIF ?

Pour en revenir aux "dons" je me doute bien qu'ils ne servaient pas de salaires, mais avoir comme salaires juste des remerciements...CHAPEAU...
Çà se fait rare de nos jours où on a plutôt tendance à profiter des autres sans contrepartie.:)

Donc MILLE MERCI pour ton temps passé.
 

Modeste

XLDnaute Barbatruc
Salut,

Si tu veux inscrire Auto en colonne D, ce devrait être le seul cas où T4 serait vide, donc il faut supprimer le 4 de tabloZtxt, puisqu'il faudra un traitement différent (comme pour T38). Il n'y aura là rien de bien compliqué: il faut juste envisager les différents cas de figure. À toi de voir et de dire ce que tu souhaites.

Pour le code de la Sub "ajout" on pouvait faire avec le code que tu utilisais (c'est juste qu'une boucle au lieu de 4, ça prend moins de place et c'est plus simple si un jour tu dois faire des modifications au code ... et puis il faut répéter tout 4 fois plutôt qu'une seule. Dans chacune de tes boucles, tu devrais ajouter le test pour vérifier si la zone de texte est vide, ainsi que le 1* etc. Dis-nous si tu "coinces".
 

egman

XLDnaute Occasionnel
Salut,

Si tu veux inscrire Auto en colonne D, ce devrait être le seul cas où T4 serait vide, donc il faut supprimer le 4 de tabloZtxt, puisqu'il faudra un traitement différent (comme pour T38). Il n'y aura là rien de bien compliqué: il faut juste envisager les différents cas de figure. À toi de voir et de dire ce que tu souhaites.

Pour le code de la Sub "ajout" on pouvait faire avec le code que tu utilisais (c'est juste qu'une boucle au lieu de 4, ça prend moins de place et c'est plus simple si un jour tu dois faire des modifications au code ... et puis il faut répéter tout 4 fois plutôt qu'une seule. Dans chacune de tes boucles, tu devrais ajouter le test pour vérifier si la zone de texte est vide, ainsi que le 1* etc. Dis-nous si tu "coinces".
Bonjour Modeste,
Merci pour les infos sur les boucles. Mais avant que tu l'écrives je ne connaissais pas d'autres manières que de répéter x fois la même boucle. Effectivement en une seule ligne de boucle tu gères toutes les zones de texte à la fois.

Pour ce qui est d'écrire AUTO uniquement si la Checkbox1 est Cochée je reprend çà et rajoute la valeur de T4 si c'est coché (en enlevant T4 de tabloZtxt...........est ce suffisant ?
Private Sub CheckBox1_Click()
With Controls("T4")
If CheckBox1 Then
.Value = ""
.Enabled = False
.BackColor = 15790320
Else
.Value = "Auto"
.Enabled = True
.BackColor = 16777215
End If
End With
End Sub
 

Modeste

XLDnaute Barbatruc
Bon dimanche, Egman ... et à ceux/celles qui passeraient par ici :)

Sauf si j'ai tout compris de travers, c'est dans le cas où CheckBox1 est coché qu'il faut afficher "Auto". Cette instruction ne doit donc pas être dans le Else !? Inverse la position des deux lignes .Value="" et .Value="Auto"

D'autre part, si le '4' ne figure plus dans le tabloZtxt, il faut prévoir le traitement qui lui est associé dans les Sub Ajout et Modif. Ajoute, dans le bloc 'With WS ... End With ' quelque chose comme:
VB:
.Cells(L, 4) = IIf(CheckBox1, "Auto", T4)

Dans ta Sub cboNum_Change(), il faut aussi prévoir (dans le bloc With WS également) ces deux lignes::
VB:
CheckBox1 = IIf(.Cells(x, 4) = "Auto", True, False)
T4 = .Cells(x, 4)

Enfin, dans la Sub IniUsf(), il faut gérer le même cas, en ajoutant (après la boucle For, par exemple):
VB:
If .Cells(L, 4) = "Auto" Then
    CheckBox1 = True 
Else
    CheckBox1 = False
    T4 = .Cells(L, 4)
End If

Pense à tester tous les cas de figure possible, pour t'assurer que tous sont prévus.
Je m'en vais courir un peu avant l'arrivée de la pluie.

 

egman

XLDnaute Occasionnel
Bon dimanche, Egman ... et à ceux/celles qui passeraient par ici :)

Sauf si j'ai tout compris de travers, c'est dans le cas où CheckBox1 est coché qu'il faut afficher "Auto". Cette instruction ne doit donc pas être dans le Else !? Inverse la position des deux lignes .Value="" et .Value="Auto"

D'autre part, si le '4' ne figure plus dans le tabloZtxt, il faut prévoir le traitement qui lui est associé dans les Sub Ajout et Modif. Ajoute, dans le bloc 'With WS ... End With ' quelque chose comme:
VB:
.Cells(L, 4) = IIf(CheckBox1, "Auto", T4)

Dans ta Sub cboNum_Change(), il faut aussi prévoir (dans le bloc With WS également) ces deux lignes::
VB:
CheckBox1 = IIf(.Cells(x, 4) = "Auto", True, False)
T4 = .Cells(x, 4)

Enfin, dans la Sub IniUsf(), il faut gérer le même cas, en ajoutant (après la boucle For, par exemple):
VB:
If .Cells(L, 4) = "Auto" Then
    CheckBox1 = True 
Else
    CheckBox1 = False
    T4 = .Cells(L, 4)
End If

Pense à tester tous les cas de figure possible, pour t'assurer que tous sont prévus.
Je m'en vais courir un peu avant l'arrivée de la pluie.
Je viens d'effectuer toutes tes modifs de code.
La Sub Ajout fonctionne bien et celle de Modif ne fonctionne pas car c'est la Sub cboNum_Change() qui ne fonctionne pas
En fait si j'ai 4 lignes dans la base et que je veux modifier la ligne 3 je passe par la cboNum pour accéder aux infos de la ligne 3 et il ne se passe rien, de même la Sub Modif ne fonctionne pas non plus sur la ligne 4.....
VB:
Private Sub btnModif_Click()
Dim i As Byte, x As Long

If cboNum.ListIndex = -1 Then Exit Sub
x = cboNum.ListIndex + 2

If MsgBox("Acceptez vous les modifications ?", _
        vbQuestion + vbYesNo, "MODIFICATION") = 7 Then Exit Sub
       
With Ws
    For i = 0 To UBound(tabloZtxt)
        If Controls("T" & tabloZtxt(i)) <> "" Then .Cells(L, tabloZtxt(i)) = 1 * Controls("T" & tabloZtxt(i))
    Next i
    .Cells(L, 3) = cboMat
    .Cells(L, 4) = IIf(CheckBox1, "Auto", T4)
    .Cells(L, 21) = cboInt
    .Cells(L, 22) = cboExt
    .Cells(L, 35) = CboSup
    .Cells(L, 38) = T38
End With

EffaceTout
IniUsf

End Sub

et ma Sub cboNum_Change()
VB:
Private Sub cboNum_Change()
Dim x As Long, i As Byte

If cboNum.ListIndex = -1 Then Exit Sub
x = cboNum.ListIndex + 2

With Ws
    For i = 0 To UBound(tabloZtxt)
        If Controls("T" & tabloZtxt(i)) <> "" Then .Cells(L, tabloZtxt(i)) = 1 * Controls("T" & tabloZtxt(i))
    Next i
    .Cells(L, 3) = cboMat
    CheckBox1 = IIf(.Cells(x, 4) = "Auto", True, False)
    T4 = .Cells(x, 4)
    .Cells(L, 21) = cboInt
    .Cells(L, 22) = cboExt
    .Cells(L, 35) = CboSup
    .Cells(L, 38) = T38
End With

End Sub

Si tu vois quelque chose de bizarre....

Merci.......j’espère que tu t'es bien ressourcé en courant.:)
 

Modeste

XLDnaute Barbatruc
Si tu vois quelque chose de bizarre....
Bizarre, dis-tu ... Ben, maintenant que tu le dis ... :D mais si je te dis, tu vas t'en vouloir d'être passé à côté!

... Allez, ne lis pas la suite, retourne scruter ton code ...

[...]

Quoi, tu triches!? On avait dit "ne lis pas la suite!"

[...]

... Toujours pas? Bon, tant pis pour toi!
Tu initialises une variable 'x' avec ceci: x = cboNum.ListIndex + 2 ... Puis dans la suite du code, la variable que tu utilises pour renseigner le numéro de ligne est ... 'L' comme dans .Cells( L, 3)=cboMat (un copier-coller malencontreux? parce que j'ai vérifié: dans la dernière version de ton fichier, c'était bien 'x' que tu utilisais!?)

Quoi, j'avais prévenu que tu n'allais pas aimer :(

 

egman

XLDnaute Occasionnel
Bizarre, dis-tu ... Ben, maintenant que tu le dis ... :D mais si je te dis, tu vas t'en vouloir d'être passé à côté!

... Allez, ne lis pas la suite, retourne scruter ton code ...

[...]

Quoi, tu triches!? On avait dit "ne lis pas la suite!"

[...]

... Toujours pas? Bon, tant pis pour toi!
Tu initialises une variable 'x' avec ceci: x = cboNum.ListIndex + 2 ... Puis dans la suite du code, la variable que tu utilises pour renseigner le numéro de ligne est ... 'L' comme dans .Cells( L, 3)=cboMat (un copier-coller malencontreux? parce que j'ai vérifié: dans la dernière version de ton fichier, c'était bien 'x' que tu utilisais!?)

Quoi, j'avais prévenu que tu n'allais pas aimer :(
Bonsoir,
Effectivement c'est ballot.....çà à l'air de fonctionner au niveau du cboNum , du bouton Modif et du bouton Modif.

Pour traiter mon historique j'ai téléchargé une .xla qui était à disposition sur le site et c'est nickel. (encore MERCI aux programmeurs qui travaillent dans l'hombre)

Encore MERCI pour tout....Bonne soirée...et peut être à plus tard au cas où...:)
 

egman

XLDnaute Occasionnel
Bizarre, dis-tu ... Ben, maintenant que tu le dis ... :D mais si je te dis, tu vas t'en vouloir d'être passé à côté!

... Allez, ne lis pas la suite, retourne scruter ton code ...

[...]

Quoi, tu triches!? On avait dit "ne lis pas la suite!"

[...]

... Toujours pas? Bon, tant pis pour toi!
Tu initialises une variable 'x' avec ceci: x = cboNum.ListIndex + 2 ... Puis dans la suite du code, la variable que tu utilises pour renseigner le numéro de ligne est ... 'L' comme dans .Cells( L, 3)=cboMat (un copier-coller malencontreux? parce que j'ai vérifié: dans la dernière version de ton fichier, c'était bien 'x' que tu utilisais!?)

Quoi, j'avais prévenu que tu n'allais pas aimer :(
Bonjour Modeste,
Dis moi tout allait bien jusqu'à ce que je sauvegarde le fichier sous un autre nom....pour y apporter des modifs sans détruire le bon bien sur.

J'ai rajouté 2 cboBox en prenant soin bien sur de les déclarer dans les IniUsf(), Private Sub cboNum_Change(), Private Sub btnAjout_Click(), Private Sub btnModif_Click() en les enlevant du tabloZtxt = Array et lorsque je veux ouvrir le UsfBD il me met un message d'erreur 1004 - "erreur définit par l'application ou par l'objet" et je ne comprend pas trop les explications données dans l'aide...! ! !

Çà te parle ce genre d'erreur ?
Faut il que je renomme mon UsrBD sous un autre nom...?

Merci
 

Modeste

XLDnaute Barbatruc
Bonjour egman,

Peut-être à plus tard, disais-tu :) Eh bien, plus tard est arrivé bien tôt, cette année! :D

Je ne pense pas que le nom de l'objet soit en cause; les pistes et hypothèses sont nombreuses! Il vaudrait mieux mettre à disposition une version mise à jour de ton fichier.
 

egman

XLDnaute Occasionnel
Bonjour egman,

Peut-être à plus tard, disais-tu :) Eh bien, plus tard est arrivé bien tôt, cette année! :D

Je ne pense pas que le nom de l'objet soit en cause; les pistes et hypothèses sont nombreuses! Il vaudrait mieux mettre à disposition une version mise à jour de ton fichier.
Désolé pour mon intervention aussi rapide mais je pensais avoir compris toutes tes explications et je pensais avoir à peu prés pigé les différents codes.
Apparemment non...
Donc je te rejoins le fichier...
 

Pièces jointes

  • _BD_S3D-V03-ESSAI.xlsm
    95.3 KB · Affichages: 79

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 190
Messages
2 107 001
Membres
109 735
dernier inscrit
Mounskad