簡體   English   中英

excel VBA索引和匹配功能

[英]excel VBA index and match functions

我正在嘗試將Excel函數更改為VBA代碼。 在Col 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))

...掃描第H列的前10行。

此公式將在Col 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

... Rows(1)是第一行,Columns(24)是ColX。

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

我試圖了解如何回答上一個問題: Excel VBA:如何解決索引和匹配函數類型不匹配錯誤

以前面回答的問題為例。 您正在將匹配結果推入索引公式。 如果匹配結果找不到匹配項,則它將返回錯誤2042,當將其推入Index公式時,將給出不匹配錯誤。

使該解決方案適合您的示例如下:

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

我認為,一旦您想使用VBA,就需要使用VBA的附加功能,而不是堅持使用Excel中構造的公式。

由於您要在H列中查找第一個具有非零值的單元格,因此可以使用Application.Match輕松找到它,但是您需要將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

暫無
暫無

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

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