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 :

[VBA/Excel] Boucler sur les colonnes


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut [VBA/Excel] Boucler sur les colonnes
    Bonjour j'ai une macro qui me permet
    de récapituler des valeurs calculées sur une première feuille en supprimant les lignes vides.

    Cette macro effectue un test sur 500 lignes des 9 premières colonnes.

    ce que j'aimerai faire c'est qu'une fois le test effectué sur les 500 lignes des 9 premières colonnes (donc que ma boucle est terminée) ; il s'effectue de nouveau mais cette fois ci sur les colonnes 11 à 19...puis de 21 à 29...puis de 31 à 39 et ainsi de suite en décalant à chaque fois le test de 10 colonnes

    Voila le code source que j'utilise :
    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
     
    sub recap()
    dim i as integer
    dim compteur as integer
    dim test as variant
     
    test = ""
    compteur = 5 
     
    for i = 6 to 500 
    test = worksheets("feuil1").cells(i,1).value
    if test <> "" then
    compteur = compteur + 1
    worksheets("récap").cells(compteur,1).value = worksheets("feuil1").cells(i,1).value 
    worksheets("récap").cells(compteur,2).value = worksheets("feuil1").cells(i,2).value 
    worksheets("récap").cells(compteur,3).value = worksheets("feuil1").cells(i,3).value
    worksheets("récap").cells(compteur,4).value = worksheets("feuil1").cells(i,4).value
    worksheets("récap").cells(compteur,5).value = worksheets("feuil1").cells(i,5).value
    worksheets("récap").cells(compteur,6).value = worksheets("feuil1").cells(i,6).value 
    worksheets("récap").cells(compteur,7).value = worksheets("feuil1").cells(i,7).value 
    worksheets("récap").cells(compteur,8).value = worksheets("feuil1").cells(i,8).value 
    worksheets("récap").cells(compteur,9).value = worksheets("feuil1").cells(i,9).value
     
    end if 
    next i 
     
    end sub
    j'ai essayé quelque petit truc sans grande réussite,
    un petit conseil et coup de main me serai fort utile pour pouvoir terminer ma macro. Merci à quiconque prendra le temps de se pencher sur mon problème
    sincère salutations,

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Tu peux toujours essayer ceci :
    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
     
    sub recap()
     
    dim i as integer
    dim j as integer
    dim indice as integer
    dim compteur as integer
    dim test as variant
     
    	test = ""
    	compteur = 5
    	indice = 0
     
    		for j = 1 to nb_de_fois_que_tu_souhaite_le_faire 
      			for i = 6 to 500 
      			test = worksheets("feuil1").cells(i,1 + ( indice * 10 )).value
        				if test <> "" then
    					compteur = compteur + 1
    					worksheets("récap").cells(compteur,1 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,1).value 
    					worksheets("récap").cells(compteur,2 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,2).value 
    					worksheets("récap").cells(compteur,3 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,3).value
    					worksheets("récap").cells(compteur,4 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,4).value
    					worksheets("récap").cells(compteur,5 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,5).value
    					worksheets("récap").cells(compteur,6 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,6).value 
    					worksheets("récap").cells(compteur,7 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,7).value 
    					worksheets("récap").cells(compteur,8 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,8).value 
    					worksheets("récap").cells(compteur,9 + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,9).value
    				end if 
    			next i
    		indice = indice + 1
    		next j
     
    end sub
    mais je ne te promet rien !
    Tiens moi au courant.
    Bon courage !!!

  3. #3
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Bonjour,

    Bon déjà en rajoutant une boucle de plus on gagne en clarté (dis moi si ça marche), et du coup si tu veux tu changes la valeur max de j en le nombre de colonnes que tu veux (sauf si tu tiens à le faire 10 par 10)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For i = 6 To 500
        test = Worksheets("feuil1").Cells(i, 1).Value
        If test <> "" Then
            compteur = compteur + 1
            For j = 1 To 9
                Worksheets("récap").Cells(compteur, j).Value = Worksheets("feuil1").Cells(i, j).Value
            Next
        End If
    Next
    Cwain

    Argh trop tard !

  4. #4
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Bon, vu que je m'étais arrêté en chemin, je poursuis l'effort, voilà ce que je trouve (sans tester)
    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
    Dim NombreDeFoisQueTuVeux As Integer
    NombreDeFoisQueTuVeux = 5
     
    For k = 1 To NombreDeFoisQueTuVeux
        For i = 6 To 500
            test = Worksheets("feuil1").Cells(i, 1).Value
            If test <> "" Then
                compteur = compteur + 1
                For j = 1 To 9
                    Worksheets("récap").Cells(compteur, j + (k - 1) * 10).Value _
                        = Worksheets("feuil1").Cells(i, j + (k - 1) * 10).Value
                Next
            End If
        Next
    Next

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Merci à vous deux en compilant les informations ma source devient :


    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
    sub recap()
    dim h as integer
    dim i as integer
    dim j as integer
    dim indice as integer
    dim compteur as integer
    dim test as variant
     
    	test = ""
    	compteur = 5
    	indice = 0
     
    for j = 1 to 24 
    for i = 6 to 500 
    test = worksheets("feuil1").cells(i,1 + ( indice * 10 )).value
    if test <> "" then
    compteur = compteur + 1
    worksheets("récap").cells(compteur,h + ( indice * 10 ) ).value = worksheets("feuil1").cells(i,h + ( indice * 10 ) ).value 
    next h
    end if
     
    indice = indice + 1
    compteur = 5 'pour que toutes les plages recopiées commence à la ligne 6
    next j
     
    end sub
    mais les calculs engendré par cette macro sont assez long, qques minutes de reflexion pour excel.....mais bon ca marche
    merci bcp

  6. #6
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Résolu alors ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    tu parcours quand même environ 12000 cellules + le traitement de copie de l'une vers l'autre ==> normal que çà coit un peu long

    Si tu veux optimiser ton code, faudrait l'empecherde boucler pour rien
    Par exemple, si dans tes 500 lignes, il n 'y a que les 150 premières qui sont renseignés, faudrait sortir de ta boucle si tu déctectes que la cellule est vide

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    ce qu'il y a c'est qu'il peut y avoir quelque ligne vide et a nouveau quelque ligne remplies...etc etc....donc je pense pas que cela soit possible de sortir de la boucle...

    a moins que je ne me trompe je pense que mon problème est résolu, meme si un peu lent

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    effectivement si des lignes vides peuvent venir d'intercaler tu ne peux rien faire pour optimiser ta boucle

  10. #10
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Si tu as une colonne qui est remplie si et seulement si la ligne est à traiter, on peut imaginer un premier test qui part de ta ligne du bas (ligne 500), vers le haut pour trouver la dernière ligne remplie, avec une commande dans ce style, en admettant que la colonne "test" soit la première
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim DerniereLigne as Integer
    DerniereLigne = Range("A500").End(xlUp).Row
    pour trouver le n° de la dernière ligne). Ensuite tu lance ta boucle de la ligne 1 à ta dernière ligne réelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 6 to DerniereLigne
    (bon ok, si c'est 495, tu n'as peut-être pas avantage à modifier ton code )
    ou encore plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i= 6 to Range("A500").End(xlUp).Row

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    je sais pas si cela peut fonctionner correctement car je travail par plage de cellule et pas par ligne entière.

    par exemple la ligne 12 de ma première plage (colonne 1 à 9) peut etre remplie tandis que la ligne 12 de ma plage numéro deux (colonne 11 à 19) peut etre vide et ainsi de suite...

    je me tate à créer 24 boutons pour lancer la macro associée à chaque plage (24) a traiter plutot que de créer une seule et unique macro qui traite toutes les plages d'un seul coup...

    quel est votre avis la dessus ?

  12. #12
    Membre habitué Avatar de cwain
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 218
    Points : 181
    Points
    181
    Par défaut
    Bon déjà pour la solution 24 boutons, je vote pas pour
    Je ferais perso une petite userform (accessible par un seul bouton) ou je peux sélectionner sur quelles colonnes je veux lancer le traitement. Après, comment, à toi de voir, je pense que je prendrai une listbox

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    arg... lol je suis encore trop novice en vba pour ca du moins je crois...
    je me suis pas encore penché sur les menu déroulant
    et puis de toute manières meme si je fais une liste déroulante j'aurai tjs mes 24 sources a recopier non ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    Non
    le source resterait le même sauf que tu n'aurais plus une boucle de 1 à 24

    Ton source serait une simple copie de plage vers une autre, j qui était l'indice d'incrémetantion deviendrait un paramètre

    En fonction du hcoix de la liste déroulante, j pourrait être égal à 1, 2 3 ou .....24

    Ainsi; les traitement seraient instantané car tu travaillerais uniquement sur ce que tu as modifié

    Tu peux aussi imaginé un choix qui mettrait à jour les 24
    Le principe est le même sauf que la fonction paramètre n'aurait plus un seul parametre mais 2 (la borne min et la borne max)

    ==> si tu fais le choix des 24 ==> parametre1 = 1 et parametre2 = 24
    ==> si tu fais le choix du 4 uniquement =+> parametre1 = 4 et parametre2 = 4

    En faisant ainsi, ot,n code ne bouge absolument pas si ce n'est cette ligne :
    for j = 1 to 24 qui devient for j = parametre1 to parametre2

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    je visualise bien tout ce que tu veut me dire
    maintenant reste juste a trouver comme faire cette liste déroulante
    je m'y suis encore jamais penché....

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 103
    Points : 98
    Points
    98
    Par défaut
    Il n'est pas plus rapide de faire un filtre des lignes vides et après coller directement range dans le variant?

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 103
    Points : 98
    Points
    98
    Par défaut
    J'ai un bout de code comme ça pour éliminer les doublons, ça peut peut-être te servir


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        'elimination des doublons
        Sheets("FOREX").Select
        Cells.Select
        Selection.Sort Key1:=Range("A2"), Order1:=xlDescending, Key2:=Range("B2") _
            , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
     
        For i = Range("A1").End(xlDown).Row To 3 Step -1
            If Cells(i, 1).Value = Cells(i - 1, 1).Value And Cells(i, 2).Value = Cells(i - 1, 2).Value Then
                Rows(i & ":" & i).Select
                Selection.Delete Shift:=xlUp
            End If
        Next i

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 553
    Points : 566
    Points
    566
    Par défaut
    si t uveux aps faire de liste déroulante, tu te conscares une cellule dans laquelle tu mets manuellement1 ou 2 ou 3 ou ............. ou 24
    A cote de cette cellule, tu mets un petit bouton qui va lancer ta macro
    Ta macro regarderas ce 'qu'il y a dans la cellule pour parametrer ta boucle (qui au final n'en ser plus une)

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 43
    Points : 22
    Points
    22
    Par défaut


    effectivement suffisait d'y penser
    j'ai testé,
    les deux petites cases à remplir me permettent de modifier la macro sans avoir à la recopier 24 fois....

    ca marche bien et c bcp plus rapide faire plage par plage que les 24 d'un coup merci pour l'aide.

    a+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA Excel] documentation sur les classes Excel
    Par Ragmaxone dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/07/2008, 17h08
  2. [VBA/Excel]recherche sur 2 colonnes
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2007, 17h35
  3. [VBA-E] boucler sur une colonne
    Par ricoree78 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 14/02/2007, 20h04
  4. [VBA-Excel] Question sur les Treeview
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/12/2006, 16h21
  5. [Sources][FAQ VBA Excel] Informations sur les applications
    Par SilkyRoad dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/10/2006, 18h38

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