2017-01-31 3 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))VBAインデックスとマッチ関数を比較する

...この式は、コルHの行の最初なしゼロ値を探しコルH.

の最初の10行をスキャンその行が見つかると、Col ACの行がCol ACの行がCol Hの最初の非ゼロ値の行と一致するようにCol ACの値が出力されます。

センス。これは、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

を使用することができます( 'MATCHを使用しています0.01、H $ 2:H $ 10) 'は、値0.01を探しています。値が0でない値ではなく、セルが0.2の場合、' Match'はそれを返しません。あなたの 'Match'を' MATCH(0.01、H $ 2:H $ 10、-1) 'に変更する必要があります.3番目のパラメータは' -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

Hi Zerk、私にタイプの不一致エラー – Sarah

+0

を与えます。Zerk、以下のコードは動作します。助けてくれてありがとう。 – Sarah

+0

'Dim rw As Variant Application.WorksheetFunctionを使用 i = 2の場合lengthRows rw = .Match(0.01、Range( "H2:H10"))+ 1 3番目のパラメータを指定しない理由はありますか完全一致の場合は0ですか? セルが(i + 1、 "AC")セルでない場合は、 セルが(i + 1、 "AC")セルである場合、値は です。値= "" 終了の場合 次はi で終了します。 ' – Sarah

1

私はあなたがVBAを使用すると、あなたはVBAの機能を追加使用する必要があると思うし、ないあなたが構築式にこだわりますExcel。

ゼロ以外の値を持つ列Hの最初のセルを検索するので、Application.Matchを使用して簡単に見つけることができますが、一致の3番目のパラメータを-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 
+0

の末尾に、rw =を入れます。Match(0、Range( "H2:H10"))+ 1、正しい値のMsgBoxを返します。私はrw = .Match(0、Range( "H2:H10")、-1)を使用すると正しい値を得られません。私は上記のあなたのconvertFormulaToVBAコードを試しました、それは私にMsgBox "Rangeで見つからないゼロの値"&Rng.Addressを与えます – Sarah

+0

投稿した正確なコード全体をコピーしましたか?値が0.01より大きい列hのセルはありますか?その後、それは動作します –

+0

私は0を0.01に置き換えましたが、それは私のためには機能しません。あなたのコードをZerk'sと組み合わせて、そのコードを以下のようにしました。助けてくれてありがとう! – Sarah

関連する問題