我正在尝试使用Application.match来查找范围为A1:Z1和A2:Z2的值匹配的列。例如,第一行包含不同的水果名称,第二行包含颜色。所以,假设我正在寻找一个带有蓝色香蕉的柱子,这样的东西应该可以工作:
mycolumn = Application.Match("Banana" & "Blue", Worksheet("Coloured_Fruit").Range(A1:Z1) & Worksheet("Coloured Fruit").Range(A2:Z2), 0)
为了匹配以下数据表中的蓝色香蕉:
A1:banana B1:apple C1:banana D1:orange
A2:green B2:blue C2:blue D2:green
这应该返回C,因为C列是表示蓝色香蕉的列。
但是我的类型不匹配。范围与正在进行匹配的代码位于不同的工作表上。当我只想匹配一行时,这种方法很好,但不是两个。网络搜索表明上述行应该有效。
我尝试在表达式上使用Evaluate,但这也不起作用。
有任何建议怎么做?
答案 0 :(得分:1)
代码中的MATCH失败,因为“&” operator仅适用于VBA中的字符串。在Excel工作表中,“&”如果作为数组公式的一部分输入,则可以连接范围。
对MATCH公式的修改似乎应该在VBA中起作用,也会返回“类型不匹配”错误。这些包括将两个范围分配到一个Range变量(Range(“A1:Z1”,“A2:Z2”)),或使用UNION函数(Union(“A1:Z1”,“A2:Z2)) “))出于同样的目的。对“.Value”中的任何一个进行排位都没有帮助。
以下代码可以解决问题:
Sub matchit()
Dim mycolumn As Long
Dim oRng1 As Range, oRng2 As Range
With ThisWorkbook.Sheets("Coloured_Fruit")
Set oRng1 = .Range("A1:Z1")
Set oRng2 = .Range("A2:Z2")
.Names.Add Name:="nRng1", RefersTo:=oRng1
.Names.Add Name:="nRng2", RefersTo:=oRng2
mycolumn = Evaluate("IFERROR(MATCH(1,--(nRng1=""Banana"")*--(nRng2=""Blue""),0),0)")
.Names("nRng1").Delete
.Names("nRng2").Delete
End With
End Sub
专注于MATCH表达式(并删除EVALUATE函数所需的额外双引号),
由于子例程返回单个值,您可能需要考虑将其重新命名为VBA函数。