Vlookup avec nom de plage récupéré d'un String

Résolu/Fermé
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014 - Modifié par yaciin le 15/01/2014 à 12:34
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014 - 15 janv. 2014 à 16:58
Bonjour à tous et à toutes,

Je retourne vers vous pour mon tout premier post dans un forum. dans le cadre de mon apprentissage je manipule le langage VBA pour la première fois dans mon cursus, et là je suis bloqué depuis lundi :? .

Mon problème est le suivant :
je manipule deux grands fichier excel : le premier INV le deuxième MARD, la colonne commune entre les deux c'est le n° de référence.

Aprés avoir effectuer des opérations de mise en page sur les des deux fichiers, j'essai de faire un Vlookup dans INV afin de récupérer la colonne des emplacements des références existant dans MARD.

à chaque inventaire on a un nouveau fichier INV et un nouveau fichier MARD. Le challenge que j'ai donc est de développer une macro avec des noms de fichier variable, qui pourra effectuer les mises en pages et le Vlookup sur chaque nouveau paire INV et MARD à chaque inventaire.

Pour cela, j'ai créer un UserForm dans le fichier INV qui affiche la liste des fichiers ouverts et qui demande au utilisateur de sélectionner le fichier MARD :


Sub mac()
'Comptage des fenetres ouvertes
n = Application.Windows.Count
' Ecriture dans affichage
UserForm1.ListBox1.AddItem ("Liste des Classeurs ouverts")
For i = 1 To n
v = Application.Windows.Item(i).Caption
UserForm1.ListBox1.AddItem (v)
Next i
UserForm1.Show
End Sub

Une fois le fichier sélectionné ( et dans le code du bouton 'selectionner' dans la UserForm) je récupére le nom exacte du fichier MARD, et je l'active afin de faire ma mise en page et mon Vlookup :


Dim nom_fichier As String
nom_fichier = UserForm1.ListBox1.List(Index)
Workbooks(workbook_travail).Activate

La mise en page se passe bien, mais le Vlookup bloque, après plusieurs essaies, j'ai rencontré à chaque fois un de ces deux types de problème :
- soit il m'affiche une erreur #N/A (que je remplace par 0)
- soit il me sort une fenêtre pour pour parcourir le fichier à la main (chose qui me sert pas trop vu que j'ai plus de plus de 17 000 lignes :aie: )

voilà ma dernière tentative qui n'a pas marché non plus :( qui retourne 0 (#N/A) :


Dim a, b
b = ActiveSheet.UsedRange.Rows.Count

Dim plage1, plage2 As Range
Set plage1 = Application.Workbooks(nom_fichier).Worksheets("magasin_1").Columns("C:AS")
Set plage2 = Application.Workbooks(nom_fichier).Worksheets("magasin_2").Columns("C:AS")

WB_Principal.Activate
For a = 2 To b
Worksheets(1).Activate

If Cells(a, 2) <> "SLoc" And Cells(a, 2) <> "" Then
Cells(a, 5).Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(application.VLOOKUP(RC[-2],plage2,43,FALSE),0)"

Worksheets(1).Activate
Cells(a, 4).Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(application.VLOOKUP(RC[-1],plage1,43,FALSE),0)"


ElseIf Cells(a, 2) = "SLoc" Then Rows(a).Delete
End If
Next

(je fais deux Vlookup car j'ai deux colonnes d'emplacement, une pour chaque magasin. WB_Pricipal est une variable workbook content le fichier INV)

J'espère que j'ai bien expliqué ce qui me prend la tête depuis lundi et je vous remercie d'avance pour votre aide.

Cordialement.

7 réponses

Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
15 janv. 2014 à 13:22
Bonjour,

Essaie avec une formulation de ce type
ActiveCell.Formula = "=IFERROR(VLOOKUP(" & ActiveCell.Offset(0, -2).Address(0, 0) & ",magasin_2!C:AS,43,FALSE),0)"

A+
0
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014
15 janv. 2014 à 14:07
Bonjour Gyrus,

le problème que j'ai c'est au niveau du deuxième argument de Vlookup cad la plage, et non pas la valeur à chercher. soit ça soit j'ai pas compris ta solution..

Merci en tout cas t'es le premier à me répondre depuis ce matin (et dsl pour le retard j'été dans ma pause dej)
a+
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
15 janv. 2014 à 14:27
Lorsque tu écris
ActiveCell.Formula = "=IFERROR(VLOOKUP(" ... etc...
tu inscris la formule EXCEL spécifiée entre parenthèses dans la cellule active.
Les fonctions IFERROR et VLOOKUP sont des fonctions Excel.

