VLOOKUP dans autre classeur en VBA

Colombine

XLDnaute Junior
Bonjour à tous,
Encore besoin d'un petit coup de pouce! J'ai du faire une erreur mais je ne sais pas ou.
Mon PB : J'ai 2 classeurs ouverts en simultanés et je recherche une info de l'un sur l'autre-->

dans le classeur 2, je selectionne ma cellule (ligne,colonne BL) , je cherche si elle existe dans mon classeur 1 en colonne S.
Si la valeur existe dans mon classeur 1 je veux mettre 1 dans mon classeur 2 en colonne BM sinon je met 0.
Je refais l'action sur toutes les lignes de mon tableau !

-----------------------------------------------------------------------
Sub Macro1()

Dim MaPlageRecherche As Range
Dim ChercheTest As String
Dim Ws As Worksheet

Worksheets("Listing tests").Select
Derlign = ActiveSheet.UsedRange.Rows.Count
dercol = 64 'Correspond à la colonne BL

i = 3

For i = 3 To Derlign

Set Ws = Workbooks("Classeur2.xls").Worksheets("Listing tests")
With Workbooks("classeur1.xls").Worksheets("cpsuivies")
DerLigne = .Range("A" & .Rows.Count).End(xlUp).Row
Set MaPlageRecherche = .Columns("s:s")
ChercheTest = Ws.Cells(i, 64).Value
Ws.Cells(i, dercol + 1) = Application.VLookup(ChercheTest, MaPlageRecherche, 1, 0)
End With
Next i
End Sub
______________________________________________________________________________

je pense que l'erreur est dans ma ligne en gras mais je ne trouve pas.
Si vous pouviez m'aiguiller ....
Merci beaucoup
 

job75

XLDnaute Barbatruc
Re : VLOOKUP dans autre classeur en VBA

Bonjour Colombine,

Qu'est-ce qui vous fait dire qu'il y a une erreur ?

Un blocage de la macro ou des résultats erronés ?

Déjà a priori si vous voulez des 0 et des 1 utilisez ce code :

Code:
Ws.Cells(i, dercol + 1) = IIf(IsError(Application.Match(ChercheTest, MaPlageRecherche, 0)), 0, 1)
De plus si Ws.Cells(i, 64) peut-être un nombre, déclarez ChercheTest As Variant.

A+
 
Dernière édition:

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

c'est super , cela marche impeccable en changeant la déclaration de variable et en utilisant votre ligne de programme.

Par contre je n'ai pas bien compris la ligne de programme, surtout le "IIf" , pouvez vous me l'expliquer?

Merci
 

job75

XLDnaute Barbatruc
Re : VLOOKUP dans autre classeur en VBA

Re,

Notez qu'on peut se passer de IIf comme ceci :
Code:
Ws.Cells(i, dercol + 1) = -IsNumeric(Application.Match(ChercheTest, MaPlageRecherche, 0))
Je vous laisse étudier ce code très simple mais pas forcément facile à comprendre.

A+
 

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

Et voilà encore une connaissance de plus ! Merci

Par contre j'aimerais affiner ce que nous venons de faire car cela ne correspond pas excatement à ce que j'ai besoin. Je vous explique:

dans mon classeur 1, j'ai deux onglets : 1 onglet ou je vais trouver le numéro cherché en colonne S MAIS avant de mettre 1 dans mon classeur2 servant de résultat, j'ai besoin de tester que le nom présent dans ma colonne 1 associé est bien présent dans mon deuxième onglet en colonne1 aussi.

Je ne sais pas si c'est assez clair.
:confused:
 

job75

XLDnaute Barbatruc
Re : VLOOKUP dans autre classeur en VBA

Re,

Alors modifiez le 1er argument du IIf :

Code:
Ws.Cells(i, dercol + 1) = IIf(IsError(Application.Match(xxx)*Application.Match(yyy)), 0, 1)
Et sans le IIf :

Code:
Ws.Cells(i, dercol + 1) = -IsNumeric(Application.Match(xxx)*Application.Match(yyy))
A+
 

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

Là j'avoue que je me sens dépassé ! je ne comprends pas comment s'en passer par un vlookup comment lui dire:si tu trouves mon numéro sur cet onglet, cherche le nom associé en colonne A puis va voir si tu trouves ce nom en colonne a dans mon deuxième onglet. Si tu le trouves met 1 dans mon classeur résultat sinon met 0.
 

job75

XLDnaute Barbatruc
Re : VLOOKUP dans autre classeur en VBA

Re,

Je pense que ceci doit convenir.

Remplacez la ligne :

Code:
Ws.Cells(i, dercol + 1) = IIf(IsError(Application.Match(ChercheTest, MaPlageRecherche, 0)), 0, 1)
par ces 4 lignes :

