Optimisation code avec boucle et gestion d'erreurs
Bonjour le forum
Comme indiqué dans le titre je dispose d'un code (qui n'est pas très jojo). Je pense qu'il est possible d'optimiser tout ça avec une boucle du style For i = x to y mais là je suis complètement perdus
Voilà le code :
Private Sub Affichage()
Date1 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 5
Date2 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 4
Date3 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 3
Date4 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 2
Date5 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 1
Date6 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3))
Date7 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) + 1
Me.J1.Caption = Format(Date1, "dddd dd/mm")
Me.J2.Caption = Format(Date2, "dddd dd/mm")
Me.J3.Caption = Format(Date3, "dddd dd/mm")
Me.J4.Caption = Format(Date4, "dddd dd/mm")
Me.J5.Caption = Format(Date5, "dddd dd/mm")
Me.J6.Caption = Format(Date6, "dddd dd/mm")
Me.J7.Caption = Format(Date7, "dddd dd/mm")
With Feuil1
Me.J1H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date1), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J1H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date1), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J1H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date1), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J1H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date1), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J2H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date2), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J2H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date2), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J2H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date2), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J2H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date2), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J3H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date3), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J3H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date3), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J3H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date3), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J3H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date3), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J4H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date4), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J4H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date4), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J4H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date4), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J4H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date4), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J5H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date5), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J5H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date5), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J5H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date5), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J5H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date5), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J6H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date6), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J6H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date6), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J6H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date6), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J6H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date6), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
Me.J7H1.Caption = Format(WorksheetFunction.VLookup(CDbl(Date7), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 2, False), "hh:mm")
Me.J7H2.Caption = Format(WorksheetFunction.VLookup(CDbl(Date7), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 3, False), "hh:mm")
Me.J7H3.Caption = Format(WorksheetFunction.VLookup(CDbl(Date7), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 4, False), "hh:mm")
Me.J7H4.Caption = Format(WorksheetFunction.VLookup(CDbl(Date7), .Range("A2:E" & .Range("A65000").End(xlUp).Row), 5, False), "hh:mm")
End With
End SubPar avance merci de l’intérêt porté au sujet
Bonjour,
En effet c'est largement possible d'optimiser ta macro
Private Sub Affichage()
Date1 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 5
For i = -5 To 1
Controls("J" & i + 6).Caption = Format(Date1 + i, "dddd dd/mm")
For j = 1 To 4
Controls("J" & i + 6 & "H" & j).Caption = Format(Feuil1.Cells(2 + i + 5, j + 1), "hh:mm")
Next j
Next i
End SubOui c'est tout
Me n'est pas nécessaire comme tu codes déjà dans le formulaire, et j'utilise Controls(nomducontrole as String) pour pouvoir appeler un contrôle via son nom
Oh j'ai aussi enlevé toutes tes recherches de valeur, on peut facilement s'en sortir avec cells(ligne,colonne) et les variables qu'on à utilisé
Bonjour, merci de retour
Le code fonctionne bien mais le soucis est que quand je vais rajouter des dates dans la liste et que je vais naviguer dans ces dates, les heures saisies correspondantes ne vont pas se mettre à jour... C'est pourquoi j'était partir sur du RechercheV pour remplir les Label. Ou y a t-il une autre solution ?
Ok en modifiant un peux ton code j'obtient bien ce que je veux, il me reste cependant un détail à régler
Pour commencer voilà le code modifié :
Private Sub Affichage()
Date1 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 6
For i = 1 To 7
Controls("J" & i).Caption = Format(Date1 + i, "dddd dd/mm")
For j = 1 To 4
Controls("J" & i & "H" & j).Caption = _
Format(WorksheetFunction.VLookup(CDbl(Date1 + i), Feuil1.Range("A2:E" & Feuil1.Range("A65000").End(xlUp).Row), j + 1, False), "hh:mm")
Next j
Next i
End SubPour finaliser tout ça il faudrais que quand aucunes valeurs n'est trouvée par recherchev il laisse les Label vide. J'avais penser à On error resume next mais ça ne reset pas les label ...
Finalement je trouve tout seul ! (enfin merci Microsoft doc
Voilà le code :
Private Sub Affichage()
Date1 = 7 * NoSem + DateSerial(Annee, 1, 3) - WorksheetFunction.Weekday(DateSerial(Annee, 1, 3)) - 6
For i = 1 To 7
Controls("J" & i).Caption = Format(Date1 + i, "dddd dd/mm")
For j = 1 To 4
Code = Application.VLookup(CDbl(Date1 + i), Feuil1.Range("A2:E" & Feuil1.Range("A65000").End(xlUp).Row), j + 1, False)
If Not IsError(Code) Then
Controls("J" & i & "H" & j).Caption = Format(Code, "hh:mm")
Else
Controls("J" & i & "H" & j).Caption = ""
End If
Next j
Next i
End SubRe
Sinon si tu en as marre de passer par des WorksheetFunction et Range("a1","a65000"), tu peux utiliser :
ligFin = Range("a" & Rows.Count).End(xlUp).Rowpour avoir la dernière ligne en prenant en référence la colonne A, Rows.Count permet de renvoyer le nombre de ligne que contient ta feuille active, pas besoin de s'embêter avec 6 * * * *.
Range("a1","a" & ligFin).Find(valeur,LookAt:=xlWhole).Rowpour avoir la ligne où se trouve la valeur que tu cherches, renvoie une erreur si aucune valeur trouvée (donc compatible avec on Error goto)
C'est toi qui vois