iT邦幫忙

0

EXCEL VBA Application.WorksheetFunction.Match 多條件

  • 分享至 

  • xImage

我正在做一個EXCEL VBA 表單,裡面有一個功能是要找出EXCEL試算表裡符合兩個條件的資料是在哪一行. 在Excel裡,可以用以下公式來達到我的需求

=Match(搜尋值1 & 搜尋值2,搜尋範圍1 & 搜尋範圍2,搜尋類型)

但當我使用VBA輸入以下程式碼

Application.WorksheetFunction.Match(搜尋值1 & 搜尋值2,搜尋範圍1 & 搜尋範圍2,搜尋類型)

的時候會報錯,查了一下是因為程式會把 "搜尋值1 & 搜尋值2" 認成 "搜尋值1搜尋值2" 而不是 "搜尋值1 以及 搜尋值2". 請問有甚麼方法可以解嗎?謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
koro_michael
iT邦新手 2 級 ‧ 2021-03-07 09:58:07
最佳解答

依照 API 文件敘述

https://docs.microsoft.com/zh-tw/office/vba/api/excel.worksheetfunction.match

WorksheetFunction.Match 應是沒辦法做到多個搜尋條件

所以可以換一下方式

Dim result1 = Application.WorksheetFunction.Match(搜尋值1, 搜尋範圍1,搜尋類型)
Dim result2 = Application.WorksheetFunction.Match(搜尋值2, 搜尋範圍2,搜尋類型)

之後再去交叉比對

或者可以試試看這樣

Dim f As String

f = "MATCH(""{V1}""&""{V2}"", 搜尋範圍1 & 搜尋範圍2, 搜尋類型)"
f = Replace(f, "{V1}", 搜尋值1)
f = Replace(f, "{V2}", 搜尋值2)

Debug.Print Sheet1.Evaluate(f)
看更多先前的回應...收起先前的回應...

感謝回答!
假設這是我的資料
https://ithelp.ithome.com.tw/upload/images/20210307/20135704Ri30MXEpCh.png
當我輸入程式碼

Dim result1 = Application.WorksheetFunction.Match(搜尋值1, 搜尋範圍1,0)
Dim result2 = Application.WorksheetFunction.Match(搜尋值2, 搜尋範圍2,0)

得到的結果是:
result1=1
result2=4

Match 好像由上往下找到第一個結果就會結束了.請問有辦法讓他把範圍裡所有符合的資料的位子都列出來嗎?謝謝!

For Each aaa In Sheets("Sheet1").Range("A1:A10")
    If aaa = Me.input1 Then
     If Sheets("Sheet1").Cells(aaa.Row, "B") = Me.input2 Then
        MsgBox aaa.Row
     End If
    End If
Next aaa

我後來用IF 跟 FOR 來解決問題了.還是謝謝大師的回答

kent_leeyh 抱歉,我想說怎麼好像忘記了一些事情,哈哈哈

用 For 搭配 If 不確定在資料大的情況下效能好不好,我還是比較偏向於用 find

Sub Demo()
    Dim s As String
    s = "A"
    
    Dim rng As Range
    ' 判斷跳出迴圈的變數,很重要
    Dim temp As String

    With Range("A1:A10") 
        Set rng = .Find(s, LookIn:=xlValues, LookAt:=xlWhole)
        
        If Not rng Is Nothing Then
        	temp = rng.Address
            Do 
	            MsgBox rng.Address
                Set rng = .FindNext(rng) 
            Loop While Not rng Is Nothing AND rng.Address <> temp
        End If 
    End With
End Sub

把這個範例調整調整應該可以做成一個共用的 Function

不嫌麻煩的話幫我按個最佳解答吧

謝謝 我來研究一下 大大貼的程式碼/images/emoticon/emoticon07.gif

我要發表回答

立即登入回答