Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[VBA Excel] Problème de rapidité boucle for

saian-sugus, le mercredi 24 septembre 2008 à 08:55:53
Bonjour,

J'ai créé ma boucle, mais elle dure beaucoup trop longtemps. C'est pourquoi je viens vous demander si vous voyez comment "raccourcir" le processus....

Petite explication :
Je travaille dans une table qui contient les données a (numéro de personne), b (chiffre)
Une table parallèle contient les donnée a (numéro de personne) et c (chiffre)

Pour chaque variable a, il existe plusieurs variables c. (table1)
Exemple:

col.a col.b
123 1
123 2
123 3
123 4
123 5

Et pour chaque variable a, il existe une variable b. (table2)
Exemple:
col.a col.b
123 5

Je veux que mon programme vérifie si la variable b est contenu dans les variables c pour la même variable a et me rajoute une valeur fixe "(2x)" à un endroit particulier...

Mon code marche très bien mais il met une éternité (et c'est peu dire) en sachant qu'il y a environ 25'000 lignes dans la table1 et 4000 dans la table2.

Pour améliorations, j'ai pensé à mettre un filtre qui me sort la variable c et ensuite avoir 20 lignes à tester à la place de 25'000, mais je me souviens avoir eu un problème avec les boucles for qui prennent même les lignes filtrées...

Ou alors allez directement à un ID sans devoir passer par toutes les lignes, mais je ne sais pas si c'est possible...

Avez-vous des idées ?

Mon code : 

        Worksheets(ClasseName).Activate
        Module = Cells(5, 6)
        Nb_Lignes6 = Range("A65536").End(xlUp).Row
        For f = 10 To Nb_Lignes6
            Worksheets(ClasseName).Activate
            ID = Cells(f, 7)
            For g = 2 To Nb_Lignes7
                Range("A" & g).Select
                Sheets("suivis").Activate
                If Cells(g, 1).Value = ID Then
                    If Cells(g, 2).Value = Module Then
                        Worksheets(ClasseName).Activate
                        Cel = Cells(f, 4).Value
                        If Cel = "" Then
                            Cells(f, 4) = "(2x)"
                        Else
                            Cells(f, 4) = Cel & " (2x)"
                        End If
                    End If
                End If
            Next g
        Next f
Configuration: Windows XP
Firefox 2.0.0.14
Répondre à saian-sugus  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wilfried_42, le mercredi 24 septembre 2008 à 09:15:54
bonjour

deja en supprimant les Activate et select ca devrait aller plus vite, mais le mieux est tout de meme un filtre

        With Worksheets(ClasseName)
        Module = Cells(5, 6)
        Nb_Lignes6 = .Range("A65536").End(xlUp).Row
        For f = 10 To Nb_Lignes6
            ID = .Cells(f, 7)
            For g = 2 To Nb_Lignes7
                Sheets("suivis").Activate
                If Sheets("suivis").Cells(g, 1).Value = ID Then
                    If Sheets("suivis").Cells(g, 2).Value = Module Then
                        Cel = .Cells(f, 4).Value
                        If Cel = "" Then
                            .Cells(f, 4) = "(2x)"
                        Else
                            .Cells(f, 4) = Cel & " (2x)"
                        End If
                    End If
                End If
            Next g
        Next f
        end with


pour utiliser les lignes d'un filtre il est preferable de travailler sur un objet range

dim maplage as range
dim cel as range
sheets("Suivi").range("A1").filtered Field:=1 criteria1:=Sheets(Codename).cells(5,6).value
set maplage = sheets("Suivi").range("A1:A" & sheets("Suivi").range("A65536").end(xlup).row).cells.specialcells(Xlcelltypevisible)
for each cel in maplage
     if cel.offset(0,4) = "truc" then
     end if
next


procedure ecrite à main levée, non testée
Cordialement
Wilfried
Répondre à wilfried_42

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
saian-sugus, le mercredi 24 septembre 2008 à 14:47:35
J'ai modifié quelque peu, mais le filtre donne juste.

Je me retrouve donc avec un filtre qui marche, mais comment reprendre les valeurs sorties du filtres... avec une boucle for du type

for a=2 to nb_lignes
next a

les nb_lignes vient le nombre total et non le nombre de lignes affichées...

Y a-t'il une possibilité de trouver le nombre de lignes affichées ?

Egalement y a-t'il une possibilité de créer une boucle sur les lignes affichées?

Mon code actuel:
        Sheets("suivis").Activate
        Nb_Lignes7=Range("A65536").End(xlUp).Row
        With Worksheets(ClasseName)
        Module = .Cells(5, 6)
        Sheets("suivis").Activate
        Range("A1", "D1").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$D$" & Nb_Lignes7).AutoFilter Field:=2, Criteria1:=Module
        Nb_Lignes6 = .Range("A65536").End(xlUp).Row
        For f = 10 To Nb_Lignes6
            ID = .Cells(f, 7)
            Worksheets("suivis").Activate
            Nb_Lignes7 = Range("A65536").End(xlUp).Row
            For g = 2 To Nb_Lignes7
            Sheets("suivis").Activate
                If Sheets("suivis").Cells(g, 1).Value = ID Then
                    If Sheets("suivis").Cells(g, 2).Value = Module Then
                        cel = .Cells(f, 4).Value
                        If cel = "" Then
                            .Cells(f, 4) = "(2x)"
                        Else
                            .Cells(f, 4) = cel & " (2x)"
                        End If
                    End If
                End If
            Next g
        Next f
        Sheets("suivis").Activate
        Range("A1", "D1").Select
        Selection.AutoFilter
        End With


Merci d'avance d'éclairer ma méconnaissance :s
Répondre à saian-sugus

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wilfried_42, le mercredi 24 septembre 2008 à 18:15:42
re:

regarde ma procedure, je t'ai dit qu'il ne fallait pas travailler sur les lignes, car meme si elles sont masquées, elles sont toujours là et ca risque de poser des problemes
pour travailler sur les filtres il faut travailler sur les cellules
1 recuperer uniquement les lignes qui restent visibles, mais on ne va recuperer qu'une seule colonne à toi de choisir

set maplage = sheets("Suivi").range("A1:A" &  _
     sheets("Suivi").range("A65536").end(xlup).row).cells.specialcells(Xlcelltypevisible)

avec cette ligne je cree une plage "maplage" des cellules visible de la colonne A

ensuite je travail avec une boucle sur cellule en gerant encore une fois un objet cellule
For eac cel in maplage
cel prend donc la place de la premiere cellule et evoluera au next cel est un objet Range ce qui implique que je puex l'utiliser des ces facons :
If cel.value = "Taratata" then Cel.offset(0,4) = "Tutifruti"
si la valeur de cel = taratata alors comme cel = cellule de la colonne a : mise à jour d'un offset(0,4) soiit colonne D

ensuite je boucle avec next
Cordialement
Wilfried
Répondre à wilfried_42

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 eriiic, le mercredi 24 septembre 2008 à 20:20:15
Bonsoir,

Sinon le plus rapide (enfin peut-être pas là puisque tu es passé à 25 lignes mais ça te servira pê plus tard) c'est de travailler en mémoire et non pas sur les feuilles.
Le plus simple est de nommer la(les) plage(s) où sont les données pour pouvoir la modifier sans modifier le code vba puis :
dim datas 'pas de () et le laisser variant
datas=range("maplage")
et travailler de datas(1,1) à datas(nblignes,nbcolonnes)
et s'il faut tout mettre à jour à la fin :
range("ou tu veux mais la bonne taille") = datas
Si c'est une mise à jour partielle se remplir un tableau de la bonne dimension et même technique.

Là la gain est plus près de 100 que de 10. Considérable !!!
eric
Répondre à eriiic
Probleme boucle for macro excel (Résolu) bonjour à tous j'ai un souci pour une macro excel je dois faire une tache répétitive: recopier et coller 12 fois le contenu d'un tableau croisé dynamique sur chaque fois une feuille de calcul différentes j ai donc pensé à une boucle for mais... www.commentcamarche.net/forum/affich-3432897-probleme-boucle-for-macro-excel
VBA excel formulaire de saisie - aide (Résolu) Bonjour, je suis débutant en VBA excel, et j'ai construis un formulaire de saisie (userform). Malheureusement je n'arrive pas à le finaliser... il me manque : a/ le numéro de transaction (TRANID) ne change pas lorsque j'appuie sur OK... www.commentcamarche.net/forum/affich-6740657-vba-excel-formulaire-de-saisie-aide
[VBA / Excel] Textbox --> Integer (Résolu) Bonjour, je fais un programme sous VBA EXCEL (office 2003) pour mon entreprise pour récupérer des longeurs (en mm). Comme ces longueurs sont toujours sous formes d'entiers, j'ai crée une variable qui me permet de récupérer ces nombres en... www.commentcamarche.net/forum/affich-8801568-vba-excel-textbox-integer
Eviter les doublons dans ExcelEviter les doublons lors d'un encodage dans un colonne de feuille excel: prendre le format conditionnel sur le première cellule sous les titres (par ex A2) choisir la formule suivante : =NB.SI($A$2:$A$21;A2)>1 mettre là la couleur de fond... www.commentcamarche.net/faq/sujet-1258-eviter-les-doublons-dans-excel
Comment lire un fichier ligne par ligneComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier... www.commentcamarche.net/faq/sujet-5027-comment-lire-un-fichier-ligne-par-ligne
[VBA] Boucle for (Résolu)SALUT LES COPAINNNS hmm.. (soyons sérieux un moment !!) ^^ Voila j'ai une macro qui utilise une boucle FOR; MON probléme est je voudrai appliquer la boucle FOR non pas sur toutes les cellules d'une colonne mais sur=> UNE colonne avec un... www.commentcamarche.net/forum/affich-6344282-vba-boucle-for
Boucle For "Visual basic" avec le step (Résolu)Bonjour, J'aimerai a partir d'une colonne de chiffre la collée dans une autre colonne mais avec la boucle for et donc utiliser la fonction step, Quelqu'un pourrai m'aider?? bonne journée www.commentcamarche.net/forum/affich-6428619-boucle-for-visual-basic-avec-le-step
Variable dans une boucle for!!! (Résolu)Bonjour, J'aimerais savoir comment faire pour initialiser un groupe de variable (d11 à d19) en faisant une boucle for. Ça devrait ressembler à ça mais ça ne fonctionne pas for i = 1 to 9 step 1 d1 & i = NULL next i J'espère avoir de vos... www.commentcamarche.net/forum/affich-1709134-variable-dans-une-boucle-for