[VBA - Excel] Vlookup vers un autre fichier

Vlookup vers un autre fichier [VBA - Excel] - VB/VBA/VBS - Programmation

Marsh Posté le 06-01-2011 à 19:02:37    

Bonjour, je vais essayer de vous exposer clairement mon soucis :)
 
J'ai un 1er fichier 1.xls qui comporte 3 colonnes: Nom_1 - Info1 - Info2
Un second fichier 2.xls dans un répertoire différent (non modifiable): Nom_2 - Nom_1 - Info1
Dans le second fichier la colonne Nom_1 est rentrée manuellement et Info1 est cherchée par un vlookup. Cependant comme le fichier est gros et partagé, j'ai voulu faire une macro pour effectuer ce vlookup.
 
La méthode (macro) que j'ai utilisé jusqu'ici est la suivante:
- J'utilise une case inutilisée et je lui mets la formule du vlookup comme dans Excel.
sheets(1).range("D1" ).formula = "=vlookup..."
- Ensuite je copie cette formule dans la case qui m'intéresse:
sheets(1).range("C2" ) = sheets(1).range("D1" ).value
 
Bien sûr tout ceci est une boucle, ça marche plutôt bien mais j'aimerai améliorer ça parce que je trouve cette méthode pas très orthodoxe et au final je n'ai pas l'impression d'exploiter VBA ...
 
Déjà, pour gagner en visibilité, je voulais modifier le chemin dans le vlookup en passant par une variable de type string mais je n'arrive pas à trouver la bonne formulation:
Dim chemin As String
chemin = "C:\chemin1\"
[..].formula = "=vlookup(cell, ???,nb,0)"

A la place des ??? je ne sais pas comment appeler correctement la range, j'ai essayé plusieurs fois avec des & chemin & [1.xls]Onglet1'!A:F par exemple.
 
Face à cet échec je me suis dit que j'allais passer directement par un vlookup de VBA en utilisant worksheetfunction.vlookup mais je me suis trouvé face aux problèmes suivants:
 
- Je fais une boucle (indice I) pour faire un vlookup sur tous mes éléments de Nom_2 donc j'ai une cell non fixe. J'ai essayé d'écrire:
worksheetfunction.vlookup("A" & I ,...) mais ça ne passe pas.
 
- J'ai alors mis une cell fixe pour tester au niveau de la range et là c'est dans la définition de la range que j'ai un problème. J'ai voulu faire:
Dim rng As Range
rng = ??? (doit faire appel à A:C de 1.xls par exemple)
worksheetfunction.vlookup(" ",rng,...)

En gros je ne sais pas comment définir la range si elle est dans un autre fichier!
 
 
J'espère avoir été assez clair :| En tout cas merci beaucoup à ceux qui auront pris la peine de tout lire et qui auraient une aide à m'apporter :)
 
Christophe

Reply

Marsh Posté le 06-01-2011 à 19:02:37   

Reply

Marsh Posté le 07-01-2011 à 16:37:55    

C'est juste un problème de compréhension des objets VBA :D
 
Dim objPlageRecherche As Range
Set objPlageRecherche = Workbooks("NOM DE TON WORKBOOK" ).Worksheets("NOM DE TA FEUILLE" ).Range("TA PLAGE DE RECHERCHE" )
 
Debug.Print Application.WorksheetFunction.VLookup("xavier", objPlage, 2)


Message édité par Xxxaaavvv le 07-01-2011 à 16:39:15
Reply

Marsh Posté le 07-01-2011 à 16:44:33    

Merci, j'ai compris avec les multiples tentatives :) par contre est-ce que je suis obligé d'avoir le workbook ouvert pour que ça fonctionne?
 
VBA ne reconnait pas le fichier si j'écris le chemin entre les parenthèses de Workbooks, ou alors je l'écris pas de la bonne façon :)

Reply

Marsh Posté le 07-01-2011 à 16:55:40    

Oui excel est obligé d'ouvrir les fichiers les traiter
 
par contre, tu peux les ouvrir; et les mettre en invisible, et empécher les refresh à l'écran, ainsi que les recalculs, ce qui fait un gain de temps considérable.
 
(en gros tu provoque le calcul et le refresh de l'écran qu'a la fin de ton traitement.)
 
Une fois qu'un classeur est ouvert dans excel
son identifiant dans la collection des Workbooks() c'est son nom de fichier (pas son chemin)
 
C'est pas VBA qui est en cause la, mais Excel qui ouvre les classeur de cette manière.

Reply

Marsh Posté le 07-01-2011 à 16:58:29    

Essaye un truc du genre pour l'invisibilité ?
mais si tu utilises le screen updating, normalement tu ne gagnera pas plus...
 
 
   Dim objMonClasseur As Workbook
   Dim objPlageRecherche As Range
 
   Set objMonClasseur = Workbooks.Open("CHEMIN DE MON CLASSEUR" )
   Set objPlageRecherche = objMonClasseur.Worksheets("NOM DE TA FEUILLE" ).Range("TA PLAGE DE RECHERCHE" )
 
   for each objWorksheet in objMonClasseur  
      objWorksheet.Visible = False
   next objWorksheet  
 
 
   Debug.Print Application.WorksheetFunction.VLookup("xavier", objPlage, 2)
 
 
 
 
par contre au niveau des calculs :
au début de ta procédure :
   Application.Calculation = xlCalculationManual
 
a la fin :
   Application.Calculation = xlCalculationAutomatic
   Application.Calculate
 
 


Message édité par Xxxaaavvv le 07-01-2011 à 17:06:03
Reply

Marsh Posté le 07-01-2011 à 16:58:50    

Pour l'instant j'ai mis Application.ScreenUpdating en False pour gagner du temps.
Pour ce qui est de l'ouverture du fichier c'est au final pas très grave puisqu'il est quasi tout le temps ouvert! Je connais la commande pour ouvrir un Workbook mais pas celle pour le mettre en invisible, pourrais-tu me la donner?
 
Merci de ton aide :)

Reply

Marsh Posté le 07-01-2011 à 17:06:38    

Zut j'ai éditer mon poste d'avant au lieu de répondre :
 
à relire donc, désolé.

Reply

Marsh Posté le 07-01-2011 à 19:31:44    

Salut,non le fichier n'a pas forcément besoin d'être ouvert voir pour cela http://excel.developpez.com/faq/?p [...] FermeIndir

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed