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
Re : VBA peut-on réduire le nombre de boucle

re,

bof, c'est quand même dommage de
1) pas bien comprendre le pkoi, mais là dessus, y a que toi qui as accès au fichier, donc je peux pas trop t'aider.
2) se passer d'une méthode normalement plus rapide.
 

Arpette

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

Bonsoir Softmama, désolé je n'ai pas eu le temps de construire un jeu représantatif:confused: donc j'envoie la purée:p, mais tu vas reconnaître ton écriture ( si, je l'espère ne pas l'avoir trop massacrée). Tu pourras constater qu'à la première boucle, ta proposition ne peux pas marcher.
Avec la fontion si, cela ne peux pas marcher, mais la boucle ne prend pas beaucoup de temps.
Code:
Set Zone = .Range("C2:C" & .Range("C65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC3&""-""&text(RC25,""000"")" 'Formule en colonne D
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
        a = 2
        Do While .Cells(a, 4) <> ""
        Set r = .Cells(a, 27)
        If r = "C" Or r = "x" Or r = "X" Then
            r.Value = "c"
        End If
        If .Cells(a, 6) = .Cells(a, 7) And r = "c" Then
            .Cells(a, 6) = 0
            .Cells(a, 7) = 0
        End If
        a = a + 1
    Loop
Merci pour ta gentillesse et ta compétance
Le lien
Free - Envoyez vos documents
@+
 

Softmama

XLDnaute Accro
re,

Heu 50Mo, prso à cette heure-ci je dwl pas :p
Mais sinon bien sur qu'on peut virer cette vilaine boucle malgré le SI() ! Ton code du #18 revisité doit donner (à tester) :
Code:
Set Zone = .Range("D2:D" & .Range("D65536").End(xlUp).Row)
        Zone.FormulaR1C1 = "=RC3&""-""&text(RC25,""000"")" 'Formule en colonne D
        Zone. = Zone.Value 'On n'en garde que les valeurs
        Zone.offset(0,250).FormulaR1C1 = "=IF(OR(RC27=""x"",RC27=""X"",RC27=""C""),""c"",RC27)"
        Zone = Zone.offset(0,250).Value
        Zone.offset(0,250).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC6)"
        Zone.offset(0,251).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC7)"
        Zone.Offset(0,3) = Zone.offset(0,250).Value
        Zone.Offset(0,4) = Zone.offset(0,251).Value
        Zone.offset(0,250).ClearContents
        Zone.offset(0,251).ClearContents
 

Arpette

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

Bonjour Softmama, voici l'explication pourquoi ça ne fonctionne pas.
Merci de ton aide
@+
Code:
Set Zone = .Range("C2:C" & .Range("C65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC3&""-""&text(RC25,""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(RC27=""x"",RC27=""X"",RC27=""C""),""c"",RC27)"
        Zone = Zone.Offset(0, 250).Value
        'Ici F174 = 616 et G174 = 616 AA174 = c donc IS174 = 0 IT174 = 0
        Zone.Offset(0, 250).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC6)"
        Zone.Offset(0, 251).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC7)"
        'Ici on reseigne F174 = 0
        Zone.Offset(0, 3) = Zone.Offset(0, 250).Value
        'Mais ici l'égalité n'est plus vrai, F174 = 0 et IT174 = 616 donc G174 = 616 et non  0
        Zone.Offset(0, 4) = Zone.Offset(0, 251).Value
 

Softmama

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

Bjour Arpette,

