Ouverture d'un fichier puis vlookup
Bonjour à tous!
Dans ma macro, je cherche à effectuer un vlookup sur un autre fichier, normalement fermé.
Je sais qu'il est impossible de chercher dans un fichier fermé, donc j'ai fait en sorte que la macro l'ouvre avant d'effectuer le vlookup, puis le referme.
Cependant, je n'arrive pas à adapter la formule du vlookup à mon cas. Ci-joint un extrait anonymisé de mon fichier.
J'aimerai rechercher par "Customer number" (sur mon fichier de travail) la devise associée à celui-ci (sur mon fichier "CurrencyFile").
La petit difficulté pour moi c'est que je voudrais étendre ma formule à la dernière ligne non vide du fichier, en commençant par la cellule E2.
Pour l'instant j'ai fait ça et ça ne marche pas. Je m'embrouille avec mes Dim...
'BLOC1 Vlookup sur les devises
Application.ScreenUpdating = False
'Nécessaire pour l'ouverture d'un fichier
Dim wb As Workbook
Set wb = Workbooks.Open("R:\chemin\CurrenciesFile.xlsx")
Dim wsh As Worksheet
Dim rnge As Range
Dim devise As Single
Set rnge = wsh.Range("B2:B" & lRows)
Range("B2").Formula = "=VLOOKUP(rnge, wb, 2,0)"
wb.Close
Application.ScreenUpdating = True
Bonjour,
Voici une proposition à adapter.
Vérifie en particulier :
- le nom de la feuille concernée dans le classeur CurrenciesFile
- la plage de recherche (j'ai supposé que la colonnes A correspond à "Customer number" et B à "Currency").
Sub test()
Dim WbS As Workbook, WbC As Workbook
Dim WsS As Worksheet, WsC As Worksheet
Dim Cel As Range
Set Wbs = Workbooks.Open("R:\chemin\CurrenciesFile.xlsx") ' Classeur source
Set WsS = WbS.Sheets("sheet1") ' Feuille source
Set WbC = ThisWorkbook ' Classeur cible
Set WsC = WbC.Sheets("ConsoSheet") ' Feuille cible
For Each Cel In WsC.Range("B2:B" & WsC.Range("B" & Rows.Count).End(xlUp).Row)
Cel.Offset(, 3) = Application.VLookup(Cel, WsS.Columns("A:B"), 2, 0)
Next Cel
WbS.Close
End SubA+
Merci mille fois Frangy!!
J'ai bien adapté ton code au nom de ma feuille et à ma plage de recherche.
Cependant je me vois retourner une erreur "Subscript out of range" ce que je ne comprends pas...
Pourtant ma feuille source s'est bien ouverte..
Une idée ?
Dim WbS As Workbook
Dim WbC As Workbook
Dim WsS As Worksheet
Dim WsC As Worksheet
Dim Cel As Range
Set WbS = Workbooks.Open("R:\TR_DP\PRICING\30 LSMW Macro\CurrenciesFile.xlsx")
'Classeur source
Set WsS = WbS.Sheets("Sheet1") ' Feuille source
Set WbC = ThisWorkbook ' Classeur cible
Set WsC = WbC.Sheets("ConsoSheet") ' Feuille cible
For Each Cel In WsC.Range("B2:B" & WsC.Range("B" & Rows.Count).End(xlUp).Row)
Cel.Offset(, 3) = Application.VLookup(Cel, WsS.Columns("B:C"), 2, 0)
Next Cel
WbS.Close
Si cela peut aider, l'éditeur VBA me surligne en jaune la ligne :
Set WsC = WbC.Sheets("ConsoSheet") ' Feuille cible(Juste par cursioité, quelle est la fonction de l'expression "Cel.Offset(, 3)" dans ton code ?)
As-tu vérifié le nom de la feuille Cible (ConsoSheet) dans le classeur cible (ThisWorkbook), c'est à dire celui qui contient la procédure ?
Cel.Offset(, 3) correspond à la cellule dans laquelle est copié le résultat de la recherche.
Dans ton classeur, il s'agit donc de la cellule décalée de 3 colonnes par rapport à la colonne B (Customer number), soit la cellule de la colonne E.
A+
Oui j'ai vérifié c'est bien le bon.
Peut-il y avoir une autre explication ?
Une erreur de ce type indique généralement qu'une instruction fait référence à un objet inexistant.
Le code fonctionne (je l'ai testé).
Difficile d'en dire plus sans les classeurs.
A+
J'ai beau être revenue plusieurs fois sur mon code puis sur d'autres forums, impossible de faire marcher mon vlookup.
J'ai toujours un problème ici:
Set WsC = WbC.Sheets("ConsoSheet") ' Feuille cibleEt si le problème venait du fait que WsC n'est pas déterminé à cause de WbC ? Car WbC est déterminé par la phrase :
Set WbC = ThisWorkbook ' Classeur cibleOr comme juste avant on venait d'ouvrir le fichier source, peut-être que "This workbook" est compris par excel comme "Le fichier que l'on vient d'ouvrir, soit le fichier source" ? Plausible ?
Auquel cas, il faudrait que je Set mon classeur cible (WbC) par son nom. Mais comment faire quand le nom du fichier cible peut varier de jour en jour ?
Désolée d'insister mais malgré mes recherches je suis toujours bloquée et j'aimerai comprendre
Merci encore à tous pour votre précieux temps.
Le code entier si besoin:
Sub Devises()
'BLOC1 Vlookup sur les devises
Application.ScreenUpdating = False
'Nécessaire pour l'ouverture d'un fichier
Dim WbS As Workbook 'Classeur source
Dim WsS As Worksheet 'Feuille source
Dim WbC As Workbook 'Classeur cible
Dim WsC As Worksheet 'Feuille cible
Dim Cel As Range
Set WbS = Workbooks.Open("R:\TR_DP\PRICING\30 LSMW Macro\CurrenciesFile.xlsx") 'Ouverture du fichier devise
Set WsS = WbS.Sheets("Sheet1") 'Détermination de la feuille dans le fichier devise
Set WbC = ThisWorkbook ' Classeur cible
Set WsC = WbC.Sheets("ConsoSheet") ' Feuille cible
For Each Cel In WsC.Range("B2:B" & WsC.Range("B" & Rows.Count).End(xlUp).Row)
Cel.Offset(, 3) = Application.VLookup(Cel, WsS.Columns("B:C"), 2, 0)
Next Cel
WbS.Close
Application.ScreenUpdating = True
End SubBonjour,
Je te disais qu'il est difficile d'en dire plus sans les classeurs parce que j'ai effectué les tests de mon coté sans rencontrer de problème particulier.
J'ai créé un classeur Test_VlookUp qui contient la feuille ConsoSheet et la procédure Devises().
J'ai enregistré le classeur CurrenciesFile qui contient la feuille Sheet1 avec les données Customer number en colonne B et les données Currency en colonne C.
Je lance la macro Devises et la colonne E (Currency) se remplit correctement.
Pour info : la propriété ThisWorkbook renvoie un objet Workbook qui représente le classeur dans lequel s'exécute le code de la macro active.
A+