Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
Re,

Pas de raison d'être désolé: je te taquinais aimablement

Ton erreur 1004 est due au fait que, dans ton code -dans la Sub IniUsf()- tu fais référence à une plage nommée "ListCou" ... celle-ci n'existe pas (il y en a bien une qui correspond sans doute, mais son nom est ListCouleur). Même chose, j'en ai peur avec .Range("ListMar").Value: tu fais ici référence à une autre plage nommée inexistante (il existe une ListMarque !?)

Au même endroit dans le code, tu définis trois fois le contenu de la liste de cboSup (lignes 25, 26 et 29 )

Attention également au fait qu'en utilisant tabloZtxt, il faut impérativement que les numéros des colonnes correspondent au nombre derrière le 'T' dans le nom de chaque textBox. En insérant deux colonnes, comme tu l'as fait, tu as décalé toutes les colonnes à partir de la 4e ... T4 devrait donc devenir T6, etc ... jusqu'à T38 qui contient les données de la colonne n°40
Soit tu déplaces tes 2 colonnes après la 38e, soit tu renommes l'intégralité des TextBoxes (sauf T1 et T2) ... ou alors tu utilises un autre système que le fameux tabloZtxt pour lire ou écrire dans toutes tes zones de texte.
... Je me suis arrêté là
 

egman

XLDnaute Occasionnel
Bonsoir Modeste,

Quel abruti je suis...ne pas nommer mes listes de la même façon dans la feuille Listes2 et dans mon code VB...

Pour les textBox si je complète tabloZtxt = Array en rajoutant ( , 39, 40) çà devrait le faire...ce qui fait que mes textBox ne seront plus décalées. C'est çà ?
Sinon je décalerai mes textBox (mais je croyais avoir compris qu'avec tabloZtxt à condition d'avoir le bon nombre de colonnes dedans qu'on pouvait rajouter autant de textBox que l'on voulait).....! ! !

Merci pour m'avoir montré mes erreurs.
 

egman

XLDnaute Occasionnel
Dis moi j'ai modifié mes codes en décalant les adressages par rapport aux colonnes...
Est ce que cela peut marcher ?
Private Sub IniUsf()

Set Ws = ThisWorkbook.Sheets("BDD")
L = Ws.Range("A65536").End(xlUp).Row

With Ws
Set rngDes = .Range("A2:A" & L)
.Range("A2").Sort Key1:=.Range("A2"), Order1:=xlAscending, Header:=xlGuess
cboNum.List = rngDes.Value
End With

With Sheets("Listes2")
cboMat.List = .Range("ListMat").Value
cboCou.List = .Range("ListCou").Value
cboMar.List = .Range("ListMar").Value
cboInt.List = .Range("ListInt").Value
cboExt.List = .Range("ListExt").Value
CboSup.List = .Range("ListSup").Value
End With

tabloZtxt = Array(1, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 40)
For i = 0 To UBound(tabloZtxt)
Me.Controls("T" & tabloZtxt(i)) = Cells(L, tabloZtxt(i))
Next i

With Ws
If .Cells(L, 6) = "Auto" Then
CheckBox1 = True
Else
CheckBox1 = False
T4 = .Cells(L, 6)
End If
End With

With Ws
cboMat = Ws.Cells(L, 3)
cboCou = Ws.Cells(L, 4)
cboMar = Ws.Cells(L, 5)
cboInt = Ws.Cells(L, 21)
cboExt = Ws.Cells(L, 22)
CboSup = Ws.Cells(L, 35)
End With

With Ws
T38 = Format(Now, "dd/mm/yyyy - hh:nn")
End With

End Sub
Private Sub cboNum_Change()
Dim L As Long, i As Byte

If cboNum.ListIndex = -1 Then Exit Sub
L = 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(L, 6) = "Auto", True, False)
T4 = .Cells(L, 6)
.Cells(L, 4) = cboCou
.Cells(L, 5) = cboMar
.Cells(L, 21) = cboInt
.Cells(L, 22) = cboExt
.Cells(L, 35) = CboSup
.Cells(L, 40) = T38
End With

End Sub
Private Sub CheckBox1_Click()
With Controls("T4")
If CheckBox1 Then
.Value = "Auto"
.Enabled = False
.BackColor = 15790320
Else
.Value = ""
.Enabled = True
.BackColor = 16777215
End If
End With
End Sub
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, 4) = cboCou
.Cells(L, 5) = cboMar
.Cells(L, 6) = IIf(CheckBox1, "Auto", T4)
.Cells(L, 21) = cboInt
.Cells(L, 22) = cboExt
.Cells(L, 35) = CboSup
.Cells(L, 40) = T38
End With

EffaceTout
IniUsf

End Sub

Private Sub btnModif_Click()
Dim i As Byte, L As Long

If cboNum.ListIndex = -1 Then Exit Sub
L = 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) = cboCou
.Cells(L, 5) = cboMar
.Cells(L, 6) = IIf(CheckBox1, "Auto", T4)
.Cells(L, 21) = cboInt
.Cells(L, 22) = cboExt
.Cells(L, 35) = CboSup
.Cells(L, 40) = T38
End With

EffaceTout
IniUsf

End Sub
 

Modeste

XLDnaute Barbatruc
Re,

Quand on écrit
VB:
tabloZtxt = Array(1, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 40)
on déclare un tableau de 30 éléments (0 à 29) contenant une série de nombres. Le 3e élément du tableau (à l'indice 2 est donc 7). Si on écrit ensuite une boucle For i=0 to 29, au moment où i vaut 2, on pointe bien vers le 7 (qui est le 3e élément) et donc, à la ligne suivante:
VB:
Me.Controls("T" & tabloZtxt(i)) = Cells(L, tabloZtxt(i))
On est d'accord qu'il faut qu'une zone de texte nommée T7 prenne la valeur renseignée dans une cellule dont l'adresse est dans une certaine ligne et en colonne 7
La question est donc: "as-tu désormais une zone de texte, dans ton UserForm, nommée T7, qui contiendra la "retraction distance" et dont le contenu sera en lien avec la 7e colonne ("G") de ton classeur? Idem pour T8, T9, T10, etc. jusqu'à T39 (38 ne figurait pas dans tabloZtxt ... 40 ne devrait donc pas s'y trouver non plus!)

Pour le reste, la seule solution est de tester. En cas d'erreur, exécuter en "pas-à-pas" pour déterminer où se trouve précisément l'erreur et ce que valent à ce moment les différentes variables (L, x, i, etc.)
 

egman

XLDnaute Occasionnel
Bonsoir Modeste,

Merci pour tous ces conseils.
Je commence à mieux comprendre la philosophie grâce à tes explications.
Je vais essayer de mettre tout çà en œuvre et j’espère que mon prochain post sera pour te dire que j'y suis arrivé et que tout fonctionne.

Encore MERCI pour ton temps passé.
Bonne soirée
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…