2017-01-31 152 views
0

我想把excel函數改成vba代碼。下面在山口AC,第2行式... =IF(ROWS($1:1)< MATCH(0.01,H$2:H$10)+1,"",INDEX(X:X,ROWS($1:1)-MATCH(0.01,H$2:H$10)+1))excel VBA索引和匹配函數

...掃描前10行山口H.的

此公式查找在山口H的行的第一無零值。當找到該行時,col X中的值將在Col AC中打印出來,以便Col AC中的行與Col H中第一個非零值相匹配的行匹配。

我希望描述感。它在Excel工作表中完美工作。現在,我想將它變成VBA代碼,這裏是我有...

For i = 2 To lengthRows 
    With Application.WorksheetFunction  
     Range("AC" & i) = .IF(Rows(1) < .Match(0.01, Range("H2:H10")) + 1, "", .Index(Columns(24), Rows(1) - .Match(0.01, Range("H2:H10")) + 1))  
    End With 
Next i 

...行(1)在第一行和列(24)上校X.

當我運行代碼時,出現運行時錯誤不匹配'13:類型不匹配。

我試圖理解這個先前的問題是如何回答:Excel VBA: how to solve Index and Match function type mismatch error

+0

0.01,H $ 2:H $ 10)',它正在尋找值0.01,而不是非零的值,如果一個單元格等於0.2,那麼'Match'將不會返回它。你需要改變你的'Match''匹配(0.01,H $ 2:H $ 10 -1)',第三個參數等於'-1'意味着它是尋找價值比'0.01' –

回答

1

以從以前回答問題的例子。您將匹配結果推入索引公式。如果匹配結果沒有找到匹配,那麼它將返回錯誤2042,當它被推入索引公式時會產生不匹配錯誤。

,能適應您的例子,解決辦法如下:

Dim rw As Variant 
With Application.WorksheetFunction 
    For i = 2 To lengthRows 
      rw = .Match(0.01, Range("H2:H10")) 'Is there a reason you're not specifying the third parameter 0 for exact match? 
      If Not IsError(rw) Then 
       Range("AC" & i) = .If(Rows(1) < .Match(0.01, Range("H2:H10")) + 1, "", .Index(Columns(24), Rows(1) - .Match(0.01, Range("H2:H10")) + 1)) 
      Else 
      ' Do something else if there was an error 

      End If 
    Next i 
End With 
+0

加油嘴嗨,它仍然較大給我類型不匹配錯誤 – Sarah

+0

嗨Zerk,下面的代碼工作。非常感謝你的幫助。 – Sarah

+0

'Dim rw As Variant With Application.WorksheetFunction For i = 2 To lengthRows rw = .Match(0.01,Range(「H2:H10」))+ 1'是否有原因沒有指定第三個參數0完全匹配? 其他 單元格(i + 1,「AC」)。單元格(i + 1,「AC」),值=單元格(i-rw + 2,「X」 VALUE =「」 結束如果 接下來我 結束與「 – Sarah

1

我認爲一旦你想使用VBA,您需要使用VBA新增的功能,而不是與你在構建公式堅持Excel中。因爲您正在尋找H列中第一個非零值的單元格,您可以使用Application.Match輕鬆找到它,但您需要將第三個匹配參數設置爲-1(意思是大於,看起來像是匹配值> 0.01)。

所以,現在,我們有行號,如果你想找到X列此行的值,你可以使用Range("AC2").Value = Range("X" & MatchRow + Rng.Item(0).Row).Value

代碼

Option Explicit 

Sub ConvertFormulaToVBA() 

Dim MatchRow As Variant 
Dim Rng  As Range 
Dim lengthRows As Long, i As Long 

lengthRows = Cells(Rows.Count, "H").End(xlUp).Row '<-- get last row with data in Column H (in your example it's 10) 
Set Rng = Range("H2:H" & lengthRows) ' <-- set the range to H2 until last row in Column H   

MatchRow = Application.Match(0.01, Rng, -1) ' <-- setting the third parameter to -1, meaning greater than 0.01 
If Not IsError(MatchRow) Then 
    Range("AC2").Value = Range("X" & MatchRow + Rng.Item(0).Row).Value 
Else 
    ' raise a message box if there is no Match 
    MsgBox "No none-zero value found at Range " & Rng.Address 
End If 

End Sub 
你正在使用`MATCH(
+0

親愛曬版機,當我把RW =。匹配(0,範圍(「H2:H10」))+ 1,它給了我一個正確的MsgBox值。當我使用rw = .Match(0,Range(「H2:H10」),-1)時,我沒有得到正確的值。我想你的convertFormulaToVBA上面的代碼,它給了我MSGBOX&Rng.Address – Sarah

+0

你複製整個確切的代碼我張貼「在範圍內找到否無零值」?你在h列中有值> 0.01的單元格嗎?那麼它的工作 –

+0

我用0.01代替0,但它不適合我。我將你的代碼和Zerk的代碼結合起來,得到下面的代碼。非常感謝你的幫助! – Sarah