Excel VBA类型在范围并置中不匹配,用于多个范围匹配尝试

时间:2013-01-18 19:36:23

标签: excel-vba match vba excel

我正在尝试使用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,但这也不起作用。

有任何建议怎么做?

1 个答案:

答案 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函数所需的额外双引号),

  • (nRng1 =“Banana”)(nRng2 =“Blue”)是指定范围内容和两个目标字符串的数组比较。

    每个都解析为一个布尔数组{FALSE,FALSE,...,TRUE等},在包含目标字符串的每个单元格范围内的相对位置为TRUE。登记/>
  • 双短划线,即“ - (nRng1 =”Banana“)强制每个布尔数组中的FALSE和TRUE值为零和1。 />
  • 然后将两个数组相乘, - (nRng1 =“Banana”)* - (nRng2 =“Blue”),生成一个单独的数组,其中一个位于两个“Banana”的位置“和”蓝色“被发现,并在其他地方归零。

    请注意,使用这种方法,比较不必仅限于两个。

  • 然后使用MATCH函数, MATCH(1, - (nRng1 =“Banana”)* - (nRng2 =“Blue”),0),找到相对位置零和一数组中的第一个。

    MATCH公式中的最后一个0指定匹配是精确的。

  • 由于如果未找到匹配项,MATCH将返回错误,IFERROR会捕获错误,并将其返回零。

  • 最后,最终结果 - 匹配的列位置(如果找到),否则为0 - 分配给 mycolumn

由于子例程返回单个值,您可能需要考虑将其重新命名为VBA函数。