Generaliser un code
Bonjour, j'ai enregistré une macro qui permet d'effectuer des recherchev dans (feuille1 et feuille4). comment je dois faire pour généraliser cette formule par exemple ici je selectionne la réponse de la case gh2 et j'applique la formule de gh2:gh735.
est il possible d'aller jusqu'au dernier numero de dossiers (colonne a);càd la dernière entrée?
merci
Sub Macro11()
Sheets("Feuil4").Select
Range("H3:L3").Select
Selection.Copy
Sheets("Feuil1").Select
Range("GH1").Select
ActiveSheet.Paste
Range("GH2").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,Feuil4!R4C7:R602C14,2,FALSE)"
Range("GH2").Select
Selection.AutoFill Destination:=Range("GH2:GH735"), Type:=xlFillDefault
Range("GH2:GH735").Select
End sub
Dans ton cas tu peux utiliser formulalocal (ou R1C1 aussi).
Si tu veux le résultat en G2 en cherchant la valeur correspondante en G1 dans une colone allant de A1 à A... on ne sait pas pour sortir la valeur correspondante dans la colone B
ca va donner qqch comme ça
Sub Macro_trouzemille
compteur = 0
do
compteur = compteur +1
loop until Range("A" & compteur +1) = ""
'ca va compter le nombre de lignes utilisées dans ton tableau pour peu que toutes les cases de la 1ere colone soient remplies
'on peut aussi utiliser plus simplement la fonction count ou usedrange mais je ne me rappelle plus trop leur syntaxe là tout de suite
Range("G2").formulalocal = "=VLOOKUP(G1,A1:B" & compteur & ",2,FALSE)"Pour "généraliser" un code enregistré brutalement depuis excel le truc à savoir et que tout ce qui est "écrit" dans excel dans doit dans le code être entouré de guillements "" et quand tu a joute une variable calculée dans vba tu mets
& mavariable"A1:B" & mavariableBien évidemment coder de cette façon est dégoutant, utiliser des formulalocal c'est moche et lourd
ci dessous c'est vachement mieux (tjrs en imaginant que tu cherches la valeur correspondante dans la colone B à une certaine valeur dans la colone A avec en G1 la valeur à trouver dans A et en G2 le résultat final)
sub trouve_ma_valeur_sans_douleur
cmpt = 0
Do
cmpt = cmpt +1
loop until Range("A" & cmpt) = Range("G1")
Range("G2") = Range("B" & cmpt)J'ai ajouté le code que vous m'avez envoyé à ma maroc mais ça ne fonctionne tjrs pas.
Sub Macro11()
Sheets("Feuil4").Select
Range("H3:L3").Select
Selection.Copy
Sheets("Feuil1").Select
Range("GH1").Select
ActiveSheet.Paste
Range("GH2").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,Feuil4!R4C7:R602C14,2,FALSE)"
Range("GH2").Select
Selection.AutoFill Destination:=Range("GH2:GH735"), Type:=xlFillDefault
Range("GH2:GH735").Select
En fait je veux savoir ce qu'il faut ajouter à cette macro pour que le calcul ne se fasse plus de ("GH2:GH735"), mais de GH2 jusqu' GHi, sachant que i est le numéro de la dernière ligne enregistré dans la colonne A.
merci
End sub
Ok, c'est pas la partie recherche qui t'intéresse mais la partie autofill donc.
Sub Macro11()
Sheets("Feuil4").Select
Range("H3:L3").Select
Selection.Copy
Sheets("Feuil1").Select
Range("GH1").Select
ActiveSheet.Paste
Range("GH2").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,Feuil4!R4C7:R602C14,2,FALSE)"
Range("GH2").Select
cmpt = 'utilise ici une méthode pour trouver la dernière ligne utilisée de la colone A. Y en a plein, je t'en ai donné une au dessus, pas la plus efficiente mais étant donné que tu ne veux pas faire autrement que de l'enregistrement macro dans ce cas précis ça restera la partie la plus efficace du code.
Selection.AutoFill Destination:=Range("GH2:GH" & cmpt), Type:=xlFillDefault
Range("GH2:GH" & cmpt).SelectCF ce que j'avais déjà écrit
Pour "généraliser" un code enregistré brutalement depuis excel le truc à savoir et que tout ce qui est "écrit" dans excel dans doit dans le code être entouré de guillements "" et quand tu ajoutes une variable calculée dans vba tu mets & entre les deux
En revanche, tu vas découvrir que ton code ne marchera pas avec FormulaR1C1, parceque l'autofill (quand tu tires la formule de GH2 à GH735) va déplacer les références relatives de ta formule à chaque nouvelle case remplie.
En gros tu lui dis là que R1C1 (row 1 column 1) correspond à GH2, à chaque fois que l'autofill va descendre d'une cellule pour la remplir, R1C1 va devenir cette nouvelle cellule, du coup dans ta formule "Feuil4!R4C7:R602C14" ne correpondra jamais à la même plage de cellules : à chaque nouvelle case à remplir, "Feuil4!R4C7:R602C14" va se décaler de 1 vers le bas.
Si tu ne veux vraiment pas faire ce que tu as à faire avec un vrai code propre non enregistré depuis tes feuilles excel tu devras remplacer
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,Feuil4!R4C7:R602C14,2,FALSE)par
ActiveCell.Formulalocal = "=VLOOKUP(GH2,Feuil4!GN$5:GU$603,2,FALSE)en n'oubliant pas le $ avant la référence que tu souhaites bloquer pour ne pas qu'à chaque autofill elle se déplace, ici la référence des les lignes. (si GH2 est ton R1C1 initial j'en déduis que tu cherches dans le range GN5:GU603 si je ne me trompe pas)
Bonne chance
Merci beaucoup lostarot pour ton aide