2016-07-12 8 views
3

シートに3列と23393行を含む大きなファイルがあります。列Aは日付を参照し、列Bは整数を参照し、第3列は値を参照します。 複数の基準でセルの値(3列目)を探したいと思います。Excel VBA:複数の条件を持つセルの値を見つける方法

1)第一の基準は、日付(それは2008年1月1日から2009年12月31日に変更)

2)は、第2の基準は整数である(それは1から32まで変化する)

あります

おかげ

+0

式 '= INDEX(H2:H23393、MATCH(DATEVALUE( "2008年1月1日")&F2、D2:D23393&F2:F23393,0))'その出力がIしたい値であるが、私はマクロでそれを実行し、数式の出力は配列に行きます。 –

答えて

2

単純なアプローチはどうですか?

Function find(ByVal criteria1 As Date, ByVal criteria2 As Integer) As Variant 

    For i = 2 To 300001 
     If Cells(i, 1).Value = criteria1 Then 
      If Cells(i, 2).Value = criteria2 Then 
       find = Cells(i, 3).Value 
       Exit Function 
      End If 
     End If 
    Next i 

    find = "N/A" 

End Function 

あなたは、このような単純なマクロを実行していることをテストすることができます。

Sub storeFoundValues() 

    Dim matches(2) As Variant 
    Dim date1, date2 As Date 
    Dim int1, int2 As Integer 

    date1 = DateSerial(2015, 7, 15) 
    int1 = 3 
    matches(1) = find(date1, int1) 
    Cells(1, 5) = matches(1) ' test the output 

    date2 = DateSerial(2016, 1, 10) 
    int2 = 2 
    matches(2) = find(date2, int2) 
    Cells(1, 6) = matches(2) ' test the output 

End Sub 

これは30.000レコードを持つワークシートの秒未満を取りました。

enter image description here

+0

ありがとうございます@carlossierra –

+0

ちょうど質問、どのように私はループ内の日付を使用できますか?私のコードでは、日付をdd/mm/yyyyで、yyyy、mm、ddではないことを意味しています。何か解決策はありますか? –

+1

日付がハードコードされている場合は、より安全です(ユーザーロケールに関係なく正しい結果を返すため)ので、私が従った方法を使用することをお勧めします。または、ワークシートのセルから直接日付を取得した場合、セル値を取得して関数に渡すことは安全だと思います。 – carlossierra

1

例えば:

=INDEX(C1:C20,SUMPRODUCT(--(A1:A20=DATEVALUE("6/17/2009"))*(B1:B20=25)*ROW(1:20))) 

enter image description here

この方法では、条件に一致する行が1つのみであることが前提です。

+0

あなたの答えをどうか私はマクロでそれを記述し、その出力を文字列配列に書くことができます: '= INDEX(H2:H23393、MATCH(DATEVALUE(" 1/1/2008 ")&F2、D2:D23393&F2:F23393,0 )) ' –

+0

私の質問にお答えしますか? –

+0

@MajidJavanmard私は答えを知らない。 –

関連する問題