XL 2010 [Resolu]RechercheV avec variable

dds69

XLDnaute Nouveau
Bonjour,

Je travaille actuellement sur une macro qui permet de mapper les valeurs de colonne sur deux fichiers différents grâce à la rechercheV.

Explications des fichiers :
1er fichier : Contient les informations auxquelles il faut comparer les informations du deuxième fichier. C'est donc sur ce fichier que la macro s'effectue.
fichier1.PNG

2eme fichier : Contient les informations de comparaison du premier fichier sur une plage de 4 colonnes et de X lignes (lignes variables selon le fichier).
fichier2.PNG

De ce fait, j'essaye de mettre une macro qui permettrait automatiquement de faire la comparaison du fichier 1 avec le fichier de taille variable (le fichier2).
Pour cela je souhaite mettre sous variable la zone de comparaison du fichier 2 qui est attribué dans la rechercheV.​

Voici mon code :

Dim Plage_Clients As Range
Set Plage_Clients = Range("C2:F" & [A65000].End(xlUp).Row).CurrentRegion
ActiveWorkbook.Names.Add Name:="Plage_Clients", RefersTo:=Plage_Clients

'
Workbooks.Open Filename:= _
"C:\DESADV DDA juillet 2016.xlsx"
Windows("Copie de 46093_Ano DESADV_JUILLET-2016.xlsb").Activate

Range("H2").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!"Plage_Clients",2,FALSE)"
Selection.AutoFill Destination:=Range("H2:H465")
Range("H2:H465").Select​

Comme vous pouvez le voir dans le 1er fichier, il me renvoi #NOM? . Je ne suis pas un pro en VBA et donc je bloque légèrement.
Je ne sais pas si je dois convertir ma variable dans un autre type ? ou si c'est autre chose.

Je vous remercie par avance et reste à disposition si vous avez besoin de complément

dds69
 

Modeste

XLDnaute Barbatruc
Bonjour dds69,

C'est super sympa de nous fournir des images (quand j'aurai des petits-enfants, j'aurai de quoi leur faire faire du coloriage!)
Ceci dit, dans l'image, j'ai un peu de mal à gratter pour aller voir quelle formule figure en réalité dans la cellule.
J'ai plus de mal encore à comprendre dans quel fichier tu as défini la plage nommée ... dans celui qui n'était pas encore ouvert :confused:
 

gosselien

XLDnaute Barbatruc
Bonjour,
en lisant la charte, tu aurais vu ça, ou alors on en fait un forum photoshop :) :)

"5 – La possibilité de joindre des fichiers EXCEL est donnée sur ce forum. Ne pas hésiter à utiliser cette fonction, tout en veillant que les données soient bidons et donc qu’aucune donnée confidentielle, nominative ne soit dans le fichier EXCEL."

P.
 

dds69

XLDnaute Nouveau
Effectivement j'aurais pu mettre directement les fichiers en questions, ce que je fais de suite.

Au plaisir de faire le bonheur de tes futurs petits enfants @Modeste
 

Pièces jointes

  • DESADV DDA juillet 2016.xlsx
    44.4 KB · Affichages: 59
  • Copie de 46093_Ano DESADV_JUILLET-2016.xlsx
    43.1 KB · Affichages: 58

Modeste

XLDnaute Barbatruc
Re,
Salut gosselien,

