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.Pastepeuvent ê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 SubBonjour,
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 ...
Oui, ils sont dans le même classeur. Voici, le résultat quand je lance la macro.
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 SubLes #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)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.

