[英]Index Match using VBA Function in Microsoft Excel
我是 Excel VBA 的新手,我正在嘗試編寫一個 function 讓我在其他列中使用INDEX
、 MATCH
和COUNTIFS
函數來查找多個匹配值。
我有一個名為Price
的表,其中包含基於指定類別在不同位置提供的一些價格:
Area Category Cost Retail Price Wholesale Price
USA Bad 1 13 25
Canada Okay 2 14 26
Mexico Good 3 15 27
USA Excellent 4 16 28
Canada Bad 5 17 29
Mexico Okay 6 18 30
USA Good 7 19 31
Canada Excellent 8 20 32
Mexico Bad 9 21 33
USA Okay 10 22 34
Canada Good 11 23 35
Mexico Excellent 12 24 36
在 Excel 中,我可以使用數組公式來獲得它(請參見此處的視頻示例)。 下面的公式讓我得到Mexico
Okay
類別的Wholesale Price
{=INDEX(Price,MATCH(1,COUNTIFS(L12,Price[Area],M12,Price[Category]),0),MATCH(N12,Price[#Headers],0))}
在哪里
L12 = Mexico
M12 = Okay
N12 = Wholesale Price
我想制作一個 VBA function ProdPrice
,它可以返回這個值,而沒有一個看起來凌亂的公式。 這是我到目前為止所擁有的:
Function ProdPrice(locs, cat, pricetype)
'Get column number corresponding to selected "pricetype"
col_num = WorksheetFunction.Match( _
pricetype, _
ActiveSheet.ListObjects("Price").HeaderRowRange.Select, _
0)
ProdPrice = WorksheetFunction.Index( _
ActiveSheet.ListObjects("Price"), _
WorksheetFunction.Match( _
1, _
WorksheetFunction.CountIfs( _
ActiveSheet.ListObjects("Price").ListColumns("Area").DataBodyRange.Select, _
locs, _
ActiveSheet.ListObjects("Price").ListColumns("Category").DataBodyRange.Select, _
cat), _
0), _
col_num)
End Function
為了更好的可讀性,我將_
分成兩個部分,而不是單個調用。
當我運行它時,我得到一個#VALUE!
output。
關於我如何 go 對此有何建議? 同樣據我了解,上述 function 將在工作表中查找名為price
的表,其中 function 被調用 - 我希望它能夠在工作簿中查看price
。
我假設您的值始終在 Excel 結構化表中
評論:
|
特點area
和category
)請閱讀代碼的注釋並根據您的需要進行調整
代碼
Public Function lookupPrice(ByVal table As Range, ByVal lookup_area As String, ByVal lookup_category As String, ByVal pricetype_header As String) As Variant
' Define column headers
Dim areaHeader As String
Dim categoryHeader As String
areaHeader = "Area"
categoryHeader = "Category"
' Get area column number from headers
Dim areaColumn As Long
areaColumn = Application.Match(areaHeader, table.ListObject.HeaderRowRange, False)
' Get category column number from headers
Dim categoryColumn As Long
categoryColumn = Application.Match(categoryHeader, table.ListObject.HeaderRowRange, False)
' Get price column number from headers according to function parameter
Dim priceColumn As Long
priceColumn = Application.Match(pricetype_header, table.ListObject.HeaderRowRange, False)
' Get area column values into 1d array
Dim areaValues As Variant
areaValues = WorksheetFunction.Transpose(Application.Index(table.Columns(areaColumn), 0, 1))
' Get category column values into 1d array
Dim categoryValues As Variant
categoryValues = WorksheetFunction.Transpose(Application.Index(table.Columns(categoryColumn), 0, 1))
' Define and redimension an array to hold the concatenated area and category values
Dim areaCategoryValues() As Variant
ReDim areaCategoryValues(1 To UBound(areaValues))
' Concatenate the area and category values and store them in an array
Dim counter As Long
For counter = 1 To UBound(areaValues)
areaCategoryValues(counter) = areaValues(counter) & "|" & categoryValues(counter)
Next counter
' Get the matching row according to lookup values
Dim resultRow As Long
resultRow = Application.Match(lookup_area & "|" & lookup_category, areaCategoryValues, False)
' Get the result value according to the price column number
Dim result As Variant
result = Application.Index(table.Columns(priceColumn), resultRow)
' Return the value
lookupPrice = result
End Function
讓我知道它是否有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.