Débutante VBA excel

Résolu
Bonjour,

Je débute tout juste sur VBA sous excel, je voudrais créer une feuille récap d'une BBD nommée Recettelavage. Pour chaque n° de lavage et chaque paramètre de lavage, je recherche la situation la plus récente

Je vous montre mon programme (soyez indulgents)

Private Sub Auto_Open()

Dim Recapn°lavage As Integer
Dim RecapParamètre As String
Dim RecapSituation As Variant
Dim n°lavage As Integer
Dim Paramètre As String
Dim Situation As Variant
Dim I As Integer
Dim J As Integer
Dim K As Integer

Recapn°lavage = Range("A4:A100")
RecapParamètre = Range("D3:AA3")
RecapSituation = Range("D4:AA100")
n°lavage = Sheets("Recettelavage").Range("C4:C100")
Paramètre = Sheets("Recettelavage").Range("F4:F100")
Situation = Sheets("Recettelavage").Range("I4:I100")

For I = 1 To 100
For J = 1 To 100
For K = 1 To 24 'J'ai 24 paramètres de lavage'
If Recapn°lavage(I, 1) = n°lavage(J, 1) Then
If Paramètre(J, 1) = RecapParamètre(1, K) Then
RecapSituation(I, K) = Situation(J, 1)
End If
Next I
Next J
Next K

End Sub

Merci d'avance pour votre aide

