我正在做一個EXCEL VBA 表單,裡面有一個功能是要找出EXCEL試算表裡符合兩個條件的資料是在哪一行. 在Excel裡,可以用以下公式來達到我的需求
=Match(搜尋值1 & 搜尋值2,搜尋範圍1 & 搜尋範圍2,搜尋類型)
但當我使用VBA輸入以下程式碼
Application.WorksheetFunction.Match(搜尋值1 & 搜尋值2,搜尋範圍1 & 搜尋範圍2,搜尋類型)
的時候會報錯,查了一下是因為程式會把 "搜尋值1 & 搜尋值2" 認成 "搜尋值1搜尋值2" 而不是 "搜尋值1 以及 搜尋值2". 請問有甚麼方法可以解嗎?謝謝
依照 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)
感謝回答!
假設這是我的資料
當我輸入程式碼
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
不嫌麻煩的話幫我按個最佳解答吧
謝謝 我來研究一下 大大貼的程式碼