Faire un vlookup avec VBA

Bonjour à tous,

Je travaille sur une macro qui me permettra de comparer les données de la semaine en cours par rapport à la semaine précédente.

Je ne peux pas faire un simple copier-coller, car il peut y avoir des pièces en plus ou en moins dans le fichier de la semaine en cours. Du coup, je recherche les données par rapport à la colonne 4 de l'ancien fichier et si N/A apparaît, la cellule indiquera" nouvelle pièce".

La macro fonctionne avec "un site", mais j'en ai plusieurs à analyser. J'ai donc inclus des variables pour ne pas changer le nom du fichier source à chaque lancement. Mais je n'arrive pas à trouver une solution pour la recherchev. Je ne vois pas mon erreur, même si je sais que le code n'est pas bon... Merci de votre aide !

Voici mon code:

Sub Miseenpage()

'Faire un copier les datas de la feuille1

Sheets("WO Duplicate").Select

Range("E1:H1").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Copy

 Sheets("Sheet3").Select

Cells(1, 1).Select

ActiveSheet.Paste

Range("E2").Select

 Cells(1, 6).Value = "Week 0"

Cells(1, 7).Value = "% relative change"

 ' Copier les qty de la semaine -1

Dim wb_S As Workbook

Dim path As String

path = Application.GetOpenFilename(FileFilter:="Excel Files(*.xlsx*),*.xlsx*")

If path <> "False" Then

Set wb_S = Workbooks.Open(path)

Dim DemandLW As Worksheet

Set DemandLW = wb_S.Sheets("Demand Analysis")

ThisWorkbook.Activate

Sheets("Sheet3").Select

Dim f As Integer

f = 2

  While Cells(f, 2) <> ""

  Cells(f, 5).Select

 ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-3],'[DemandLW]!R2C2:R43C5, 4, False)"

 Selection.NumberFormat = "#,##0"

f = f + 1

Wend       

Pour le recherchev tu veux établir une liaison avec l'autre fichier ?

Si oui la syntaxe est (code non testé)

ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-3],'" & wb_s.path & "\[" & wb_s.Name & "]" & DemandLW.Name & "!R2C2:R43C5, 4, False)"

Sinon il y a beaucoup de Select et Selection comme dans le code généré par l'enregistreur de macro :

Par exemple les lignes :

Sheets("WO Duplicate").Select
Range("E1:H1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
 Sheets("Sheet3").Select
Cells(1, 1).Select
ActiveSheet.Paste

peuvent être remplacées par

 Sheets("WO Duplicate").Range(Range("E1:H1"), Range("E1:H1").End(xlDown)).Copy Destination:=Sheets("Sheet3").Cells(1, 1)

Bonsoir Cylfo,

Merci pour la réactivité.

J'ai simplifié le code des "selection" et j'ai le même résultat. Merci bien!

J'ai testé le code la recherchev, c'était bien ce que je voulais faire, mais j'ai un message d erreur. "Application-defined or object- defined error." Pourtant dans le pas à pas, je retrouve bien le fichier source + la tab demand analysis.

Cdt

Bonjour,

J'ai testé le code ci-dessous, il fonctionne. J'ai reproduit dans 2 fichiers, les plages de données mentionnées mais si tu as d'autres demandes, il faudra fournir les 2 fichiers avec quelques données anonymisées.

Sub Miseenpage()

   Dim ws3 As Worksheet
   Set ws3 = ThisWorkbook.Worksheets("Sheet3")

   'Faire un copier les datas de la feuille1
   Sheets("WO Duplicate").Range(Range("E1:H1"), Range("E1:H1").End(xlDown)).Copy Destination:=ws3.Cells(1, 1)

   ws3.Cells(1, 6).Value = "Week 0"
   ws3.Cells(1, 7).Value = "% relative change"

   ' Copier les qty de la semaine -1

   Dim wb_S As Workbook
   Dim path As String

   path = Application.GetOpenFilename(FileFilter:="Excel Files(*.xlsx*),*.xlsx*")

   If path <> "False" Then

      Set wb_S = Workbooks.Open(path)

      Dim DemandLW As Worksheet
      Set DemandLW = wb_S.Sheets("Demand Analysis")

      Dim f As Integer
      With ws3
         f = 2
         While .Cells(f, 2) <> ""
            .Cells(f, 5).FormulaR1C1 = "=VLOOKUP(RC[-3],'" & wb_S.path & "\[" & wb_S.Name & "]Demand Analysis'!R2C2:R43C5, 4, False)"
            .Cells(f, 5).NumberFormat = "#,##0"
            f = f + 1
         Wend
      End With
   End If
End Sub

Bonjour,

J'ai testé de nouveau. Il a fonctionné! Il me manquait une variable.

Par contre deux petits problèmes:

1)

Destination:=ws3.Cells(1, 1)

