Débutante VBA excel

Résolu
abrareus Messages postés 3 Statut Membre -  
 Utilisateur anonyme -
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. Utilisateur anonyme
     
    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.  :)
     
    2
  2. Utilisateur anonyme
     
    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
  3. Utilisateur anonyme
     
    @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
  4. abrareus
     
    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
    1. Utilisateur anonyme
       
       
      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  :)
       
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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"
    0
  7. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    Il serait plus simple de répondre avec ton fichier,
    débarassé des informations confidentielles s'il y lieu.

    Déposes le fichier avec des commentaires explicatifs sur
    https://www.cjoint.com/
    et mets le lien obtenu dans ton prochain message.

    Tuto : Comment utiliser C.joint.fr
    0
  8. abrareus Messages postés 3 Statut Membre
     
    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
    0
  9. iBenny Messages postés 103 Statut Membre 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
    0
    1. iBenny Messages postés 103 Statut Membre 2
       
      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
      0
    2. Utilisateur anonyme
       
       
      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
       
      0