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

13wall-v07.xlsm (104.12 Ko)

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
12wall-v07.xlsm (113.61 Ko)

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

9wall-v-essai1.xlsm (86.35 Ko)

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

capture d ecran 2015 05 24 22 00 33

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

capture d ecran 2015 05 25 09 08 14
4wall-v-essai1.xlsm (90.25 Ko)

Bonjour wall

c'est bien le lgn-1 qui te pose problême

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

Rechercher des sujets similaires à "code expliquer"