Boucle Do While loop qui ne s'arrête pas

RomaneK

XLDnaute Nouveau
Bonjour à tous,

Je viens d'écrire mon code en faisant bien attention de bien renseigner les plages de cellules mais ma boucle do while loop tourne sans arret et n'effectue pas l'instruction alors qu'elle devrait sur 13 lignes (non vides) sur 153. Je ne comprends pas ce que j'ai mal fait, voici le code:
VB:
Sub Bons_click()

Application.ScreenUpdating = False

Dim c As Range
Dim Lkd As String
Dim myrange1 As Range
Dim myrange2 As Range
Dim extract1 As Range
Dim extract2 As Range
Dim n As Integer

With ActiveSheet

    Set myrange1 = Union(Sheets("Mise_en_preparation").Range("T3:T156"), Sheets("Mise_en_preparation").Range("AE3:AE156"))
    Set myrange2 = Union(Sheets("Mise_en_preparation").Range("AP3:AP156"), Sheets("Mise_en_preparation").Range("BA3:BA156"))
    Set extract1 = Union(Sheets("Mise_en_preparation").Range("L2:T156"), Sheets("Mise_en_preparation").Range("W2:AE156"))
    Set extract2 = Union(Sheets("Mise_en_preparation").Range("AH2:AP156"), Sheets("Mise_en_preparation").Range("AS2:BA156"))
   
    For n = 3 To 156
        Do While cells(n, 12) <> ""
            For Each c In myrange1
               
                        If cells(c.Row, myrange1.Column) > "" Then
                            Lkd = cells(c.Row, myrange1.Column).Value
                         Else
                             cells(c.Row, myrange1.Column).Value = Lkd
                            
                        End If
            Next
    Next
End With

End Sub

Sans le do while loop, la macro marche correctement, sauf qu'à partir d'un moment elle copie la dernière ligne non vide sur toutes les cellules vides en dessous, mais ce n'est pas ce que je veux.
 

RomaneK

XLDnaute Nouveau
Ce code permet de récupérer la valeur de la cellule au-dessus dans la colonne T ? Si oui, au bout d'un moment, si dans L3 à L156 la cellule est vide, la cellule de la même ligne en colonne T jusqu'à la ligne 156 doit prendre la valeur FAUX. Désolé il mest difficile de joindre le fichier, mon employeur ne me l'autorisant pas.
 
Dernière édition:

RomaneK

XLDnaute Nouveau
upload_2017-5-19_11-37-58.png

Le problème est surligné, ces cases devraient valoir "FAUX" (le but final et d'utiliser le tri avancé)
 

Dranreb

XLDnaute Barbatruc
Pourquoi ne sont-elles pas vide, plutôt ? Elles me semblent en dehors de la partie utilisée du tableau, et si elle ne sont pas vides elles vont fausser l'évaluation de ActiveSheet.UsedRange pour le 1er problème.
 

RomaneK

XLDnaute Nouveau
La partie utilisée du tableau est variable et elles doivent être soit vide soit "faux" pour l'utilisation du filtre avancé après sauf que si la dernière case est cochée, la dernière valeur qui sera recopié vers le bas est " VRAI" mais je ne voudrais pas que le filtre me copie la partie non utilisée. ^^'
Je ne serai pas disponible cette apres midi et ce weekend, merci de votre aide, je comprends que ce soit difficile à comprendre sans le fichier, mes excuses. Si je trouve la solution, je la posterai immédiatement, merci Dranreb
 

Dranreb

XLDnaute Barbatruc
Alors veillez à ce que ActiveSheet.UsedRange ne couvre que la partie utilisée du tableau. Ou alors trouvez un autre moyen de délimiter la plage à traiter.
Par exemple :
VB:
With ActiveSheet.[T3].Resize(ActiveSheet.[A1000000].End(xlUp).Row - 2)
   .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
   .Value = .Value: End With
 

vgendron

XLDnaute Barbatruc
Hello

J'arrive en cours de route.. mais il me semble qu'il manque quelque chose..voir commentaires dans le code ci dessous
VB:
 For n = 3 To 156 'à priori on va de la ligne 3 à la ligne 156
       Do While cells(n, 12) <> "" 'je ne vois pas le loop / Wend...?
'et tant que la cellule n,12 est nonvide, on fait la boucle for each c in myrange..
'sauf que dans cette boucle. jamais la cellule n,12 ne change.. donc.. si elle était non vide au début.. elle le sera toujours.. d'ou une boucle qui ne se termine jamais...
           For Each c In myrange1 
                      If cells(c.Row, myrange1.Column) > "" Then 'supérieure à vide??  connaissait pas. mais si ca fait ce que je pense, c'est cool, j'apprend un nouveau truc !! :-)
                            Lkd = cells(c.Row, myrange1.Column).Value
                         Else
                             cells(c.Row, myrange1.Column).Value = Lkd
                      End If
           Next c
'manque ici le loop, ou wend, ou until.. ou ..  revoir la boucle..
   Next n
 

RomaneK

XLDnaute Nouveau
Bonjour,
J'ai réussi à contourner la boucle, ce que j'ai pu poster était peut-être voire surement faux, j'avais essayé tellement de combinaisons pour que la boucle tourne et finalement voilà ce que j'ai fait pour la contourner et ça fonctionne (dans une autre macro j'ai attribuer à la dernière ligne (cherché dans la colonne désignation) dans la colonne des cellules liées la valeur "faux". Bref voila le code, si ça peut être utile à quelqu'un ^^
VB:
Sub bon_click()

Application.ScreenUpdating = False

Dim c As Range
Dim Lkd As String
Dim myrange1 As Range

Set myrange1 = Union(Sheets("Mise_en_preparation").Range("T3:T156"), Sheets("Mise_en_preparation").Range("AE3:AE156"))

            For Each c In myrange1
           
                If cells(c.Row, 12) = "" Then
                cells(c.Row, 20).Value = ""
                Else
               
                    If cells(c.Row, 20) <> "" Then
                    Lkd = cells(c.Row, 20).Value
                    Else
                    cells(c.Row, 20).Value = Lkd
                    End If
                   
                End If
               
            Next
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne vois pas en quoi une boucle est contournée dans ce code. Personnellement j'évite autant que possible d'accéder aux cellules dans des boucles, parce que c'est long à exécuter. Soit je passe par des tableaux soit je le fais à l'aide de formules sur l'ensemble de la plage.
 

Dranreb

XLDnaute Barbatruc
Il est presque toujours possible de l'éviter.
Joignez un classeur où vous pensez que c'est inévitable.
En fait c'est inévitable seulement si on a besoin d'accéder à trop d'autres propriétés des cellules que Value. Sinon je ne vois pas ce qui empêche de tout faire sur un tableau VBA en mémoire représentant la totalité de la UsedRange.Value de la feuille.
 
Dernière édition:

Discussions similaires

Réponses
12
Affichages
558

Statistiques des forums

Discussions
312 103
Messages
2 085 312
Membres
102 860
dernier inscrit
fredo67