2017-01-31 8 views
0

Ich versuche, Excel-Funktionen in VBA-Code zu ändern. Die Formel unten in Col AC, Reihe 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 Index und Match-Funktionen

... abtastet, die ersten 10 Reihen von Col H.

Diese Formel sieht zum ersten kein Null-Wert in den Reihen von Col H Wenn diese Zeile gefunden wird, werden die Werte in Spalte X in Spalte AC ausgedruckt, so dass die Zeile in Spalte AC mit der Zeile mit dem ersten Wert ungleich Null in Spalte H übereinstimmt Sinn. Es funktioniert perfekt in Excel-Arbeitsblatt. Nun würde ich es in VBA-Code ändern möchte, ist hier, was ich habe ...

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 

... Zeilen (1) ist die erste Zeile und Spalten (24) Col X.

Wenn ich den Code ausführen, erhalte ich einen Laufzeitfehler, der nicht übereinstimmt '13: Typ stimmt nicht überein.

ich zu verstehen versuche, wie diese vorherige Frage beantwortet wurde: Excel VBA: how to solve Index and Match function type mismatch error

+0

Sie MATCH verwenden verwenden (0.01, H $ 2: H $ 10) ', es sucht nach Wert 0.01, nicht Werte, die keine Null sind, wenn eine Zelle gleich 0.2 ist, wird deine 'Übereinstimmung' sie nicht zurückgeben. Sie müssen Ihre 'Match' zu' MATCH (0,01, H $ 2: H $ 10, -1) '' ändern, der dritte Parameter ist gleich '-1' bedeutet, dass er nach Werten größer als' 0,01' sucht. –

Antwort

1

Nehmen wir das Beispiel aus dem vorherigen beantworteten Frage. Sie schieben das Match-Ergebnis in die Indexformel. Wenn das Übereinstimmungsergebnis keine Übereinstimmung findet, gibt es den Fehler 2042 zurück. Wenn es in die Index-Formel eingefügt wird, wird der Mismatch-Fehler angezeigt.

Um diese Lösung für Ihr Beispiel anpassen würde wie folgt aussehen:

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

Hi Zerk, es ist immer noch gibt mir Typ Mismatch Fehler – Sarah

+0

Hallo Zerk, der Code unten funktioniert. Vielen dank für Deine Hilfe. – Sarah

+0

'Dim rw Als Variante Mit Application.WorksheetFunction Für i = 2 To lengthRows rw = .Match (0.01, Bereich ("H2: H10")) + 1' Gibt es einen Grund, dass Sie den dritten Parameter nicht angeben 0 für genaue Übereinstimmung? Wenn nicht i Sarah

1

Ich denke, wenn Sie VBA verwenden möchten, müssen Sie die VBA-Funktionen hinzugefügt verwenden, und bleiben nicht mit der Formel, die Sie in gebaut Excel.

Da Sie die erste Zelle in Spalte H mit einem Wert ungleich Null suchen, können Sie es leicht mit der Application.Match finden, aber Sie müssen den dritten Parameter der Übereinstimmung auf -1 (bedeutet größer als, suchen für eine Übereinstimmung für Werte> 0,01).

So, jetzt haben wir die Zeilennummer, wenn Sie den Wert in der Spalte X für diese Zeile finden möchten, können Sie Range("AC2").Value = Range("X" & MatchRow + Rng.Item(0).Row).Value

-Code

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 
+0

Liebe Shai, wenn ich rw =.Match (0, Range ("H2: H10")) + 1, gibt mir eine MsgBox mit dem richtigen Wert. Ich bekomme nicht den richtigen Wert, wenn ich rw = .Match (0, Range ("H2: H10"), -1) verwende. Ich habe versucht, Ihre ConvertFormulaToVBA-Code oben, es gibt mir MsgBox "Kein Nullwert bei Bereich gefunden" & Rng.Address – Sarah

+0

Haben Sie den gesamten genauen Code kopieren, den ich gepostet? Haben Sie Zellen in Spalte h mit Werten> 0,01? Dann funktioniert es –

+0

Ich ersetzte 0 durch 0,01, aber es funktioniert nicht für mich. Ich habe Ihren Code mit Zerks kombiniert, um den unten stehenden Code zu erhalten. Vielen dank für Deine Hilfe! – Sarah