Si tu écris
ActiveCell.FormulaR1C1 = "=IFERROR(application.VLOOKUP...etc...
tu fais appel à la méthode WorksheetFunction.VLookup et non pas à la fonction Excel.


As-tu essayé de modifier ton code avec mes instructions ?
Exemple : si la cellule active est E2, elle va placer la formule suivante
=SIERREUR(RECHERCHEV(C2;magasin_2!C:AS;43;FAUX);0)

A+
0
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014
15 janv. 2014 à 14:41
Oui bien-sur j'ai essayé mais ça marche pas, il me sort la fenetre windows pour parcourir un fichier afin de sélectionner un fichier.
j'ai essayé aussi avec ma formule en enlevant 'application.' comme t'as dis (et merci pour l'info sur les fct excel) mais ça n'a pas marché non plus, il me met 0. :/

Ps : magasin_1 et magasin_2 sont respectivement la 2éme feuille et la 3éme feuille de mon fichier MAR. alors ma plage doit ressembler à :

'[table mard 27-11-13_vierge.xlsm]magasin_1'!C3:C45

et ce que je récupére de la liste dans le String c'est :
"table mard 27-11-13_vierge.xlsm" . Le nom exacte et complet du fichier MARD
ce qui me manque mnt c'est de donner ce string comme argument dans le Vlookup :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
15 janv. 2014 à 15:12
Si j'ai bien compris,
nom_fichier = "table mard 27-11-13_vierge.xlsm"

L'instruction devient
ActiveCell.Formula = "=IFERROR(VLOOKUP(" & _
ActiveCell.Offset(0, -2).Address(0, 0) & _
",'[" & nom_fichier & "]magasin_2'!C:AS,43,FALSE),0)"

A+
0
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014
15 janv. 2014 à 15:36
MERCIIIIIIIIIIIIIIIIIIIIIIIII Gyrus. ça marche merci beaucoup.
Par contre, tu peux expliquer un peu cet histoire des '&' pour mes prochaines fois, tu sais ce qu'on dis : ne me donne pas le poisson apprend-moi a pêcher :p :p
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
15 janv. 2014 à 16:26
Tu cherches à obtenir la formule suivante :
=SIERREUR(RECHERCHEV(C2;'[table mard 27-11-13_vierge.xlsm]magasin_2'!C:AS;43;FAUX);0)
Soit, en Grand-Breton
=IFERROR(VLOOKUP(C2,'[table mard 27-11-13_vierge.xlsm]magasin_2'!C:AS,43,FALSE),0)

Cette formule peut s'écrire sous la forme de 4 textes concaténés (l'esperluette & sert à concaténer des chaines de caractères. Exemple : "H" & "E" & "L" & "L" & "O" est équivalent à "HELLO").
" =IFERROR(VLOOKUP(" & "C2" & ",'[" & "table mard 27-11-13_vierge.xlsm" & "]magasin_2'!C:AS,43,FALSE),0)"
Dans cette formule, j'ai dégagé les 2 variables : C2 et table mard 27-11-13_vierge.xlsm

Il faut donc parvenir à transcrire ces valeurs sous forme de texte à partir des variables connues.
La cellule C2 correspond à ActiveCell.Offset(0, -2).
Le texte "C2" peut donc être obtenu avec ActiveCell.Offset(0, -2).Address(0, 0).
table mard 27-11-13_vierge.xlsm correspond à la valeur de la variable nom_fichier.

La formule s'obtient donc avec
"=IFERROR(VLOOKUP(" & ActiveCell.Offset(0, -2).Address(0, 0) & ",'[" & nom_fichier & "]magasin_2'!C:AS,43,FALSE),0)"

A+
0
yaciin Messages postés 23 Date d'inscription mercredi 15 janvier 2014 Statut Membre Dernière intervention 27 août 2014
15 janv. 2014 à 16:58
Parfait. Merci pour tout encore et bonne soirée à toi ;)
0