VBA peut-on réduire le nombre de boucle

Arpette

XLDnaute Impliqué
Bonsoir à toutes et à tous,
j'aimerais savoir si il est possible de réduire le nombre de boucle dans ma macro. Je poste que la partie qui prend du temps.
Merci de votre aide
@+

Code:
With Worksheets("Feuil1")
Set c = .Range("D2")
            Do While c.Offset(0, -1) <> ""
                c = c(1, 0) & "-" & Format(c(1, 23), "000")
                Set c = c.Offset(1, 0)
            Loop
        
        Set c = .Range("D2")
            Do While c.Offset(0, 0) <> ""
                If c(1, 25) = "C" Or c(1, 25) = "x" Or c(1, 25) = "X" Then
                    c(1, 25) = "c"
                End If
                Set c = c.Offset(1, 0)
            Loop
            
        Set c = .Range("D2")
            Do While c.Offset(0, 0) <> ""
                If c(1, 3) = c(1, 4) And c(1, 25) = "c" Then
                    c(1, 3) = 0
                    c(1, 4) = 0
                End If
                Set c = c.Offset(1, 0)
            Loop
End With
 

Softmama

XLDnaute Accro
Bonjour Arpette,

Tu peux tester :
VB:
With Worksheets("Feuil1")
    If .Range("C3") <> "" then set c=.range("C2").End(xldown)(2,1) else set c= .Range("C3")
    c(1,2) = c & "-" & Format(c(1, 24), "000")
    If .Range("D3") <> "" then set c=.range("D2").End(xldown)(2,1) else set c=.Range("D3")   
    If c(1, 25) = "C" Or c(1, 25) = "x" Or c(1, 25) = "X" Then c(1, 25) = "c"
    If c(1, 3) = c(1, 4) And c(1, 25) = "c" Then
        c(1, 3) = 0
        c(1, 4) = 0
    End If
End With

Mais bon, à tester, pque là je l'ai pas fait. Du coup, y a pas de boucle, le résultat est immédiat.
 
Dernière édition:

kjin

XLDnaute Barbatruc
Re : Re: VBA peut-on réduire le nombre de boucle

Bonsoir,
:confused: !
Code:
With Worksheets("Feuil1")
    i = 2
    Do While .Cells(i, 3) <> ""
        .Cells(i, 4) = .Cells(i, 3) & "-" & Format(.Cells(i, 26), "000")
        Set r = .Cells(i, 28)
        If r = "C" Or r = "x" Or r = "X" Then
            r.Value = "c"
        End If
        If .Cells(i, 6) = .Cells(i, 7) And r = "c" Then
            .Cells(i, 6) = 0
            .Cells(i, 7) = 0
        End If
        i = i + 1
    Loop
End With
A+
kjin
 

Softmama

XLDnaute Accro
Re : VBA peut-on réduire le nombre de boucle

Re Arpette et kjin,

La solution que je t'ai proposée, n'en était pas une... J'étais carrément à côté de la demande et je m'en suis rendu compte à posteriori. Toutes mes excuses pour cela : le temps que tu as du perdre pour faire les tests dessus a été gâché. Cependant, je continue de considérer qu'il existe une méthode ô combien plus rapide que toutes ces boucles imbriquées sur probablement des milliers de lignes.
La proposition de kjin, certes plus concise, continue d'utiliser des boucles, là où je pense que cela n'est pas utile. Je te propose de globaliser des formules, ce qui devrait au final apporter un gain de temps appréciable.
Je retente une approche de ce que j'ai compris de ton code, mais si j'étais encore une fois à côté de la plaque, je trouverais utile que tu nous joignes un morceau de fichier avec les 30 premières colonnes sur 10 lignes, afin que je comprenne mieux sur quelles cellules on se décale.
Voici donc mon approche :
VB:
Sub test()
Dim Zone As Range
With Worksheets("Feuil1")
Set Zone = Range("C2:C" & Range("C65536").End(xlUp).Row)
    Zone.Offset(0, 1).FormulaR1C1 = "=RC3&""-""&text(RC26,""000"")" 'Formule en colonne D
    Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
    Zone.Offset(0, 250).FormulaR1C1 = "=IF(OR(RC28=""x"",RC28=""X"",RC28=""C""),""c"",RC28)" 'Formule en colonne 252 (si c, x ou X en colonne 28 alors c, sinon colonne 28)
    Zone.Offset(0, 25) = Zone.Offset(0, 250).Value 'La colonne 28 (AC) n'en garde que les valeurs
    Zone.Offset(0, 250).FormulaR1C1 = "=IF(AND(RC5=RC6,RC28=""c""),"""",RC5)" 'Formule en colonne 252(si(colonneE=colonneF ET Colonne 28 = c) alors Vide sinon Contenu de la colonne 5
    Zone.Offset(0, 251).FormulaR1C1 = "=IF(AND(RC5=RC6,RC28=""c""),"""",RC6)" 'Formule en colonne 253(si(colonneE=colonneF ET Colonne 28 = c) alors Vide sinon Contenu de la colonne 6
    Zone.Offset(0, 2) = Zone.Offset(0, 250).Value 'Colonne E prend valeur colonne 252
    Zone.Offset(0, 3) = Zone.Offset(0, 251).Value 'Colonne F prend valeur colonne 253
    Zone.Offset(0, 250) = "" 'Effaçage des colonnes 252 et 253
    Zone.Offset(0, 251) = ""
End With
End Sub

Ainsi, il n'y pas de boucle, juste des colonnes qui prennent des formules et des valeurs, ce qui est archi rapide comparé à des scans de colonnes par VBA.
 

