2013-01-18 182 views
0

我试图使用Application.match查找范围A1:Z1和A2:Z2中的值匹配的列。例如,第一行包含不同的水果名称,第二行包含颜色。所以,说我找了一个蓝色香蕉列,这样的事情应该工作:Excel VBA类型不匹配范围连接多个范围匹配尝试

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

MATCH函数有三个参数:要匹配的值,要匹配的单元格的数组(单列或单行范围)以及匹配类型(精确值为0)。我不清楚你想用两个范围串联来做什么。 – chuff

+0

你应该能够连接你正在搜索的字符串,以及你正在寻找的范围。在这个例子中,我不想在绿色的香蕉或蓝苹果上获得一场比赛。例如,请参阅http://support.microsoft.com/kb/59482,其中提供了三条建议,其中没有一条适用。 –

回答

1

代码中的MATCH失败,因为“&”运算符仅适用于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 =“香蕉“)(nRng2 =”蓝色“)是命名范围内容和两个目标字符串的数组比较。

    每个解析为布尔值数组{FALSE,FALSE,...,TRUE等},在包含目标字符串的每个单元格范围内的相对位置上都为TRUE。

  • 的双破折号,即“ - (nRng1 =‘香蕉’)力在每个布尔阵列的0和1的FALSE TRUE和值

  • 两个数组。然后乘以- (nRng1 =“香蕉”)* - (nRng2 =“蓝色”),产生单个阵列,其中在发现“香蕉”和“蓝色”的位置上有一个,而在其他地方为零。

    请注意,使用这种方法的比较不一定只限于两个。

  • MATCH函数然后被用于,MATCH(1, - (nRng1 = “香蕉”)* - (nRng2 = “蓝”),0),找到的第一1的相对位置在零和一个数组中。

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

  • 由于如果找不到匹配,MATCH将返回一个错误,IFERROR捕获错误,并返回零。

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

由于子程序返回单个值,因此您可能需要考虑将其重新设置为VBA函数。

+0

哇。复杂,但看起来很有说服力。我会在星期一检查一下,如果(或者可能在什么时候)结果出来,给你投票。无论如何,感谢您将所有这些努力都放到了您的答案中。我很感激。 –

+0

嗯,我当然希望我明白了! (我测试了代码。)这是一个很好的习惯,因为我有一段时间没有使用这种方法。 – chuff