ha oui, une petite erreur idiote corrigée je pense ici:
VB:
Set Zone = .Range("C2:C" & .Range("C65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC3&""-""&text(RC25,""000"")" 'Formule en colonne D
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value
        Zone.Offset(0, 250).FormulaR1C1 = "=IF(OR(RC27=""x"",RC27=""X"",RC27=""C""),""c"",RC27)"
        Zone = Zone.Offset(0, 250).Value
        Zone.Offset(0, 250).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC6)"
        Zone.Offset(0, 251).FormulaR1C1 = "=IF(AND(RC6=RC7,RC27=""c""),0,RC7)"
        Zone.Offset(0, 250)=Zone.Offset(0, 250).Value
        Zone.Offset(0, 251)=Zone.Offset(0, 251).Value
        Zone.Offset(0, 3) = Zone.Offset(0, 250).Value
        Zone.Offset(0, 4) = Zone.Offset(0, 251).Value
 

Arpette

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

Softmama, c'est encore moi:eek:
je suis arrivé à supprimer quelques boucles, mais là, je tourne en rond.
Merci de ton aide
@+
Code:
'Là pas de problème
        Set Zone = .Range("E2:E" & .Range("E65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC5&""-""&text(RC8,""000"")" 'Formule en colonne F
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
        'Ici je souhiate renseigner la colonne L.
        'si valeur dans colonne W = 0 et
        'si nombre de jour entre aujourd'hui et date en AO > 60 jours
        'valeur en colonne L = 0 sinon valeur en colonne L = valeur de colonne K
        Set Zone = .Range("L2:L" & .Range("L65536").End(xlUp).Row)
        Zone.Offset(0, 250).FormulaR1C1 = "=IF(AND(RC23=0,TODAY()- RC41 > 60),0,RC11)"
        Zone = Zone.Offset(0, 250).Value
        Zone.Offset(0, 250).ClearContents
 

Softmama

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

Re,

Ce que tu as fait m'a tout à fait l'air juste, tu pouvais faire plus simplement comme ceci (sans passer par une colonne intermédiaire) :
Code:
Set Zone = .Range("L2:L" & .Range("L65536").End(xlUp).Row)
        Zone.FormulaR1C1 = "=IF(AND(RC23=0,TODAY()- RC41 > 60),0,RC11)"
        Zone = Zone.Value

Quel problème rencontres-tu ?
 

Arpette

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

Re,
En fait, je me suis pris les pieds dans le tapis, le code doit être celui-ci
Code:
Set Zone = .Range("L2:L" & .Range("L65536").End(xlUp).Row)
        Zone.FormulaR1C1 = "=IF(AND(RC23<>0,TODAY()- RC41 > 60),0,RC11)"
        Zone = Zone.Value
Par contre, il me renvoi qu'une valeur en L2 et #VALEUR!en L1.
A noter que la colonne L est vide au départ.
Merci de ton aide
@+
 

Softmama

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

Re,

Normal ! Le
Code:
.Range("L2:L" & .Range("L65536").End(xlUp).Row)

pointe sur une colonne vide et donc renvoie la plage L2:L1. Change la ligne en :
Code:
.Range("K2:K" & .Range("K65536").End(xlUp).Row)
si la ligne K n'est pas vide.
 
Dernière édition:

Arpette

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

Re,
Oui Softmama, ça j'avais compris, mais le résultat je le veux en L et si je pointe sur une autre colonne ça me renvoi le résultat dans cette colonne. J'ai fait comme ceci:
Code:
Set Zone1 = .Range("F2:F" & .Range("F65536").End(xlUp).Row)
        Zone = .Range("L2:L" & .Range("L65536").End(xlUp).Row)
        Zone.FormulaR1C1 = "=IF(AND(RC23<>0,TODAY()- RC41 > 60),0,RC11)"
        Zone = Zone.Value
Merci de ton aide
@+
 

Softmama

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

Re,

Mais non : comme ceci enfin :
Code:
.Range("K2:K" & .Range("K65536").End(xlUp).Row)
Zone.Offset(0,1).FormulaR1C1 = "=IF(AND(RC23<>0,TODAY()- RC41 > 60),0,RC11)"
        Zone.Offset(0,1) = Zone.Offset(0,1).Value
 

Arpette

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

Re,
ça renvoi le résultat en E. Zone = Set E au dessus.
@+
Code:
Set Zone = .Range("E2:E" & .Range("E65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=RC5&""-""&text(RC8,""000"")" 'Formule en colonne F
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value 'On n'en garde que les valeurs
        
        .Range ("K2:K" & .Range("K65536").End(xlUp).Row)
        Zone.Offset(0, 1).FormulaR1C1 = "=IF(AND(RC23<>0,TODAY()- RC41 > 60),0,RC11)"
        Zone.Offset(0, 1) = Zone.Offset(0, 1).Value
 

Discussions similaires

Réponses
4
Affichages
175

Statistiques des forums

Discussions
312 310
Messages
2 087 110
Membres
103 472
dernier inscrit
garnoux57