Le code ne copie pas la sélection dans le fichier de destination.

2)Après l'ouverture du fichier source, la macro s'arrête parce que je dois activer manuellement le fichier de destination. Mais pour ca, je peux toujours mettre un ". Activate".

Pour la copie : dans le code que je t'ai envoyé, ws3 pointe vers une feuille "Sheet3" qui est dans le même classeur que la macro et (non modifié) et Sheets("WO Duplicate") concerne le classeur actif lorsque la macro s'exécute. "Sheet3" et "WO Duplicate" sont dans le même classeur ?

Pour l'arrêt de la macro : dans le code que je t'ai envoyé, la macro ne s'arrête pas et il est nul besoin d'activer le classeur de destination puis que la destination est explicitement indiquée.

Pour plus d'infos, envois à minima le contenu de la procédure car tu as certainement modifié ou oublier quelque chose (il me manquait une variable ... ) et indiques également dans quel classeur est hébergée la procédure et si les onglets "Sheet3" et "WO Duplicate" sont dans le même classeur (si non expliques clairement où ils sont situés).

Oui, ils sont dans le même classeur. Voici, le résultat quand je lance la macro.

20230321 144558

Pour l'arrêt de la macro, effectivement c'est de ma faute. Il y avait une ligne qui n'était pas à sa place. J'avais essayé d'imbriquer un autre code. Néanmoins, j'ai toujours ce problème. Voici le code dans vbe du début jusqu'à la recherchev. Je peux copier le reste si besoin, mais pas en lien avec le sujet et non testé.

Sub Duplicate()

Dim CstName As String

Dim Namefile As String

' Enlever les doublons

Sheets("Sheet1").Copy Before:=Sheets(1)

Sheets("Sheet1 (2)").Range("$A:$S").RemoveDuplicates Columns:=8, Header:=xlYes

Sheets("Sheet1 (2)").Name = "WO Duplicate"

CstName = Cells(2, 3)

Namefile = "Analysis" & " " & CstName & " " & "CW" & DatePart("ww", Date, vbSunday)

End Sub

Sub Miseenpage()

Dim ws3 As Worksheet

Set ws3 = ThisWorkbook.Worksheets("Sheet3")

'Faire un copier les datas de la feuille1

Sheets("WO Duplicate").Range(Range("E1:H1"), Range("E1:H1").End(xlDown)).Copy

Destination = ws3.Cells(1, 1)

ws3.Cells(1, 5).Value = "Week -1"

ws3.Cells(1, 6).Value = "Week 0"

ws3.Cells(1, 7).Value = "% relative change"

 ' Copier les qty de la semaine -1

Dim wb_S As Workbook

Dim path As String

path = Application.GetOpenFilename(FileFilter:="Excel Files(*.xlsx*),*.xlsx*")

If path <> "False" Then

Set wb_S = Workbooks.Open(path)

Dim DemandLW As Worksheet

Set DemandLW = wb_S.Sheets("Demand Analysis")

Dim f As Integer

f = 2

With ws3

  While Cells(f, 2) <> ""

  .Cells(f, 5).FormulaR1C1 = "=VLOOKUP(RC[-3],'" & wb_S.path & "\[" & wb_S.Name & "]Demand Analysis'!R2C2:R43C5, 4, False)"

  .Cells(f, 5).NumberFormat = "#,##0"

  .Cells(f, 6).FormulaR1C1 = "=SUMIF(Sheet1!R2C6:R2077C13,Sheet3!RC[-4],Sheet1!R2C13:R2077C13)"

  .Cells(f, 6).NumberFormat = "#,##0"

f = f + 1

Wend

End With

End If

End Sub

Les #N/A sont logiques, dans la formule tu indiques que tu utilises la valeur de la cellule située en colonne -3 (donc "B") qui est vide ...

Dans le code copié, est-ce une erreur de copie ?

Sheets("WO Duplicate").Range(Range("E1:H1"), Range("E1:H1").End(xlDown)).Copy

Destination = ws3.Cells(1, 1)

car dans le code que je t'ai fourni est :

Sheets("WO Duplicate").Range(Range("E1:H1"), Range("E1:H1").End(xlDown)).Copy Destination:=ws3.Cells(1, 1)

Oui. Je suis tout à fait d'accord pour les n/a. Je voulais juste montrer le résultat obtenu en lançant la macro tel quel.

Par contre, il ne veut pas entendre parler de ":"

20230321 201007 20230321 201057

Si j'ai écrit l'instruction sur une seule ligne c'est bien parce que c'est une seule et même instruction, si tu veux la mettre sur 2 lignes, mets un "_" à la fin de la 1ère ligne.

Oh purée, oui effectivement. Sous mon nez en plus... Le code fonctionne parfaitement maintenant. Merci de ton aide. Je vais marquer le sujet comme résolu.

Rechercher des sujets similaires à "vlookup vba"