2013-03-01 137 views
-1

任何幫助,將不勝感激。這看起來像一個常見的問題,但我無法找到任何vba。這是我最好的拍攝:vba excel匹配多個標準

Dim oppositeRow As Long 
..... 
oppositeRow = WorksheetFunction.Match(ddate & campaign, "A3:B62", 0) 
+0

你的實際問題是什麼? – Stewbob 2013-03-01 19:58:21

+0

我想知道從2條標準中獲得匹配位置的方法。我上面的代碼沒有工作。這兩個條件是字符串'ddate'和'campaign' – mango 2013-03-01 20:00:54

+0

'Match'只能評估1個標準,每次只能評估1個列。這聽起來像是一個需要查詢。 – Stewbob 2013-03-01 20:07:11

回答

5

如果你知道,只會有一個匹配的結果,你可以做以下爲Excel公式:

=SUMPRODUCT(ROW(A2:A5), N("john"=A2:A5), N("smith"=B2:B5)) 

適用於以下工作:

 
     A  B 
1  first last 
2  bob smith 
3  john smith  
4  john brown 
5  sam brown 

這將返回3(因爲約翰史密斯在第三行),您將不得不減去1,以獲取索引到表中,因爲標題行。

這是通過三個矢量相乘:

  1. 第一,ROW(A2:A5),僅僅是{2,3,4,5}。
  2. 第二個,N(「john」= A2:A5)是{0,1,1,0}。 N()採用矢量{false,true,true,false}並將其轉換爲數字。
  3. 第三,N(「smith」= B2:B5)是{1,1,0,0}。與N()相同。

乘以矢量一起逐元素得到{0,3,0,0},其總和爲3。

這是有點笨拙表達一樣,在VBA一個複雜的公式,所以如果你想在VBA中純粹使用它,我建議你只是用一個計數器做一個循環,然後記錄下你找到的符合你的標準的行的索引。

編輯:這裏是一些VBA代碼:

Dim index as Integer 
For index = 1 to 4 
    If Range("A1").Offset(index).Value = "john" And Range("B1").Offset(index).Value = "smith" Then 
     Exit For 
    End If 
Next index 
+0

我想純粹用vba做。做循環和計數器可能會很複雜,因爲每個值在它們自己的列中出現不止一次,但在同一行中只出現一次。 – mango 2013-03-01 20:18:14

+2

@mango循環實際上很簡單,因爲您可以在每個循環中檢查多個條件。例如: 'Dim index as Integer For index = 1 to 4 If Range(「A1」)。Offset(index).Value =「john」and Range(「B1」)。Offset(index).Value =「smith」Then Exit For End If Next index' – 2013-03-01 20:42:59

+0

我不得不承認,我不認爲這會那麼簡單。讓我給它一個測試。希望這不會有嚴重的性能損失。 – mango 2013-03-01 21:00:26

3

你可以爲你增添一份列到工作表是用來表示行號與DGET公式做到這一點,只要。

 
rowID column1 column2 
1  A  aa 
2  B  bb 
3  C  cc 
4  D  dd 
5  E  ee 

的公式是那麼:

=DGET(A1:C6;1;E1:F2) 

這假定上述數據是在A1:C6數據的下面塊,其包括搜索標準被放置在E1:F2

 
column1 column2 
C  cc 

上面列出的DGET公式的返回值是'3'。

你可以這樣做純粹是在VBA中,如果您的VBA方法放在適當的搜索條件進入細胞E2和運行DGET公式F2之前。

+0

我可以看到這將如何工作。但這對我的用途來說太過不雅了。如果我能夠儘可能地利用這一點,我就會利用同樣不合時宜的方法。 – mango 2013-03-01 20:55:54

+0

最好的選擇就是使用Alex Godofsky的解決方案,因此您不必擔心任何Excel工作表函數。它可以全部在代碼中完成。 – Stewbob 2013-03-01 21:01:58

+0

感謝您的關注和幫助! – mango 2013-03-01 21:23:50