Problème pour faire tourner la macro sur x lignes
Mrgxaib
-
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
f894009 Messages postés 17277 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
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
A voir également:
- Problème pour faire tourner la macro sur x lignes
- Site x - Guide
- Sites X : Pornhub, YouPorn et Redtube sont de nouveau accessibles en France - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Tourner l'écran - Guide
- Photoscape x - Télécharger - Retouche d'image
5 réponses
Bonjour,
code pour arrêt sur cellule vide
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
Bonjour,
Pour trouver la dernière ligne "non vide", tu peux utiliser
Il te suffit ensuite d'utiliser cette variable pour définir ta plage de cellules
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
Bonjour,
Pour analyser chaque cellule d'une colonne d'un tableau tu peux utiliser :
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
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 SubAttention, 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
Re,
En résumé si la colonne A fait partie de tes données :
sinon, remplaces "A1" par la 1ère cellule de la colonne 1 de ton tableau
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
Autre solution, pour un tableau qui commence en A7 (ligne des intitulés de colonne) :
Si le tableau a plus d'une ligne d'intitulés, augmenter l'offset en conséquence.
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 SubSi 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.
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.
EDIT : Ajout des balises de code
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
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.
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.
Pour poster ton code sur le forum.... merci d'utiliser les BALISES DE CODE
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Re,
Avec votre code, ceci devrait aller:
Mais pourquoi n'utilisez vous pas le code de Patrice33740, il montre pas mal de chose sur la programmation
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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
'
' 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 ?
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