Arpette

XLDnaute Impliqué
Re : VBA peut-on réduire le nombre de boucle

Bonjour Softmama, ne t'inquiètes pas, j'avais vu que tu n'avais pas compris mais la solution de kjin me convenait. Par contre la solution que me propose est archi rapide et répond à mon besoin, je l'ai donc mise en application. Je vais regarder si je peux encore améliorer la totalité de ma macro.
Merci encore.
@+
 

Arpette

XLDnaute Impliqué
Re : VBA peut-on réduire le nombre de boucle

Bonjour Softmama, ne t'inquiètes pas, j'avais vu que tu n'avais pas compris mais la solution de kjin me convenait. Par contre la solution que me propose est archi rapide et répond à mon besoin, je l'ai donc mise en application. Je vais regarder si je peux encore améliorer la totalité de ma macro.
Merci encore.
@+
Bonsoir Softmama, j'ai adapté le code à une autre partie de ma macro. J'y suis parvenu pour la partie concaténation, mais je n'y arrive pas avec la boucle If. Merci de ton aide.
@+

Code:
With Sheets("5-17")
      'Supprime toutes les lignes dont les cellules de E ne commence pas par M
   If Not AutoFilterMode Then AutoFilterMode = True
        .[E1].AutoFilter 5, "<>M*"
        Set d = .Range("_FilterDataBase")
        d.Offset(1, 0).Resize(d.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
        .ShowAllData
        'Concatène E et "-" et H
        Set Zone = .Range("E2:E" & Range("E65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC5&""-""&text(RC8,""000"")" 'Formule en colonne E
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
       [COLOR="red"]'C'est ici que ça coince[/COLOR]

        Set l = .Range("L2")
        Do While d.Offset(0, -1) <> ""
            If d(1, 18) <> 0 Then
                l = 0
                Else
                l = d(1, 6)
            End If
        Set l = l.Offset(1, 0)
        Loop
End With
 
Dernière édition:

Softmama

XLDnaute Accro
Re : VBA peut-on réduire le nombre de boucle

Bonsoir Arpette,

Donc, si comme je pense le comprendre, tu cherches dans la 2ème partie de ta macro, à mettre des 0 dans la colonne L si la colonne R n'est pas égale à 0 et à y mettre la valeur de la colonne F sinon, tu dois pouvoir faire comme ceci :
(Place ces 3 lignes à la place de ce qu'il y a en dessous de 'C'est ici que ça coince)
Code:
Set Zone = .Range("L2:L" & .Range("L2").End(xlDown).Row)
Zone.FormulaR1C1 = "=IF(RC18<>0,0,RC6)"
Zone = Zone.Value
 

Arpette

XLDnaute Impliqué
Re : VBA peut-on réduire le nombre de boucle

Bonsoir Sofmama, oui c'est bon, juste d(1,6) = RC11. Par contre quand lance pas à pas, pour la concaténation si je suis sur la feuille (5-17) et que je concatène la feuille
(5-9-12) dans le premier code que tu m'as donné, la macro s'arrête à la dernière ligne de la feuille (5-17). On dirait que le With n'est pas pris en compte, j'ai pourtant rajouté un point devant Range
Code:
Set Zone = .Range("C2:C" & Range("C65536").End(xlUp).Row)
Peut-être il en manque d'autres
Merci de ton aide
@+
 

Arpette

XLDnaute Impliqué
Re : VBA peut-on réduire le nombre de boucle

Bonsoir Softmama, j'ai ajouté une condition à la fonction IF, mais elle ne s'arrête pas si RC(6) est vide et me renvoi 0 jusqu'à la 65536 ligne. Le premier Set fonctionne bien. Comprend pas:confused:
Merci de ton aide.
@+
Code:
        Set Zone = .Range("E2:E" & .Range("E65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC5&""-""&text(RC8,""000"")" 'Formule en colonne E
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
        Set Zone = .Range("L2:L" & .Range("L2").End(xlDown).Row)
        Zone.FormulaR1C1 = "=IF(AND(RC6 <> """",RC23 <> 0),0,RC11)"
        Zone = Zone.Value
 

Softmama

XLDnaute Accro
Re : VBA peut-on réduire le nombre de boucle

Bonjour Arpette,

à priori, je pense que le pb provient de cette ligne là :
Code:
Set Zone = .Range("L2:L" & .Range("L2").End(xlDown).Row)
Place un
Code:
msgbox Zone.address
juste après ; si il t'affiche
Code:
$L$2:$L$65536
c'est que y a un souci : ou bien toutes les cellules de la colonne L sont vides après L2, ou bien elles sont toutes remplies ! Je vois que ça...
Essaie au pire de placer plutôt :
Code:
Set Zone = .Range("L2:L" & .Range("L65536").End(xlUp).Row)
à la place à ce moment.
 

Arpette

XLDnaute Impliqué
Re : VBA peut-on réduire le nombre de boucle

Bonsoir Softmama, oui toutes les cellules sont vides après L2, mais le msgbox m'affiche
Code:
$L$2:$L$13264
Je vais resté sur une boucle pour cette partie comme ceci, c'est quazi instantané.
Code:
Set d = .Range("F2")
        Set l = .Range("L2")
        Do While d.Offset(0, -1) <> ""
             If d(1, 18) <> 0 Then
                    l = 0
                    Else
                    l = d(1, 6)
                End If
            Set d = d.Offset(1, 0)
            Set l = l.Offset(1, 0)
        Loop
Merci
@+
 

Discussions similaires

Réponses
4
Affichages
166

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa