Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA peut-on réduire le nombre de boucle

  • Initiateur de la discussion Initiateur de la discussion Arpette
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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.
 
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😕 donc j'envoie la purée😛, 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
@+
 
re,

Heu 50Mo, prso à cette heure-ci je dwl pas 😛
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
 
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
 
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
 
Re : Re: Re : Re: VBA peut-on réduire le nombre de boucle

Softmama, c'est encore moi😱
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
 
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 ?
 
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
@+
 
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:
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
@+
 
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
 
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
 
Re,

Heu oui, suis allé un peu vite ds le copier/coller, dsl : Remplace le post #28 par
Code:
Set Zone = .Range("K2:K" & .Range("K65536").End(xlUp).Row).offset(0,1)
Zone.FormulaR1C1 = "=IF(AND(RC23<>0,TODAY()- RC41 > 60),0,RC11)"
        Zone = Zone.Value
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
700
Réponses
4
Affichages
577
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…