簡體   English   中英

多個范圍匹配嘗試的范圍串聯中的Excel VBA類型不匹配

[英]Excel VBA type mismatch in range concatenation for multiple range match attempt

我正在嘗試使用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,但這也不起作用。

有什么建議怎么做?

代碼中的MATCH失敗,因為“&”運算符僅對VBA中的字符串起作用。 在Excel工作表中,如果將“&”作為數組公式的一部分輸入,則可以聯接范圍。

似乎應該在VBA中使用的對MATCH公式的修改也會返回“類型不匹配”錯誤。 其中包括通過將兩個范圍分配給單個范圍變量(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值設為零和一。

  • 然后將這兩個數組相乘, -(nRng1 =“ Banana”)*-(nRng2 =“ Blue”) ,生成一個數組,該數組在找到“ Banana”和“ Blue”的位置均帶有一個,並且為零別處。

    注意,使用這種方法,比較不必僅限於兩個。

  • 然后使用MATCH函數MATCH(1,-(nRng1 =“ Banana”)*-(nRng2 =“ Blue”),0)查找零和1數組中第一個1的相對位置。 。

    MATCH公式中的最后一個0指定匹配為精確匹配。

  • 由於如果找不到匹配項,MATCH將返回錯誤,因此IFERROR將捕獲該錯誤,並返回零。

  • 最后,將最終結果-匹配項的列位置(如果找到一個,否則為0)分配給mycolumn

由於子例程返回單個值,因此您可能需要考慮將其重鑄為VBA函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM