IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Boucle dans code VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Février 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2020
    Messages : 25
    Par défaut Boucle dans code VBA
    Bonjour à tous,

    Je viens vers vous car j'ai créé un code VBA pour effectuer une action. Il fonctionne sur le principe, mais il est hyper lourd !
    Je répète du code à bloc, alors qu'avec une boucle je pense que se serait plus léger !!
    Mais voila, je galère avec les boucles !!!

    Pourriez vous m'aider !

    L'explication du code est simple, il regarde sur un onglet ("Casiersafermer") la plage F15 à F18 ( y a des références dans cette plage, style HB1, HB2, ect...) et regarde dans un autre onglet ("BasedeDonnées") qui est ma BDD, s'il voit une référence qui se trouve dans ma plage F15 à F18 du premier onglet, il doit l'effacer dans ma base de donnée.

    Pour Infos Sur ma BDD, les références se trouve en colonne 17.
    A titre d'info puisque je ne maitrise pas la fonction clear, j'ai "triché" en allant copier une cellule déjà vide la A1 de l'onglet "Casiersafermer"

    Voici le code dégueulasse que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub miseàjourVest()
    Dim F1 As Worksheet
    Dim F2 As Worksheet
    Set F1 = Sheets("BasedeDonnées")
    Set F2 = Sheets("Casiersafermer")
    Dim plage As Range
    Set plage = F1.Range("Q3:Q800")
    codrecherché = F2.Range("F15").Value
    Application.ScreenUpdating = False
    For Each cell In plage
     If cell.Value = codrecherché Then
        F1.Cells(cell.Row, 17) = F2.Range("A1")
    End If
        Next cell
    codrecherché = F2.Range("F16").Value
    Application.ScreenUpdating = False
    For Each cell In plage
     If cell.Value = codrecherché Then
        F1.Cells(cell.Row, 17) = F2.Range("A1")
    End If
        Next cell
    codrecherché = F2.Range("F17").Value
    Application.ScreenUpdating = False
    For Each cell In plage
     If cell.Value = codrecherché Then
        F1.Cells(cell.Row, 17) = F2.Range("A1")
    End If
        Next cell
    codrecherché = F2.Range("F18").Value
    Application.ScreenUpdating = False
    For Each cell In plage
     If cell.Value = codrecherché Then
        F1.Cells(cell.Row, 17) = F2.Range("A1")
    End If
        Next cell
    Application.ScreenUpdating = True
    End Sub

    Désolé de vous montrer ce code les gars !!! J'ai honte !!!!

    En vous remerciant d'avance.

    Bonne journée à tous...

    Cordialement,

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour effectuer un travail répétitif, outre la boucle, il est intéressant de créer une procédure avec arguments. Par exemple la plage source et la plage cible.
    On crée ainsi une boucle qui cherche, sélectionne ou ouvre suivant les cas les plages concernées et invoque la procédure en question en lui passant les arguments.

    Petit exemple d'une boucle qui invoque la procédure nommée ProcessStandard en lui passant les deux arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
      Dim rngSource As Range  ' Plage source
      Dim Table()
      Dim Elem As Integer
      Table = Array("T_Data_1", "T_Data_2", "T_Data_3")  ' Nom de trois tables structurées
      For Elem = 0 To UBound(Table)
        ProcessStandard Range("T_Source"), Range(Table(Elem))
      Next
      Set rngSource = Nothing: Set oTable = Nothing
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub ProcessStandard(SourceTable As Range, TargetTable As Range)
       ' Code VBA
       Debug.Print SourceTable.Address, TargetTable.Address
    End Sub
    Tutoriel à lire éventuellement sur le sujet La gestion des boucles dans Excel

    Pour comparer le contenu de 2 colonnes en affichant les données qui sont communes ou qui sont absentes, il existe une fonction native d'excel EQUIV en imbriquant éventuellement en plus ESTNA et NON
    Voir ces deux billets sur le sujet

    Cette formule d'excel peut être bien entendu placée à l'aide d'une procédure VBA
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Autre proposition :
    C'est du code non testé, tu auras donc peut-être du débugage à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub miseàjourVest()
       Dim F1 As Worksheet
       Dim F2 As Worksheet
       Dim Test(4) As Variant
       Dim cell as Range
     
       Set F1 = Sheets("BasedeDonnées")
       Set F2 = Sheets("Casiersafermer")
       Test(1) = F2.Range("F15").Value
       Test(2) = F2.Range("F16").Value
       Test(3) = F2.Range("F17").Value
       Test(4) = F2.Range("F18").Value
     
       Application.ScreenUpdating = False
     
       For Each cell In F1.Range("Q3:Q800")
          Select Case cell.Value
          Case Test(1), Test(2), Test(3), Test(4)
             F1.Cells(cell.Row, 17) = F2.Range("A1")
          End Select
       Next cell
    End Sub
    Il aurait sans doute été plus élégant de faire ça avec un Find.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je te propose une approche sans hardcoding du nombre des valeurs et de leur emplacement. L'utilisation des tableaux structurés suppriment de ton code VBA le nombre de données à chercher ainsi que les adresses des plages et des cellules. Je pars de deux tableaux structurés, Tableau1 qui contient les valeurs à supprimer éventuellement, et Tableau2 qui contient les valeurs de test (celles que l'on recherche dans Tableau1 pour les supprimer).

    L'idée est de boucler sur les valeurs à chercher (les trois valeurs dans le cas que tu évoques) et de les rechercher par Application.Match, en bouclant tant que Match ne renvoie pas d'erreur. Tu délègues ainsi à Excel le fait de rechercher, ce qui est plus rapide en général que deux boucles imbriquées. Ici, j'ai testé avec un tableau de 100000 lignes parmi lesquelles on cherche à supprimer les valeurs se trouvant dans un tableau de 10 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim i As Long
      Dim Index
     
      Application.ScreenUpdating = False
      For i = 1 To Range("tableau2[test]").Count
        Do
          Index = Application.Match(Range("tableau2[test]")(i).Value, Range("tableau1[valeurs]"), 0)
          If Not IsError(Index) Then Range("tableau1[Valeurs]")(Index).Delete
        Loop While Not IsError(Index)
      Next i
    End Sub
    En passant les noms des plages structurées en arguments, tu peux rendre ce processus générique. Note toutefois que la taille des tableaux a ici son importance, et que l'on pourrait optimiser pour de plus grands tableaux, notamment en triant le grand tableau pour accélérer la recherche avec MATCH, par exemple.

    Cela dit, si c'est pour un oneshot, une solution Excel sans vba est très rapide également.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. erreur dans code vba
    Par Renardo dans le forum IHM
    Réponses: 2
    Dernier message: 15/12/2008, 15h35
  2. requete sql dans code vba
    Par kernel57 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/01/2008, 15h30
  3. comment ajouter une condition if dans code VBA
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/12/2007, 00h03
  4. Problème SQL dans code VBA
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 15/05/2007, 13h22
  5. PW perdu dans code VBA sous Excel ?
    Par electrosat03 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2007, 22h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo