Comment passer dans un paramètre de plage pour la fonction VLookup?
Question
J'ai les deux fonctions ci-dessous dans VBA. La abb00
fonctionne bien mais le abb11
ne fait pas.
Ma question est de savoir comment passer dans un Range
variable comme paramètre pour VLookup
fonction?
Function abb00() 'demo func
abb00 = Application.WorksheetFunction.VLookup("a", _
Worksheets("SheetCache").Range("A:B"), 2, False)
End Function
Function abb11() 'demo func
rangeVar = Worksheets("SheetCache").Range("A:B")
abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
La solution
Vous pouvez le faire de deux manières
Fixation de votre fonction
Votre fonction actuelle ne définit pas une variable de plage. Ça fonctionnera comme ça
Function abb11()
Dim rangeVar as Range
Set rangeVar = Worksheets("SheetCache").Range("A:B")
abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
Passer une plage à votre fonction
Vous pouvez également transmettre une plage à la fonction comme celle-ci
Sub GetRange()
Dim rangeVar As Range
Set rangeVar = Worksheets("SheetCache").Range("A:B")
MsgBox abb2(rangeVar)
End Sub
Function abb2(ByVal rangeVar)
abb2 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
Autres conseils
Pour passer une plage, vous devez d'abord obtenir une référence à une plage.
Vous avez actuellement ceci:
rangeVar = Worksheets("SheetCache").Range("A:B")
Cela n'obtient pas de portée; il lit toute la gamme A:B
dans un tableau variant. Si vous souhaitez obtenir une référence de plage, vous devez utiliser le Set
mot-clé.
Set rangeVar = Worksheets("SheetCache").Range("A:B")
Ironiquement, cela n'a pas d'impact sur la sortie de votre abb11
fonction (Edit: dans Excel 2003), car VLookup
Peut être appliqué à un tableau variant ainsi qu'à une plage. Cependant, la lecture de deux colonnes entières dans un tableau est plutôt inefficace, donc je m'en tiendrais à une référence de plage (Set rangeVar = ...
). ÉDITER Dans Excel 2007/2010, la lecture de deux colonnes entières dans un tableau de variantes fera probablement la mort de votre fonction, car il y a un million de lignes à charger par opposition à 65536 dans Excel 2003, ce que je testais.