Code:
Ws.Cells(i, dercol + 1) = 0
lig = Application.Match(ChercheTest, MaPlageRecherche, 0)
If IsNumeric(lig) Then _
If LCase(Ws.Cells(i, 1)) = LCase(.Cells(lig, 1)) Then Ws.Cells(i, dercol + 1) = 1
Important : lig doit être déclaré As Variant.

Nota : je vois que vous n'avez pas déclaré toutes vos variables.

A+
 

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

J'ai l'impression que je ne suis pas claire alors voilà de façon precise ce que je recherche a faire et je vous joint des extractions de mes fichiers:


Dans classeur2, selectionner cellule(BL3)
>>> La rechercher dans classeur 1 ,onglet"cpsuivies" colonne S
si existe pas >>> mettre 0 dans cellule(bm3) du classeur 2
si existe, selectionner le nom associé à la ligne dans la colonne A et vérifier que le nom existe dans onglet"données" colonne A
si existe pas >>> mettre 0 dans cellule(bm3) du classeur 2
si existe >>> mettre 1 dans cellule(bm3) du classeur 2

Merci à tous ceux qui pourront m'aider.
Bonne soirée
 

Pièces jointes

  • Classeur1.xls
    75.5 KB · Affichages: 110
  • Classeur2.xls
    27.5 KB · Affichages: 95
  • Classeur1.xls
    75.5 KB · Affichages: 94
  • Classeur2.xls
    27.5 KB · Affichages: 98
  • Classeur1.xls
    75.5 KB · Affichages: 116
  • Classeur2.xls
    27.5 KB · Affichages: 107

job75

XLDnaute Barbatruc
Re : VLOOKUP dans autre classeur en VBA

Bonjour Colombine, le forum,

Rien ne vaut un fichier pour expliquer clairement les choses !

Voyez cette macro dans Classeur2.xls :

Code:
Sub Resultat()
Dim F As Worksheet, F1 As Worksheet, F2 As Worksheet
Dim cel As Range, lig As Variant
Set F = Workbooks("Classeur1.xls").Sheets("cpsuivies")
Set F1 = Workbooks("Classeur1.xls").Sheets("Données")
Set F2 = Workbooks("Classeur2.xls").Sheets("Listing Tests")
Application.ScreenUpdating = False 'accélère la macro
For Each cel In F2.Range("BL3", F2.[BL65536].End(xlUp))
  cel.Offset(, 1) = 0
  lig = Application.Match(cel, F.[S:S], 0)
  If IsNumeric(lig) Then
    If IsNumeric(Application.Match(F.Cells(lig, 1), F1.[A:A], 0)) _
      Then cel.Offset(, 1) = 1
  End If
Next
End Sub
Et cliquez sur le bouton.

Edit : notez qu'on peut aussi utiliser Application.CountIf (NB.SI) :

Code:
If Application.CountIf(F1.[A:A], F.Cells(lig, 1)) Then cel.Offset(, 1) = 1
A+
 

Pièces jointes

  • Classeur1.xls
    74.5 KB · Affichages: 120
  • Classeur1.xls
    74.5 KB · Affichages: 124
  • Classeur1.xls
    74.5 KB · Affichages: 128
  • Classeur2.xls
    32.5 KB · Affichages: 127
  • Classeur2.xls
    32.5 KB · Affichages: 150
  • Classeur2.xls
    32.5 KB · Affichages: 117
Dernière édition:

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

En effet avec un fichier on comprends mieux !! Rires

C'est super ça fonctionne à la perfection.
Maintenant il faut que je comprenne exactement comment ça fonctionne pour penser à utiliser cette fonction qui fonctionne aussi bien voir mieux qu'un Vlookup.

Merci pour votre patience, ce forum est vraiment une mine d'or car c'est pas super facile de développer quand on n'est pas des pros et qu'on tatonne par soi même.

Bonne soirée.
 

Colombine

XLDnaute Junior
Re : VLOOKUP dans autre classeur en VBA

Je reviens vers vous car j'ai voulu intégré un nouvel élément dans cette programmation mais je n'y arrive pas.

Lors de l'éxécution du programme , l'utilisateur entre une référence de colonne que je met dans une variable D1
Je voudrais rajouter dans mon programme le control d'une cellule avec cet indice à cet endroit :

If IsNumeric(Application.Match(F.Cells(lig, 1), F1.[A:A], 0)) _
ICI SI sur la ligne correspondante , la cellule (lig, D1) est de couleur 41 resultat = 1 sinon resultat =0
Then cel.Offset(, 1) = 1

Si vous voyiez ce que je veux dire !! Rires , pas facile ni de programmer ni d'expliquer

merci pour votre aide
 

Discussions similaires

Réponses
0
Affichages
148
Réponses
2
Affichages
236

Statistiques des forums

Discussions
312 206
Messages
2 086 207
Membres
103 158
dernier inscrit
laufin