VLOOKUP avec nombre de colonnes qui change
Bonjour tout le monde,
Je voudrais savoir comment "generaliser" ce VLOOKUP dans le code ci-dessous:
Sub copydata()
Dim lngCounter As Long
Dim lngMax As Long
Dim lngCol As Long
Dim wksTwo As Worksheet
'copier de la sheet1 a la sheet2, on copie en valeurs
Set wksTwo = Worksheets("Sheet2")
wksTwo.Cells.ClearContents
Worksheets("Sheet3").Cells.ClearContents
Worksheets("Sheet1").Range("zoneselect").Copy
wksTwo.Range("B1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, skipBlanks:=False, Transpose:=False
' On enleve les blancs entre la sheet 2 à la sheet3
wksTwo.Range("A1:BB1").Copy Sheets("Sheet3").Range("B1")
Sheets("Sheet3").Range("B1").CurrentRegion.SpecialCells(xlCellTypeBlanks).Delete shift:=xlToLeft
Worksheets("Sheet3").Select
Range("A1:BB1").Select
Selection.Cut
Sheets("Sheet3").Select
Range("B1").Select
ActiveSheet.Paste
Selection.SpecialCells(xlCellTypeBlanks).Select
Application.CutCopyMode = False
Selection.Delete shift:=xlToLeft
'On selectionne l'action qui a le plus de dates pour la copier dans la sheet3
With wksTwo
For lngCounter = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column
If InStr(1, .Cells(1, lngCounter).Value, "FP") > 0 Then
If .Cells(.Rows.Count, lngCounter).End(xlUp).Row > lngMax Then
lngMax = .Cells(.Rows.Count, lngCounter).End(xlUp).Row
lngCol = lngCounter
End If
End If
Next lngCounter
'MsgBox "Greatest length is " & lngMax & " beneath Range " & Cells(1, lngCol).Address(0, 0)
.Range(.Cells(2, lngCol), .Cells(lngMax, lngCol)).Copy Destination:=Worksheets("Sheet3").Range("A2")
End With
'Début du VLOOKUP il faudrait le généraliser en fonction du nombre de stocks
Sheets("Sheet3").Select
Range("B2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],Sheet2!RC:R[5563]C[1],2,TRUE)"
Range("B2").Select
Selection.AutoFill Destination:=Range("B2:B5565")
Range("B2:B5565").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],Sheet2!R2C2:R5565C3,2,TRUE)"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],Sheet2!R2C4:R5565C5,2,TRUE)"
Range("D2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-3],Sheet2!R2C6:R5565C7,2,TRUE)"
Range("C2").Select
Selection.AutoFill Destination:=Range("C2:C5565")
Range("C2:C5565").Select
Range("D2").Select
Selection.AutoFill Destination:=Range("D2:D5565")
Range("D2:D5565").Select
End SubThe VLOOKUP est sur la sheet3 et doit etre fait en fonction du nombre de colonnes.
Dans cet exemple "statique" il y a 3 colonnes mais celui-ci varie en fonction du nombre de stocks que vous verrez en sheet2 ainsi que de la periode.
Voici le fichier
Je vous remercie
R
Banzai64...comment dire...you rock!!!!!:-)
Merci beaucoup pour ton aide!!
J'aimerais bien tout de même par curiosité comprendre entierement ton code! quand si jamais t'as le temps d'expliquer rapidement c'est pas pressé!
LgDep = 2 ' Ligne de départ du tableau dans la page Sheet2
ClDep = 2 ' Colonne de départ du tableau dans la page Sheet2
With Sheets("Sheet2")
ClFin = .Cells(LgDep, Columns.Count).End(xlToLeft).Column
LgFin = .Range(.Cells(1, ClDep), .Cells(1, ClFin)).EntireColumn.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End With
Nblg = Range("A" & Rows.Count).End(xlUp).Row
For I = ClDep To ClFin Step 2
With Range(Cells(2, 2 + (I - ClDep) / 2), Cells(Nblg, 2 + (I - ClDep) / 2))
.Formula = "=VLOOKUP(RC1,Sheet2!R" & LgDep & "C" & I & ":R" & Nblg & "C" & I + 1 & ",2,FALSE)"
End With
Next IMerci encore!!!
A bientôt!
R
Bonjour
En rapide (code non compliqué)
Recherche de la dernière colonne et de la dernière ligne dans Sheet2
With Sheets("Sheet2")
ClFin = .Cells(LgDep, Columns.Count).End(xlToLeft).Column
LgFin = .Range(.Cells(1, ClDep), .Cells(1, ClFin)).EntireColumn.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End WithPour chaque groupe de 2 colonnes
ClDep To ClFin Step 2La formule VLOOKUP :
I me sert de numéro de colonne
LgDep est la 1ère ligne de la recherche
LgFin est la dernière ligne de la recherche
C'est tout
Merci beaucoup banzai!!
A bientot!!
Ah au fait petite question c'est compliqué de modifier le vlookup en macro "pur vba" pour que les cellules qui sortent soient des valeurs?
a+
Bonjour
Si je veux l'ameliorer encore et faire de sorte a ce que ca laisse des blancs comme dans le code ci-dessus de Banzai, mais qu'a partir de la date de cotation c'est a dire autrement dit a partir de la date de la cellule C5 de la worksheet 1 par exemple, il fasse un vlookup en mettant la valeur approximative en cas d'absence de valeur
Merci!!
Bonjour
Je n'ai pas trop suivi ton programme (ce que tu fais avant les formules)
Quelles différences entre le tableau de la page "Sheet1" et le tableau de la page "Sheet2" ?
Moi je n'ai pas trouvé de différence
remy444 a écrit :il fasse un vlookup en mettant la valeur approximative en cas d'absence de valeur
La formule le fait déjà
Le 4ème paramètre est positionné sur VRAI
Extrait de l'aide
RECHERCHEV(valeur_cherchée;table_matrice;no_index_col;valeur_proche)
valeur_proche représente une valeur logique indiquant si vous souhaitez que la fonction RECHERCHEV recherche une valeur exacte ou voisine de celle que vous avez spécifiée. Si cet argument est VRAI ou omis, une donnée proche est renvoyée. En d'autres termes, si aucune valeur exacte n'est trouvée, la valeur immédiatement inférieure à valeur_cherchée est renvoyée. Si valeur_proche est FAUX, la fonction RECHERCHEV renvoie exactement la valeur recherchée. Si aucune valeur ne correspond, la valeur d'erreur #N/A est renvoyée.
Si l'argument valeur_proche est VRAI, les valeurs de la première colonne de l'argument table_matrice doivent être placées en ordre croissant : ..., -2, -1, 0, 1, 2, ..., A-Z, FAUX, VRAI. Sinon, la fonction RECHERCHEV peut donner une valeur incorrecte. Si l'argument valeur_proche est FAUX, les éléments de la table ne doivent pas nécessairement être classés.
Yes parfait Banzai!!
Merci beaucoup encore une fois!!
