Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

fonction do While loop


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    fonction do While loop
    Bonsoir à tous
    j'ai un petit problème et je n'arrive pas à le résoudre. Voici mon code :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Macro1()
     
    ' Macro1 Macro
    '
    'Sub tant_que()
    Range(A1).Select
     Do While ActiveCell.Offset(-1, 0) <> 10
     ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1
     * ActiveCell.Offset(1, 0).Selct
     
    End Sub

  2. #2
    Membre expert
    Bonjour,

    Vous sélectionnez la cellule A1 en première ligne de votre code, puis vous demandez à tester si la cellule de la ligne au-dessus de la ligne 1 est <> de 10, ce qui génère forcément une erreur. Il faudrait commencer à la ligne 2.

    Mais si vous expliquiez le but recherché, votre code pourrait être écrit autrement.

    Cdlt

  3. #3
    Responsable
    Office & Excel

    Salut.
    • Comme souvent, pas besoin de vba au départ. Ajouter 1 à la valeur de la cellule précédente est l'affaire d'Excel.
    • En VBA, on évite les SELECT.
    • Si on utilise une boucle, on la ferme (la boucle) avec un Loop.
    • Si A1 est plus grand que 10 au départ de la macro, tu va remplir toute la colonne A (1048576 lignes) puis planter => toujours veiller à placer une condition de sortie qui sera VRAI à un moment donné



    Ca ressemble fort à un exercice, car je ne vois pas la finalité de la chose. En modifiant l'opérateur de comparaison, tu pourrais utiliser ceci, sans aucun SELECT

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
      Dim r As Range
     
      Set r = Range("a1")
      Do While r.Value < 10
        r(2).Value = r.Value + 1
        Set r = r(2)
      Loop
    End Sub



    Sur de grands traitements (+/- à partir de 10000 lignes) et dans la mesure où l'on peut formuler la progression des valeurs, on pourrait se passer de la boucle qui est lente, par exemle avec ceci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test1()
      Dim r As Range
      Dim Value As Long
     
      If Range("a1") < 10 Then
        Value = 10000 - Range("a1").Value
        Set r = Range("a2").Resize(Value)
        r.Formula = "=a1+1"
        r.Copy
        r.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
      End If
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre à l'essai
    bonjour
    effectivement c'est un exemple que j'ai trouvé sur internet et j' ai voulu le testé
    comme ça fonctionne pas j'ai voulu savoir pourquoi

  5. #5
    Responsable
    Office & Excel

    Je doute que le code que tu nous as donné ait été repris tel quel du net, car il y a une erreur sur chaque ligne. Qui plus est, la logique ne tient pas la route puisque l'on ne sait pas démarrer de A0, il n'est donc pas possible d'obtenir la valeur de A0 pour lui ajouter 1. Qui plus est, à cause des Select inutiles, ce code est d'une ineptie totale.

    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Macro1()
     
    ' Macro1 Macro
    '
    'Sub tant_que()
    Range(A1).Select ' Il manque les guillemets pour entourer l'adresse A1
     Do While ActiveCell.Offset(-1, 0) <> 10 ' Ca ne peut que planter car impossible de remonter d'une ligne à partir de la ligne 1
     ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1 ' Impossible puisque l'on part de A1
     * ActiveCell.Offset(1, 0).Selct ' Ligne forcément en rouge à cause de l'astérisque, et .Selct n'existe pas
    ' Absence de loop pour boucler, mais comme on ne sait pas lancer la macro à cause des autres erreurs, on n'arrive pas au message explicite s'il n'y avait que cette erreur
     
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre à l'essai
    Bonsoir
    c'etait une curiosité de ma part
    ce n'est pas grave je vous remercie
    ça prouve mon niveau en excel
    j'ai reussi avec for next
    encore merci