9 réponses

  1. Bonjour le forum,

    Voici mon code VBA après l'optimisation de mon message #6 :

    
    Option Explicit
    
    
    Sub Recaplavages()
      Worksheets("Récap lavages").Select: Application.ScreenUpdating = False
      Dim NL As Integer, param As String, col As Integer
      Dim dlig As Long, lig1 As Long, lig2 As Long
      ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux
      dlig = Range("A" & Rows.Count).End(xlUp).Row: Range("D4:AA" & dlig).ClearContents
      With Worksheets("Recettelavage")
        dlig = .Range("C" & Rows.Count).End(xlUp).Row
        For lig1 = 4 To dlig
          NL = Val(.Cells(lig1, 3))
          If NL > 0 Then
            param = .Cells(lig1, 6)
            If param <> "" Then
              lig2 = NL + 3
              For col = 4 To 27
                If param = Cells(3, col) Then Cells(lig2, col) = .Cells(lig1, 9): Exit For
              Next col
            End If
          End If
        Next lig1
      End With
    End Sub
    
    

    Les lignes #9 et #10 doivent être sur une seule ligne.

    Idem pour les lignes #11 et #12.

    Idem pour les lignes #22 et #23 ; c'est d'ailleurs au
    bout de cette ligne que j'ai rajouté « : Exit For » :
    l'optimisation mentionnée au début de ce message.

    Cordialement.  :)
     
    1. Salut,

      Je pense que ça manque de détails. Notamment cette phrase : "Pour chaque n° de lavage et chaque paramètre de lavage, je recherche la situation la plus récente"
      1. Bonjour Patrice,

        Merci pour l'info, je ne savias pas comment joindre mon fichier.
        Ce sera plus simple pour vous de comprendre ce que je souhaite (enfin je l'espère)

        https://www.cjoint.com/c/FLwm2IfO1lL

        PS: Les données affichées sont inventées
        1. Bonjour abrareus,

          Je te retourne ton fichier Excel 2007 modifié.

          À l'ouverture, tu seras sur la feuille "Récap lavages" ;
          remarque bien qu'il n'y a aucun paramètre.

          --------------------------------------

          < Ctrl >< r > : travail effectué.

          Tu n'as pas besoin d'effacer les anciens paramètres avant de refaire
          < Ctrl >< r > : c'est fait automatiquement par la macro.

          Donc si tu changes les données de la feuille "Recetteslavage",
          tu peux faire < Ctrl >< r > juste après.

          --------------------------------------

          Tu peux faire < Ctrl >< r > depuis n'importe quelle feuille du classeur,
          et ça ira de toute façon sur la feuille « Récap lavages » pour que tu
          puisses voir le résultat : les différents paramètres.

          --------------------------------------

          Le code de Feuil5 était en double (et en trop) : je l'ai supprimé.
          Tout le code est entièrement dans Module1.

          Si vraiment tu veux que la macro soit exécutée dès l'ouverture
          du classeur, indique-le moi et je te dirai comment faire, car
          ton ancienne méthode avec Auto_Open() est obsolète.

          --------------------------------------

          Dis-moi ce que tu en penses, et si ça te convient.
          Tu peux me demander une adaptation si besoin.

          Si ton problème est réglé, merci d'aller en haut de page
          pour cliquer sur « Marquer comme résolu ».

          Cordialement.  :)
           
          1. @abrareus : pour le code VBA de mon message #5, j'ai oublié une
            instruction d'optimisation, avec laquelle il sera un peu plus rapide.

            Voici donc la nouvelle version de ton fichier Excel 2007.

            Tu pourras voir que la seule différence est « : Exit For » qui est ajouté
            au bout de l'unique ligne incluse dans la boucle For col ... Next col.

            Ça fait qu'on sort de la boucle dès que le paramètre a été trouvé et
            sa valeur écrite. Ainsi, on évite de tester inutilement le paramètre
            avec les autres colonnes qui suivent => léger gain de temps !  ;)

            Je te rappelle que tu peux me demander une adaptation si besoin,
            y compris si tu tiens à une exécution automatique à l'ouverture
            du classeur ; si tout est OK, tu peux passer le sujet en résolu.  :)
             
            1. Bonjour albkan!

              Ouah! J'étais très loin de ce qu'il fallait faire! Pour l'exécution automatique, je peux m'en passer. Je mettrai juste dans ma procédure qu'il faut actualiser en faisant <ctrl> et <r>.
              Je vais demander une formation VBA à mon entreprise ce sera utile!

              Merci encore et bonnes fêtes de fin d'année!
              1.  
                Bonjour abrareus,

                Je suis vraiment ravi que mon code VBA t'aie plu !

                Si ton entreprise veut bien t'offrir une formation VBA,
                j'espère qu'elle te sera profitable : tu seras une pro !

                Bonnes fêtes de fin d'année à toi aussi !  

                albkan  :)
                 
            2. Petite optimisation ici : Param dispensable (de trop)

              Sub Recaplavages()
                Worksheets("Récap lavages").Select: Application.ScreenUpdating = False
                Dim NL As Integer, col As Integer
                Dim dlig As Long, lig1 As Long, lig2 As Long
                ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux
                dlig = Range("A" & Rows.Count).End(xlUp).Row: Range("D4:AA" & dlig).ClearContents
                With Worksheets("Recettelavage")
                  dlig = .Range("C" & Rows.Count).End(xlUp).Row
                  For lig1 = 4 To dlig
                    NL = Val(.Cells(lig1, 3))
                    If NL > 0 Then
                      If Not IsEmpty(.Cells(lig1, 6)) Then
                        lig2 = NL + 3
                        For col = 4 To 27
                          If .Cells(lig1, 6) = Cells(3, col) Then Cells(lig2, col) = .Cells(lig1, 9): Exit For
                        Next col
                      End If
                    End If
                  Next lig1
                End With
              End Sub
              


              Joyeux temps des fêtes ! :-)

              iBenny
              1. Et optimisé au max, on peu virer les NL et Lig2 :

                Sub Recaplavages()
                  Dim col As Integer
                  Dim dlig As Long, lig1 As Long
                
                  Worksheets("Récap lavages").Select
                  Application.ScreenUpdating = False
                
                  ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux
                  dlig = Range("A" & Rows.Count).End(xlUp).Row
                  Range("D4:AA" & dlig).ClearContents
                
                  With Worksheets("Recettelavage")
                    dlig = .Range("C" & Rows.Count).End(xlUp).Row
                
                    For lig1 = 4 To dlig
                      If .Cells(lig1, 3) and Not IsEmpty(.Cells(lig1, 6)) Then
                          For col = 4 To 27
                            If .Cells(lig1, 6) = Cells(3, col) Then Cells(Cells(lig1, 3) + 3, col) = .Cells(lig1, 9): Exit For
                          Next col
                      End If
                    Next lig1
                
                  End With
                End Sub
              2.  
                Bonjour iBenny,

                Réponse à ton message #8

                Je pense sincèrement que tu as fait une mauvaise optimisation de mon code
                en enlevant param, car il était affecté une fois pour 2 utilisations à l'intérieur
                de 2 boucles For imbriquées !

                Réponse à ton message #9

                Là encore, je pense que tu as fais deux mauvaises optimisations :

                a) Enlever NL : idem : affecté une fois puis utilisé 2 fois à l' intérieur de la
                    1ère boucle For

                b) Enlever lig2 : par rapport à la 2ème boucle For, lig2 est affecté avant, puis
                    utilisé une fois à l'intérieur ; mais c'est justement parce qu'il est inclus
                    dans la boucle que même utilisé une fois seulement, ça vaut le coup !

                Bonnes fêtes à toi aussi, albkan