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" & mavariable

Bien é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).Select

CF 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

Rechercher des sujets similaires à "generaliser code"