Je reviens avec ma question de tout à l'heure (non pas que je sois particulièrement têtu, mais parce que je ne suis pas certain de bien comprendre):

  • la macro figure dans le fichier "Copie de 46093_Ano DESADV_JUILLET-2016" (puisque c'est ensuite seulement que tu ouvres le classeur 'DESADV DDA juillet 2016.xlsx")?
  • en conséquence, quand tu définis ta plage nommée au début de ta macro, c'est dans le classeur "Copie de ..." qu'elle est définie?
Jusque là, sommes-nous d'accord?

Si oui, dans la formule, tu agis ensuite comme si la plage nommée figurait dans le fichier 'DESADV DDA juillet 2016.xlsx" ... ça paraît compliqué!? ... ou alors je m'égare??

La question "à 100 balles" étant ici (avant de se faire du mal :p): "pourquoi ne pas se contenter d'écrire la formule "à la main", en utilisant une plage suffisamment étendue dans le classeur "DESADV DDA... ", du genre $C$2:$D$1000 (ou $C$2:$D$5000 voire même $C$2:$D$30000)?

 

dds69

XLDnaute Nouveau
Bonjour modeste,

Lorsque je définis ma plage dans la macro, celle-ci représente la plage du fichier n°2 (DESADV DDA Juillet) car ce sont les cellules de ce fichier qui viennent faire la comparaison du 1er fichier.

Pour répondre à ta question à 100 balles (qui d'ailleurs reste une bonne question) : j'ai déjà effectué un premier jet (fichier 1 et 2) ou je configure manuellement les valeurs et ça fonctionne très bien. Seulement le fichier est destiné à des utilisateurs qui n'ont pas le temps ni la culture d'excel et donc il faut que ça leur soit le plus simple et rapide possible.
Voilà pourquoi je m'en-tête sur une macro :).

dds69
 

Modeste

XLDnaute Barbatruc
Bonjour,

Lorsque je définis ma plage dans la macro, celle-ci représente la plage du fichier n°2 (DESADV DDA Juillet) car ce sont les cellules de ce fichier qui viennent faire la comparaison du 1er fichier
L'objectif est bien celui que j'avais pressenti, mais le souci également: tu ouvres seulement ton fichier DESADV DDA Juillet après avoir défini ta plage nommée (et donc, en réalité, celle-ci est définie dans ton fichier "Copie de 46093_Ano DESADV_JUILLET-2016" ... je viens de tester et vérifier)

Essaie en modifiant l'ordre des instructions:
VB:
Sub test()
Dim Plage_Clients As Range
' Set Plage_Clients = Range("C2:F" & [A65000].End(xlUp).Row).CurrentRegion
' ActiveWorkbook.Names.Add Name:="Plage_Clients", RefersTo:=Plage_Clients

Workbooks.Open Filename:="C:\DESADV DDA juillet 2016.xlsx"
Set Plage_Clients = ActiveWorkbook.Sheets(1).Range("C2:D" & ActiveWorkbook.Sheets(1).[A65000].End(xlUp).Row) '.CurrentRegion
ActiveWorkbook.Names.Add Name:="Plage_Clients", RefersTo:=Plage_Clients

'Windows("Copie de 46093_Ano DESADV_JUILLET-2016.xlsb").Activate
[/FONT]
With ThisWorkbook.Sheets(1).Range("H2")
  .FormulaR1C1 = "=VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)"
  .AutoFill Destination:=Range("H2:H465")
End With
[FONT=Tahoma]' ActiveWorkbook.Close savechanges:=False
End Sub
 

dds69

XLDnaute Nouveau
Bonjour modeste,

Ça marche parfaitement.
Tout fois je souhaite intégrer une fonction SI dans ma rechercheV pour dire que si le résultat est égal à 0/1/1900 alors il laisse la case blanche sinon il affiche le résultat.
En rechercheV à la main ça fonctionne bien. En revanche avec la macro ma formule ne passe pas :/

Voici ma formule en rechercheV
VB:
=SI(RECHERCHEV(F2;'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!$C$2:$F$600;2;FAUX)=0/1/1900;"";RECHERCHEV(F2;'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!$C$2:$F$600;2;FAUX))

Et voici ma formule adaptée à la macro
VB:
.FormulaR1C1 = "=SI(VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)=0/1/1900;"";VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE))"

Je pense que mon SI est mal disposé.

dds69
 

Modeste

XLDnaute Barbatruc
Le problème est multiple, j'en ai peur :eek:
  • sans doute tes guillemets dans le Valeur_si_Vrai, qu'il faudrait doubler (puisque ta formule est déjà entre guillemets)
  • si tu écris le RECHERCHEV en Anglais, il faut en faire autant avec le SI (qui devrait donc devenir IF, si je ne m'abuse :D)
  • pour ton test, tu peux te contenter de comparer avec 0 (c'est le format de la cellule qui fait que le contenu apparaît sous la forme #0/01/1900#)

J'écrirais donc:
Code:
FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)=0,"""",VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE))"

[Edit:] on peut éviter le AutoFill et raccourcir le code comme suit:
VB:
Sub test()
Dim Plage_Clients As Range

Workbooks.Open Filename:="C:\DESADV DDA juillet 2016.xlsx"
Set Plage_Clients = ActiveWorkbook.Sheets(1).Range("C2:D" & ActiveWorkbook.Sheets(1).[A65000].End(xlUp).Row) '.CurrentRegion
ActiveWorkbook.Names.Add Name:="Plage_Clients", RefersTo:=Plage_Clients

ThisWorkbook.Sheets(1).Range("H2:H465").FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)=0,"""",VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE))"
'ActiveWorkbook.Close savechanges:=False
End Sub
 
Dernière édition:

dds69

XLDnaute Nouveau
Bonjour,

ça fonctionne parfaitement :)

Je fais des retouches au fur et à mesure pour voir ce que je peux améliorer;

Merci bcp

Edit : Est - il possible que dans le range de H2:H465 ça prenne l'ensemble des cases faisant parties du tableau de la colonne H ?
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Bonjour,

Il ne faudra pas que tu modifies trop souvent tes derniers messages (si j'ai vu le dernier, le fait que tu le modifies n'est signalé nulle part: on ne sait donc pas que tu as ajouté une question).
En plus je lisais ce même message, ce matin où tu disais rencontrer un problème ... le temps que je commence à répondre, tu avais modifié le message pour dire que tout fonctionnait :confused: je vais devenir schizophrène, à ce régime là :rolleyes:

Essaie de modifier le dernière ligne comme suit:
VB:
With ThisWorkbook.Sheets(1)
    derligne = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("H2:H" & derligne).FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)=0,"""",VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE))"
End With
 

dds69

XLDnaute Nouveau
Bonjour modeste,

Oui je m'excuse pour l'incessant changement de mon message dû a une petite erreur syntaxique de ma part qui ne me renvoyais pas le résultat escompté.

ça marche parfaitement, merci bcp de ton aide.

Si ça peut aider d'autres personnes voici le code final

VB:
Sub Macro2()
'
' Macro2 Macro
'
Dim Plage_Clients As Range

    Workbooks.Open Filename:= _
        "C:\Desktop\DESADV DDA juillet 2016.xlsx"
    'Windows("Copie de 46093_Ano DESADV_JUILLET-2016.xlsb").Activate
    Set Plage_Clients = ActiveWorkbook.Sheets(1).Range("C2:D" & ActiveWorkbook.Sheets(1).[A65000].End(xlUp).Row) '.CurrentRegion
ActiveWorkbook.Names.Add Name:="Plage_Clients", RefersTo:=Plage_Clients

With ThisWorkbook.Sheets(1)
    derligne = .Cells(Rows.Count, 1).End(xlUp).Row
    .Range("H2:H" & derligne).FormulaR1C1 = "=IF(VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE)=0,"""",VLOOKUP(RC[-2],'[DESADV DDA juillet 2016.xlsx]Contrôle EDI DESADV'!Plage_Clients,2,FALSE))"
End With

End Sub

Encore merci de ton aide :)

dds69
 

Discussions similaires

Réponses
3
Affichages
498

Statistiques des forums

Discussions
312 069
Messages
2 085 039
Membres
102 763
dernier inscrit
NICO26