Débutante VBA excel

Résolu/Fermé
abrareus Messages postés 3 Date d'inscription jeudi 22 décembre 2016 Statut Membre Dernière intervention 22 décembre 2016 - 22 déc. 2016 à 13:27
 Utilisateur anonyme - 28 déc. 2016 à 02:12
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
A voir également:

9 réponses

Utilisateur anonyme
28 déc. 2016 à 01:24
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
Utilisateur anonyme
22 déc. 2016 à 22:57
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
Utilisateur anonyme
23 déc. 2016 à 03:47
@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
Utilisateur anonyme
28 déc. 2016 à 02:12
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
22 déc. 2016 à 13:48
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
22 déc. 2016 à 13:49
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
abrareus Messages postés 3 Date d'inscription jeudi 22 décembre 2016 Statut Membre Dernière intervention 22 décembre 2016
22 déc. 2016 à 13:56
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
abrareus Messages postés 3 Date d'inscription jeudi 22 décembre 2016 Statut Membre Dernière intervention 22 décembre 2016
22 déc. 2016 à 14:02
Si jamais le lien précédent ne marchait pas...

https://www.cjoint.com/c/FLwm5U2xfXL
0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
27 déc. 2016 à 17:38
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
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
Modifié par iBenny le 27/12/2016 à 19:42
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
 
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