Code à expliquer
Bonsoir à tous, j'essaye de m’imprégner de ce code mais du mal à l'expliquer. Si quelqu'un voudrait bien prendre 5 min pour le commenter afin que je puisse le changer sur mon formulaire. Merci à vous
With Sheets("Traces")
Set f = Sheets("Fiche")
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row)
.Range("A" & lgn) = Now
.Range("B" & lgn) = ComboBox1
f.Range("C1") = ComboBox1
For i = 2 To 28
If i > 0 And i < 6 Then
.Cells(lgn, i + 2) = Val(Controls("ComboBox" & i))
f.Cells(6, i) = Val(Controls("ComboBox" & i))
ElseIf i > 5 And i < 9 Then
.Cells(lgn, i + 3) = Val(Controls("ComboBox" & i))
f.Cells(11, i - 5) = Val(Controls("ComboBox" & i))
ElseIf i > 8 And i < 12 Then
.Cells(lgn, i + 4) = Val(Controls("ComboBox" & i))
f.Cells(16, i - 8) = Val(Controls("ComboBox" & i))
ElseIf i = 12 Then
.Cells(lgn, i + 5) = Val(Controls("ComboBox" & i))
f.Cells(21, 1) = Val(Controls("ComboBox" & i))
ElseIf i > 12 And i < 18 Then
.Cells(lgn, i + 5) = Val(Controls("ComboBox" & i))
f.Cells(26, i - 12) = Val(Controls("ComboBox" & i))
ElseIf i > 17 And i < 20 Then
.Cells(lgn, i + 6) = Val(Controls("ComboBox" & i))
f.Cells(31, i - 17) = Val(Controls("ComboBox" & i))
ElseIf i > 19 And i < 24 Then
.Cells(lgn, i + 7) = Val(Controls("ComboBox" & i))
f.Cells(36, i - 19) = Val(Controls("ComboBox" & i))
ElseIf i > 23 And i < 30 Then
.Cells(lgn, i + 8) = Val(Controls("ComboBox" & i))
f.Cells(41, i - 23) = Val(Controls("ComboBox" & i))
End If
Bonsoir Wall
en espérant être clair
With Sheets("Traces") 'on défini la feuille sur laquelle on travail (début with ----- fin end with)
'donc toutes les lignes entre ces termes commençant par un . s'appliquent à la feuille nommée "Traces"
Set f = Sheets("Fiche") 'on stock le nom de la feuille "Fiche" dans une variable nommée f
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row) 'détermine la premiere ligne vide dans la colonne C
'plage de la ligne 3 au max de lignes de la colonne C +1 représenté par (2) pour avoir la premiere ligne vide
.Range("A" & lgn) = Now ' on écrit la date et l'heure dans la colonne A de la premiere ligne de la colonne C vide dans la feuille Trace
.Range("B" & lgn) = ComboBox1 'idem mais l'on met la valeur du combobox1
f.Range("C1") = ComboBox1 ' on met la valeur du combobox1 dans la cellule C1 de la feuille Fiche
For i = 2 To 28 'on lance une boucle de valeur mini 2 et maxi 28
If i > 0 And i < 6 Then ' si la valeur de i qui évolue a chaque boucle est = à 1 ou 2 ou 3 ou 4 ou 5 alors
.Cells(lgn, i + 2) = Val(Controls("ComboBox" & i)) 'la cellule de la feuille "Trace" ligne(premiere ligne vide de la colonne C,colonne i+2), on met la valeur du combobox i soit combobox 1 pour i=1 puis combobox 2 pour i=2 etc
'donc au premier passage i=1, donc colonne C
f.Cells(6, i) = Val(Controls("ComboBox" & i)) 'idem pour la valeur du combobox mais sur la cellule A6 si i=1 puis B6 puis C6
ElseIf i > 5 And i < 9 Then ' si i est superieur a 5 et plus petit que 9
.Cells(lgn, i + 3) = Val(Controls("ComboBox" & i)) 'exemple: si i=8 alors la cellule de la derniere ligne de la colonne C,colonne 8+3 recoit la veur du combobox8 dans la feuille Trace
f.Cells(11, i - 5) = Val(Controls("ComboBox" & i)) ' la c'est dans la feuille Fiche
ElseIf i > 8 And i < 12 Then
.Cells(lgn, i + 4) = Val(Controls("ComboBox" & i))
f.Cells(16, i - 8) = Val(Controls("ComboBox" & i))
ElseIf i = 12 Then
.Cells(lgn, i + 5) = Val(Controls("ComboBox" & i))
f.Cells(21, 1) = Val(Controls("ComboBox" & i))
ElseIf i > 12 And i < 18 Then
.Cells(lgn, i + 5) = Val(Controls("ComboBox" & i))
f.Cells(26, i - 12) = Val(Controls("ComboBox" & i))
ElseIf i > 17 And i < 20 Then
.Cells(lgn, i + 6) = Val(Controls("ComboBox" & i))
f.Cells(31, i - 17) = Val(Controls("ComboBox" & i))
ElseIf i > 19 And i < 24 Then
.Cells(lgn, i + 7) = Val(Controls("ComboBox" & i))
f.Cells(36, i - 19) = Val(Controls("ComboBox" & i))
ElseIf i > 23 And i < 30 Then
.Cells(lgn, i + 8) = Val(Controls("ComboBox" & i))
f.Cells(41, i - 23) = Val(Controls("ComboBox" & i))
End If
Merci beaucoup pour ces précisions et d'avoir pris le temps de commenter ce code. Je vais avancer dans mon travail vous remerciant encore une fois.
Bonsoir forum à tous, je perds un temps fou mais je n'arrive toujours pas à solutionner ce code. En fait, depuis que j'ai supprimé deux combobox de la frame10 et fait des changement dans le code, je me trouve toujours avec des valeurs décalées d'une colonne sur mes feuilles "traces" et "fiche". j'aurais voulu savoir pourquoi ce code me résiste amis je précise que je suis novice. Merci de m'éclairer. Bonne soirée
Bonjour wall
Sur ton userform, la valeur du tag de chaque combobox correspond a la colonne sur laquelle on va chercher la valeur
a partir des combobox des autres 4, le tag est décaler
exemple combobox 23 tag=29 au lieu de 28
Pour la feuille "Fiche" c'est également décalé dans la macro
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B1") = "Résultats 1" Then
Set fTraces = Sheets("Traces")
ElseIf Range("B1") = "Résultats 2" Then
Set fTraces = Sheets("Traces2")
End If
If TEST = True Then Exit Sub
TEST = True
If Not Intersect(Target, Range("C1:D1")) Is Nothing Then
With fTraces
ln = .Columns("B:B").Find(Range("C1"), lookat:=xlWhole).Row
For I = 1 To 29
If I > 0 And I < 6 Then
Cells(6, I) = .Cells(ln, I + 2)
ElseIf I > 5 And I < 9 Then
Cells(11, I - 5) = .Cells(ln, I + 3)
ElseIf I > 8 And I < 12 Then
Cells(16, I - 8) = .Cells(ln, I + 4)
ElseIf I = 12 Then
Cells(21, 1) = .Cells(ln, I + 5)
ElseIf I > 12 And I < 18 Then
Cells(26, I - 12) = .Cells(ln, I + 5)
ElseIf I > 17 And I < 20 Then
Cells(31, I - 17) = .Cells(ln, I + 6)
ElseIf I > 19 And I < 22 Then
Cells(36, I - 19) = .Cells(ln, I + 7)
ElseIf I > 21 And I < 30 Then
Cells(41, I - 21) = .Cells(ln, I + 8)
End If
Next I
Range("F6") = .Range("H" & ln)
Range("D11") = .Range("L" & ln)
Range("D16") = .Range("P" & ln)
Range("A21") = .Range("Q" & ln)
Range("F26") = .Range("W" & ln)
Range("C31") = .Range("Z" & ln)
Range("C36") = .Range("AC" & ln)
Range("G41") = .Range("AJ" & ln)
End With
ElseIf Not Intersect(Target, Range("B1")) Is Nothing Then
Range("C1") = ""
With Range("C1").Validation
.Delete
Range("A6:F6,A11:D11,A16:D16,A21,A26:F26,A31:C31,A36:E36,A41:G41").ClearContents
If Target = "Résultats 1" Then
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Traces!$B$3:$B$" & Sheets("Traces").Range("B" & Rows.Count).End(xlUp).Row
ElseIf Target = "Résultats 2" Then
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Traces2!$B$3:$B$" & Sheets("Traces2").Range("B" & Rows.Count).End(xlUp).Row
End If
End With
End If
TEST = False
End Sub
Bonsoir à tous, merci Bob le code marche parfaitement. je viens de finir. Il me reste encore un souci à régler : les doublons. Ce code ne tient pas compte des noms de la colonne B3, B4, B5, etc... de la feuille "Traces". Donc à chaque fois que j'ajoute un enregistrement de X, le code n'efface pas les valeurs de celui ci pour les écraser. Faut il rajouter une variable find et delete et surtout comment???
Merci à vous tous
With Sheets("Traces")
Set f = Sheets("Fiche")
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row)
.Range("A" & lgn) = Now
.Range("B" & lgn) = ComboBox28
f.Range("C1") = ComboBox28
For I = 1 To 27
If I > 0 And I < 6 Then
.Cells(lgn, I + 2) = Val(Controls("ComboBox" & I))
f.Cells(6, I) = Val(Controls("ComboBox" & I))
ElseIf I > 5 And I < 9 Then
.Cells(lgn, I + 3) = Val(Controls("ComboBox" & I))
f.Cells(11, I - 5) = Val(Controls("ComboBox" & I))
Bonjour wall
je ne trouve pas cette partie de code dans ton fichier
le fichier précédant gérait bien les doublons par la variable LI
Le seul souci c'est que la combo des noms n'est pas rafraichit à l'ajout d'un nom
peux-tu poster la dernière version de ton fichier?
Bonjour à tous, salut BOb, effectivement erreur de ma part comme je travaille sur l'original, je fais une copie du code. Je joins de fichier qui n'affiche pas en plus les erreurs de saisie.
Merci et bonne journée
Bonjour wall
tu avais un fichier qui fonctionnait à peu prés et tu refais un fichier qui ne fonctionne plus( manque feuilles, plus de recherche de nom, etc)
quel est le bon?
Salut Bob désolé en fait je travaille sur les deux et j'essaye d'apprendre en comparant les deux méthodes. Mais transposer les codes des deux fichiers, ce n'est pas si facile et ce n'est pas les mêmes logiques. Si tu veux bien stp, travailler sur les deux fichier m'aiderait beaucoup et merci pour ta réponse et le temps passé à corriger.
Re
dans le dernier fichier, tu ne passe plus par des modules de class, donc tu gére chaque textbox en fonction de chaque combobox
moins facile
le gros souci, c'est que tu as des combobox puis un textbox puis des combobox puis a nouveau un textbox
donc c'est plus difficile de faire des boucles, il faut donc passer par des >et < pour comparer
je te propose que tu remplace les textbox par des combobox en modifiant la propriété showdropbuttonwhen =0
comme cela tu n'as plus qu'une boucle sur des combobox avec l'apparence et le fonctionnement des textbox
a toi de jouer
Merci pour tes conseils Bob, bonjour à tous, mais pour éviter les doublons sur mon tableau, j'ai inséré ce code : Dim R As Range
Set R = Range("B4:B" & lgn - 1).Find(Cells(2, lgn), , xlValues, xlWhole)
If Not R Is Nothing Then Rows(R.Row).Delete dans le code en dessous, mais il y a des erreurs : qu'en pensez vous? Merci
With Sheets("Traces")
Set f = Sheets("Fiche")
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row)
.Range("A" & lgn) = Now
.Range("B" & lgn) = ComboBox28
Dim R As Range
Set R = Range("B4:B" & lgn - 1).Find(Cells(2, lgn), , xlValues, xlWhole)
If Not R Is Nothing Then Rows(R.Row).Delete
f.Range("C1") = ComboBox28
For I = 1 To 27
If I > 0 And I < 6 Then
.Cells(lgn, I + 2) = Val(Controls("ComboBox" & I))
f.Cells(6, I) = Val(Controls("ComboBox" & I))
Bonsoir wall
au début tu écrit With Sheets("Traces") donc n'oublie pas de mettre un point devant range sinon tu applique sur la feuille sélectionnée et non sur la feuille traces
ensuite dans la recherche find se n'est pas 2,lgn mais lgn,2
pour un range c'est colonne et ligne mais pour cells c'est ligne,colonne
mais ici tu aurais inscrit combobox28 cela évite une erreur
cela serait plus facile de réécrire sur la ligne trouvée plutôt que de la supprimer
Set R = .Range("B4:B" & lgn - 1).Find(Cells(lgn, 2), , xlValues, xlWhole)
If Not R Is Nothing Then .Rows(R.Row).Delete
Rebonsoir, je reviens vers vous forum, Bob, car je n'avance pas. En effet, j'ai un décalage comme sur l'image, j'ai fait des essais non fructueux. J'avoue que ne pose pas de logique, j'essaye d'aller vite et au pif. Une idée svp ! merci
With Sheets("Traces")
Set f = Sheets("Fiche")
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row)
.Range("A" & lgn) = Now
.Range("B" & lgn) = ComboBox28
Dim R As Range
Set R = .Range("B4:B" & lgn - 1).Find(Cells(lgn, 2), , xlValues, xlWhole)
If Not R Is Nothing Then .Rows(R.Row).Delete
f.Range("C1") = ComboBox28
For I = 1 To 27
Re bonsoir
étant donné que tu supprime la ligne et que avant tu as rempli la cellule A et B avec la date et le nom, lgn est décalé d'une ligne en moins donc la boucle doit se faire sur lgn-1
Bonjour à tous, salut Forum, je suis bloqué, je donne la main pour Bob et qui souhaitera me donner la solution. J'ai fait beaucoup de manipulation, je m'en sors pas.
J'ai encore 2 erreurs : le récurrent à régler en priorité c'est le décalage de ligne comme ci-dessous et le 2ème c'est que le formulaire se ferme quand il affiche le message box en cas de non saisie d'une textbox. Merci à vous de m'aider. Cordialement
RE...Désolé Bob mais je ne vois pas la différence en comparant les 2 codes et pourtant ça fonctionne sauf pour la première ligne de "Traces" B3 qui ne bouge pas. Désolé encore
re
exemple
ligne de code 211
avant
If i > 0 And i < 6 Then
.Cells(lgn , i + 2) = Val(Controls("ComboBox" & i))
apres
If i > 0 And i < 6 Then
.Cells(lgn - 1, i + 2) = Val(Controls("ComboBox" & i))
il faudrait que tu place un point d'arret sur le code du bouton "valider" touche F9 puuis que tu appuis sur la touche F8 pour voir la macro se faire pas à pas
tu vas vite comprendre ce qui ce passe
pour la ligne B3,
lgn = Application.Max(3, .Range("C" & Rows.Count).End(xlUp)(2).Row)
.Range("A" & lgn) = Now
.Range("B" & lgn) = ComboBox28
f.Range("C1") = ComboBox28
Set R = .Range("B4:B" & lgn - 1).Find(Cells(lgn, 2), , xlValues, xlWhole)
tu recherche le nom sur la plage B4 a B&lgn
donc tu ne trouve pas B3
RE Merci bien pour cette leçon c'est top comme je veux. Je vais avancer de mon côté. Bonne journée