Problème pour faire tourner la macro sur x lignes

Mrgxaib -  
f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,
Je suis vraiment novice sur VBA donc j'espère que mes explications seront claires.

J'ai commencé à coder une macro simple avec un recherchev sauf que la macro est écrite pour un nombre défini de lignes. Or, elle sera amenée à tourner sur des fichiers avec plus ou moins de lignes.

Je pensais faire une boucle jusqu'à ce qu'il y ait une case vide qui fasse arrêter la macro.
Quelqu'un pourrait m'aider et m'expliquer très simplement comment faire ?

Je précise encore une fois que je suis vraiment débutante sur VBA...

Merci de votre aide

5 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    code pour arrêt sur cellule vide

    Sub boucle_fonction_Nb_Ligne()
        With Worksheets("feuil1")
            NL = 2
            Do
                x = .Cells(NL, 1)
                NL = NL + 1
            Loop Until .Cells(NL, 1) = ""  'boucle jusqu'a une cellule vide colonne A
        End With
    End Sub
    0
    1. Mrgxaib
       
      Tout d'abord, merci beaucoup !

      Le second problème est pour initialiser pour que la macro "balaie" toutes les lignes, je dois modifier quelque chose dans mon code ?

      Voulez vous que je vous envoie mon début de code ?
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour Jordane45,

      Mrgxaib:
      Y a rien a modifier puisque la boucle va s'arrêter a la premiere cellule vide dans la colonne testée a condition qu'il n'y ait pas de cellule(s) vides avant la dernière ligne
      Autrement adaptez avec code de Jordane45
      0
    3. Mrgxaib
       
      Sub Macro1()
      '
      ' Macro1 Macro
      '

      '
      Range("AP8").Select
      ActiveCell.FormulaR1C1 = _
      "=VLOOKUP(R[1]C[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
      Range("AP8").Select
      ActiveCell.FormulaR1C1 = ""
      Range("AP9").Select
      ActiveCell.FormulaR1C1 = _
      "=VLOOKUP(RC[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
      Range("AP9").Select


      Selection.AutoFill Destination:=Range("AP9:AP442")
      Range("AP9:AP442").Select
      ActiveWindow.SmallScroll Down:=-27
      End Sub

      Pour le range("AP9:AP442"), même avec le code de Jordane45 cela va pouvoir chercher au delà de la ligne 442 ?
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,
      Salut Patrice33740

      Mrgxaib:
      Vu votre code, ce n'est pas une boucle de 1 a x fonction nb ligne, mais de rendre la Plage AP9:AP442 dynamique avec la recherche de la dernière ligne de la feuille du classeur ou vous allez chercher vos infos
      0
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Bonjour,

    Pour trouver la dernière ligne "non vide", tu peux utiliser
    Derniere_Ligne = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
    

    Il te suffit ensuite d'utiliser cette variable pour définir ta plage de cellules
    0
    1. Mrgxaib
       
      Merci, que dois je changer à la place de * ?
      0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
       
      rien
      0
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
     
    Bonjour,

    Pour analyser chaque cellule d'une colonne d'un tableau tu peux utiliser :
    Option Explicit
    Sub Test()
    Dim rng As Range
    Dim cel As Range
      Set rng = Worksheets("Feuil1").Range("A1").CurrentRegion.Columns(1)
      For Each cel In rng.Cells
        ' Ici le code pour chacune des cellules de la première colonne du tableau situé en A1
        ' par exemple :
        If cel.Formula = "" Then Beep
      Next cel
    End Sub
    
    Attention, un tableau ne doit pas comporter de ligne entièrement vide ni de colonne entièrement vide.

    Sinon plus de précision sur la recherche d'une dernière cellule (ou première vide) ici :
    https://forums.commentcamarche.net/forum/affich-37622001-vba-detection-de-cellule-vide-ligne-colonnne
    0
  4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
     
    Re,

    En résumé si la colonne A fait partie de tes données :
    Option Explicit
    Sub Macro1()
    Dim rng As Range
    Dim cel As Range
      With ActiveSheet 'ou une autre feuille
        Set cel = .Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious)
        Set rng = .Range("AP8", cel.EntireRow.Columns("AP"))
        rng.FormulaR1C1 = _
          "=VLOOKUP(R[1]C[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
      End With
    End Sub
    

    sinon, remplaces "A1" par la 1ère cellule de la colonne 1 de ton tableau

    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
       
      Autre solution, pour un tableau qui commence en A7 (ligne des intitulés de colonne) :
      Option Explicit
      Sub Macro1()
      Dim rng As Range
        With ActiveSheet 'ou une autre feuille
          Set rng = .Range("A7").CurrentRegion.EntireRow.Columns("AP")
          Set rng = Intersect(rng, rng.Offset(1))
          rng.FormulaR1C1 = _
            "=VLOOKUP(R[1]C[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
        End With
      End Sub
      Si le tableau commence ailleurs, remplacer A7 par la première cellule du tableau
      Si le tableau a plus d'une ligne d'intitulés, augmenter l'offset en conséquence.
      0
    2. Mrgxaib
       
      Merci à tous pour vous réponses, je commence à y voir plus clair mais mes connaissances très limitées me bloquent...

      Je pensais utiliser le nombre de lignes et l'insérer directement dans la macro mais cela pose problème. Je vous montre en dessous. J'ai souligné où est le problème.

      Sub NBLignes()
      Dim NbLig As Integer
          NbLig = Cells.SpecialCells(xlCellTypeLastCell).Row
      End Sub
      
      Sub Macro2()
      
      Range("AP8").Select
       ActiveCell.FormulaR1C1 = _
       "=VLOOKUP(R[1]C[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
       Range("AP8").Select
       ActiveCell.FormulaR1C1 = ""
       Range("AP9").Select
       ActiveCell.FormulaR1C1 = _
       "=VLOOKUP(RC[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
       Range("AP9").Select
      
      
       Selection.AutoFill Destination:=Range("AP9:<underline>APNbLig</underline>")
       Range("AP9:APNbLig").Select
       ActiveWindow.SmallScroll Down:=-27
      
      End Sub
      


      EDIT : Ajout des balises de code
      0
    3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
       
      Pourquoi ne veux-tu pas adopter une des solutions proposées ?

      Il est inutile d'utiliser Autofill, il suffit d'appliquer la formule à la plage concernée : c'est là tout l'intérêt de .FormulaR1C1
      Et en VBA, il faut absolument éviter d'utiliser .Select

      Comme tu ne donnes aucune précision sur la façon dont tu détermines la plage qui doit recevoir cette formule (on sait qu'elle commence en AP8 mais pas ce qui permet de savoir où elle se termine) il est difficile de t'aider plus que ça.
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,

      Avec votre code, ceci devrait aller:

      Sub Macro2()
          Range("AP8").FormulaR1C1 = ""
          With Range("AP9")
              .FormulaR1C1 = "=VLOOKUP(RC[-1],'[EbaucheJuillet18.xlsx]Classement par chap'!R1:R1048576,2,FALSE)"
              .AutoFill Destination:=Range("AP9:APN" & Cells.SpecialCells(xlCellTypeLastCell).Row)
          End With
      End Sub


      Mais pourquoi n'utilisez vous pas le code de Patrice33740, il montre pas mal de chose sur la programmation
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Je lance ma macro mais il s'avère que ça ne donne pas de résultats
    Certes, certes, avec votre fichier et un exemple du fichier ebauche, ca serait plus facile de vous aider.......
    0