Erreur 1004/VLOOKUP dans une macro
Bonjour à tous,
J'ai un petit problème avec une macro... Je vous explique:
J'ai deux feuilles de calculs:
La première contient plusieurs colonne, celle qui nous intéresse est une colonne (Asset class) contenant différent String.
La seconde contient 4 colonne, dont une qui contient les mêmes éléments (voir +) que la colonne asset class.
Je veux recopier les colonne 2,3,4 de la seconde feuille dans la première lorsque le contenu de Asset class match bien.
J'ai écrit le code suivant:
Sub Traitement_du_tableau_Mandatewire()
Dim FL1 As Worksheet, FL2 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant, contenu1 As String
'Instance de la feuille qui permet d'utiliser FL1 partout dans
'le code à la place du nom de la feuille
Set FL1 = Worksheets("Worksheet")
Set FL2 = Worksheets("Conversion_Table_Mandate_Wire")
'Détermine la dernière ligne renseignée de la feuille de calculs
'(Voir explication sur l'utilisation de Split en bas de cette discussion)
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Fixe le N° de la colonne à lire
NoCol = InputBox(Prompt:=" Entrer le numéro de la colonne Asset Class ")
'Utilisation du N° de ligne dans une boucle For ... Next
For NoLig = 1 To DerLig
Var = FL1.Cells(NoLig, NoCol)
'utilisation de la fonction VLOOKUP pour chercher le contenu de FL1.Cells(NoLig,NoCol) dans l'autre feuille de calcul et recopier le contenu de la deuxième (resp 3eme, 4eme) colonne du tableau dans la feuille 1 à la colonne 19 (resp 20 21)'
FL1.Cells(NoLig, 19) = "=VLOOKUP(FL1.Cells(NoLig, NoCol); FL2!A1:D1300; 2;False)"
FL1.Cells(NoLig, 20) = "=VLOOKUP(FL1.Cells(NoLig, NoCol); FL2!A1:D1300; 3; False)"
FL1.Cells(NoLig, 21) = "=VLOOKUP(FL1.Cells(NoLig, NoCol);FL2!A1:D1300; 4; False)"
'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
Debug.Print Var
Next
Set FL1 = Nothing
Set FL2 = Nothing
End Subje reçois l'erreur suivante:
Run-time error '1004'
Application-defined or object-defined error
Il bloque à la ligne: FL1.Cells(NoLig, 19) = "=VLOOKUP(FL1.Cells(NoLig, NoCol); FL2!A1:D1300; 2;False)"
Voila je vous remercie d'avance pour votre aide
Bonjour et bienvenu(e)
Remplace dans les formules le ; (point virgule) par , (virgule)
exemple
FL1.Cells(NoLig, 19) = "=VLOOKUP(FL1.Cells(NoLig, NoCol), FL2!A1:D1300, 2,False)"Mais en plus et de surcroit je ne suis pas sur de cette syntaxe
FL1.Cells(NoLig, 19) = "=VLOOKUP(FL1.Cells(NoLig, NoCol), FL2!A1:D1300, 2,False)"Un fichier serait très utile
Bonjour je pense qu'il y a une ou deux erreurs de syntaxe dans l'écriture de la formule.
FL2!A1:D1300 Je ne suis pas sur que ce soit une syntaxe correct mais je peux me tromper car je ne connais pas tout en vba.
Ensuite
"=VLOOKUP(FL1.Cells(NoLig, NoCol); FL2!A1:D1300; 2;False)"Ca veut dire : écrire dans la cellule la formule recherchev etc...Donc il faut rajouter .formula à la cellule qui va contenir la formule
-->FL1.Cells(NoLig, 19).formula
Regardez déjà dans ses deux directions pour commencer..
Cordialement,
Edit : salutation Banzaï. Et bien vu pour les ";" Franchement, vba pourrait accepter le mixage des langues dans les formules !
Merci Banzai64,
J'ai maintenant un autre problème, à chaque étape de mon code, la fenêtre suivante s'affiche:
Merci d'avance, je dois à chaque fois sélectionner la feuille de calcul correspondant à FL2, sachant que ma boucle est très longue...
Edit: Merci Force Rouge, je vais creuser cette piste
Edit2: Le fichier est trop lourd :/
Comme tu peux le voir, nous sommes deux à t'avoir prescris la même chose donc c'est dans ses directions là qu'il faut travailler
Transformez d'abord ceci FL2!A1:D1300 en syntaxe vb (avec des feuilles et des ranges) ca reglera très certainement d'autres problèmes en cascade, y compris l'ouverture de cette fenêtre...
Eventuellement, je ne sais pas si cela peut-être source d'erreur
FL1 = Worksheets("Worksheet")<-- vérifier si la feuille s'appelle bien Worksheet (voire de tester en changeant de nom la feuille)
Bonjour
Bonjour Force rouge
Teste cette macro
Dim FL1 As Worksheet, FL2 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant, contenu1 As String
'Instance de la feuille qui permet d'utiliser FL1 partout dans
'le code à la place du nom de la feuille
Set FL1 = Worksheets("Worksheet")
Set FL2 = Worksheets("Conversion_Table_Mandate_Wire")
'Détermine la dernière ligne renseignée de la feuille de calculs
'(Voir explication sur l'utilisation de Split en bas de cette discussion)
DerLig = Split(FL1.UsedRange.Address, "$")(4)
'Fixe le N° de la colonne à lire
NoCol = InputBox(Prompt:=" Entrer le numéro de la colonne Asset Class ")
'Utilisation du N° de ligne dans une boucle For ... Next
For NoLig = 1 To DerLig
Var = FL1.Cells(NoLig, NoCol)
'utilisation de la fonction VLOOKUP pour chercher le contenu de FL1.Cells(NoLig,NoCol) dans l'autre feuille de calcul et recopier le contenu de la deuxième (resp 3eme, 4eme) colonne du tableau dans la feuille 1 à la colonne 19 (resp 20 21)'
' 1ère formule
FL1.Cells(NoLig, 19) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!" & Range("A1: D1300").Address & ", 2,False)"
' Ou
'FL1.Cells(NoLig, 19) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!$A$1:$D$1300, 2,False)"
' Ou
'FL1.Cells(NoLig, 19) = "=VLOOKUP(" & FL1.Cells(NoLig, NoCol).Address(external:=True) & "," & FL2.Range("A1:D1300").Address(external:=True) & ", 2,False)"
' 2ème formule
'FL1.Cells(NoLig, 20) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!" & Range("A1: D1300").Address & ", 3,False)"
' Ou
FL1.Cells(NoLig, 20) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!$A$1:$D$1300, 3,False)"
' Ou
'FL1.Cells(NoLig, 20) = "=VLOOKUP(" & FL1.Cells(NoLig, NoCol).Address(external:=True) & "," & FL2.Range("A1:D1300").Address(external:=True) & ", 3,False)"
' 3ème formule
'FL1.Cells(NoLig, 21) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!" & Range("A1: D1300").Address & ", 4,False)"
' Ou
'FL1.Cells(NoLig, 21) = "=VLOOKUP('" & FL1.Name & "'!" & Cells(NoLig, NoCol).Address & ",'" & FL2.Name & "'!$A$1:$D$1300, 4,False)"
' Ou
FL1.Cells(NoLig, 21) = "=VLOOKUP(" & FL1.Cells(NoLig, NoCol).Address(external:=True) & "," & FL2.Range("A1:D1300").Address(external:=True) & ", 4,False)"
'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
Debug.Print Var
Next
Set FL1 = Nothing
Set FL2 = Nothing
End SubMerci Banzai64,
Ca fonctionne avec la modification que tu as apporté.
Merci également Force Rouge.
AH non je ne suis pas d'accord ! Banzaï... tu écris une formule dans une cellule sans préciser que la cellule va contenir une formule (?!). On m'aurait menti ? Il n'y a donc plus/pas besoin de le préciser... ?
Merci de ta sympathie youyou92 !
Bonjour
@ Force rouge
C'est implicite avec (grâce) le signe =
C'est vrai que cela serait plus "logique" de le préciser mais bon .....
Mais cela sera Formula et pas FormulaLocal, FormulaArray etc ....
Ben ma foi! Si c'est permis...faisons. Et puis en même temps sa permet un peu de souplesse dans une écriture très contrôlée.