[VBA] Syntaxe VLOOKUP - ouverture de Workbook dynamique

Bonjour à tous,

Je souhaite faire un comparatif entre deux fichiers de versions différentes où figurent des lignes de commandes (le fichier ouvert V1.2, sur lequel est présent le bout de macro ci-dessous, et l'autre à aller chercher, V1.1 dans mon exemple) .

Grâce à l'enregistreur de macro, j'ai pu trouver la "traduction" VBA de la fonction RECHERCHEV, mais j'aimerais la rendre un peu plus dynamique, et donner le choix à l'utilisateur d'aller chercher lui-même le fichier qu'il veut comparer (qui contient par défaut la feuille k€, cela peut rester fixe).

Pour cela je compte calculer la première valeur puis utiliser la méthode Autofill afin de remplir les n lignes de commandes non vides.

'RECHERCHEV des commandes présentes dans la version précédente
Range("A9").Select
ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],'Chemin\...\[Fichier_V1.1]k€'!C5,1,FALSE)"
    Selection.AutoFill Destination:=Range(Cells(9, 1), Cells(der_lig, 1))

Cette méthode marche parfaitement quand le chemin et donc le nom du classeur (Fichier_V1.1) est fixe, mais ce que je souhaiterais c'est rendre dynamique le chemin d'accès et la prise en compte dans VLOOKUP.

J'avais pensé à dimensionner un fichier "previous", que l'utilisateur sélectionnerait, puis intégrer le nouvel objet "previous" dans la VLOOKUP (l'onglet k€ ne bouge pas, k€ existe dans toutes les versions du fichier)

Mais c'est là que le bât blesse :

Dim previous
  previous = Application.GetOpenFilename(, , "Sélectionnez votre source de données")

'RECHERCHEV des commandes présentes dans la version précédente
    Range("A9").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],'Chemin\...\[previous]k€'!C5,1,FALSE)"
    Selection.AutoFill Destination:=Range(Cells(9, 1), Cells(der_lig, 1))

Cela ne marche pas

Alors ma question est assez simple : comment faire prendre en compte à VLOOKUP le fichier générique "previous" ?

D'avance, merci !

Hello all,

Je me permets de remonter le sujet...

Merci !

Désolé d'insister lourdement, mais j'ai beau passer du temps sur le sujet je ne trouve pas la solution...

Svp !

Bonjour,

Tu peux essayer le code suivant ...

ActiveCell.FormulaR1C1 ="=VLOOKUP(k€!R[-5]C[4],'Chemin\...\" & previous & "k€'!C5,1,FALSE)"

Bonjour,

J'ai exposé mon pb sur un autre forum et j'ai été un peu aiguillé, comme quoi il ne faut pas confondre du texte (encadré par des guillemets) et une variable.

Maintenant, mon bout de code ressemble à ça :

Dim previous
  previous = Application.GetOpenFilename(, , "Sélectionnez votre source de données")
'
    Range("A9").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],previous & 'k€'!C5,1,FALSE)"

Et après application, la formule dans les cellules cibles est celle-ci :

RECHERCHEV(k€!E4;previous & k€!$E:$E;1;FAUX)

Ce qui retourne donc forcément une erreur #NOM?

Ce que je ne comprends donc pas dans mon code (obtenu en utilisant l'enregistreur de macro, d'où les R1C1), c'est comment faire comprendre à VBA que k€ est une worksheet générique qu'il trouvera dans tous les fichiers sélectionnés, une constante ?

Je bloque pas mal là, un petit peu d'aide serait la bienvenue... Merci d'avance !

Merci pour ton coup de main !

J'ai appliqué ton code, mais après exécution, le résultat dans les cellules cibles est de type :

=RECHERCHEV(k€!E4;'Chemin\Chemin\[previousk€]previous'!$E:$E;1;FAUX)

A quoi cette mauvaise syntaxe peut être due ?

A part au dimensionnement de mon fichier générique previous ? Et celui-ci me semble correct :

Dim previous
  previous = Application.GetOpenFilename(, , "Sélectionnez votre source de données")

Merci d'avance

Désolé du double post..

Après un test sur MsgBox, il apparaît que ma variable previous contient le chemin

Je pense donc que le début du second argument du VLOOKUP que tu proposes , n'est pas utile, mais je ne trouve pas la bonne syntaxe (j'ai du mal avec les guillements, apostrophes...)

Pourrais-tu m'apporter cette dernière précision ? Merci beaucoup...!


La bonne syntaxe semble être celle-là.

"=VLOOKUP(k€!R[-5]C[4],'previous & k€'!C5,1,FALSE)"

Ce code "marchouille" mais pas tout à fait : en effet il ne reconnaît pas l'objet k€ comme une worksheet (il faut choisir la feuille dans laquelle on va chercher les données dans le fichier previous), et la première valeur renvoie un #N/A alors qu'elle existe..

Des idées pour régler ces deux pb ?..

Je me permets de remonter le sujet... Merci !

Bonjour,

Je me permets de revenir vers vous sur ce sujet, j'ai du temps pour m'y consacrer.

J'ai bidouillé pour effectuer le calcul des écarts en rentrant pour les deux fichiers pour lesquels je voulais calculer les écarts le chemin du fichier en dur, directmeent dans les lignes VBA.

ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],'Chemin\[Fichier1]k€'!C5,1,FALSE)" 

et

ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],'Chemin\[Fichier2]k€'!C5,1,FALSE)" 

Cela marche sans problème, mais je voudrais maitenant vraiment pouvoir utiliser ma variable "previous", et lui associer la feuille générique k€.

Comment faire svp ?

Bonjour,

As-tu essayé de déclarer ta variable previous As String ... pour pouvoir l'intégrer dans ta formule ...

Hello James, merci pour tes réponses.

Alors en rentrant :

Dim previous As String
  previous = Application.GetOpenFilename(, , "Sélectionnez votre source de données")

Range("A9").Select
ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],[previous]k€!C5,1,FALSE)" 

cela fonctionne mais il faut sélectionner deux fois le fichier cible... Pourquoi ?

Re,

Tu n'as pas besoin de Select ...

Range("A9").FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],[previous]k€!C5,1,FALSE)"

Super merci, mais en reprenant ta syntaxe, l'instruction AutoFill qui arrive après ne marche plus..

 Range("A9").FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],[previous]k€!C5,1,FALSE)"

Selection.AutoFill Destination:=Range(Cells(9, 1), Cells(der_lig, 1))

der_lig est une variable qui permet d'étendre la formule jusqu'à la dernière ligne de la source de données.

Pourrais-tu me dire ce qu'il faut modifier ? Ma question est sûrement basique, mais j'apprends petit à petit...

Re,

Dans la mesure où tu n'as plus de Select ... il te faut simplement faire une copie ...

Range("A9").Copy Destination:=Range("A10:A" & der_lig)

J'ai fait le test sur ces seules lignes et c'est toujours le cas, je dois séléctionner deux fois le fichier

Range("A9").FormulaR1C1 = _
        "=VLOOKUP(k€!R[-5]C[4],[previous]k€!C5,1,FALSE)"

Range("A9").Copy Destination:=Range("A10:A" & der_lig)

Ce qu'il se passe : la formule semble s'étirer, mais c'est toujours le même résultat, puis c'est là que je dois sélectionner une deuxième fois le fichier..

Re,

As-tu vérifié dans quel mode de calcul ... tu te trouves ... ? Automatique devrait gommer ce problème ...

Je suis bien en automatique..

Je signale aussi que le calcul marche très bien après avoir sélectionné une deuxième fois le fichier. Je ne comprends pas d'où ça peut bien provenir..

Re,

Pour être totalement sincère avec toi ... sans le fichier ... on ne peut que tenter de deviner ...

A distance... je t'avoue ne pas voir ce qui t'obligerait à sélectionner ton fichier deux fois ...

La macro se trouve dans le fichier "exemple", et va chercher les infos dans le fichier "exmeple - previous".

On s'aperçoit qu'il faut bien sélectionner deux fois le fichier...

Rechercher des sujets similaires à "vba syntaxe vlookup ouverture workbook dynamique"