2017-03-27 4 views
3

インデックス/マッチ関数を使用して、あるシートから別のシートにデータを一致させて引き出すマクロを作成しようとしています。私はExcelでそれを行い、それは完璧に動作します。しかし、レポートは「動的」(サイズ変更)なので、コードの最後の行も動的である必要があります。 以下は私が行ったことです。私は今、 "タイプミスマッチ"のエラーが出ています(私は、1つのエラーの解決策が見つかるたびに "今"を強調しています)。VBAでインデックス/マッチを行うにはどうすればよいですか?

Dim prosheet As Worksheet 

    Dim prosheet2 As Worksheet 

    Set prosheet2 = ThisWorkbook.Sheets("shipstation") 

    Set prosheet = ThisWorkbook.Sheets("macrotestfb") 

    lr1 = prosheet.Cells(Rows.Count, 1).End(xlUp).Row 

    lr2 = prosheet2.Cells(Rows.Count, 1).End(xlUp).Row 

    lrship = prosheet.Cells(Rows.Count, 10).End(xlUp).Row 

    lrindex = prosheet2.Cells(Rows.Column, 14).End(xlUp).Row 

    'CALCULATE SHIPPING COST 

    For x = prosheet.range("j6") To lrship 

     x = Application.WorksheetFunction.Index(prosheet2.range("a1:n" & lrindex), Application.WorksheetFunction.Match(prosheet.range("a6:a" & lr1), prosheet2.range("a1:a" & lr2), 0), prosheet2.range("f2")) 

    Next x 

答えて

2

マッチは、その非配列形式では、最初の基準では1つの値しかありませんが範囲はありません。

また、WorksheetFunction.Matchは、一致が見つからない場合にコードを停止するエラーをスローします。

私は自分の行に試合を引っ張ってエラーをテストするのが好きです。

また、私はあなたのForステートメントを調整しました。

列全体を検索することには問題ありませんので、最後の行の検索は不要になってしまいます。

Dim prosheet As Worksheet 
Dim prosheet2 As Worksheet 
Dim x As Long 
Dim t As Long 
Set prosheet2 = ThisWorkbook.Sheets("shipstation") 
Set prosheet = ThisWorkbook.Sheets("macrotestfb") 

lrship = prosheet.Cells(Rows.Count, 1).End(xlUp).Row 

'CALCULATE SHIPPING COST 

For x = 6 To lrship 
    t = 0 
    On Error Resume Next 
     t = Application.WorksheetFunction.Match(prosheet.Range("A" & x), prosheet2.Range("A:A"), 0) 
    On Error GoTo 0 
    If t > 0 Then 
     prosheet.Cells(x, "J").Value = prosheet2.Range("F"&t) 
    Else 
     prosheet.Cells(x, "J").Value = "Item does not Exist" 
    End If 
Next x 
+0

こんにちは、最初のおかげで...コードはほぼ完璧に動作します。私はいくつかのマイナーな適応を行ったと素晴らしい実行...今私は別の問題を発見した...インデックス関数は、いくつかのレコードで動作しません、私はこのエラーメッセージが表示されます... "ワークシートのインデックスプロパティを取得することができません関数のクラス "...私はすべてのインスタンスでコードが動作しないことがわかった場合、ルックアップ値は数字と文字を含んでいます。 12365E ...変数xとyのデータ型を変更する必要がありますか? – DHI

+0

"shipstation"シート上のF2の値は何ですか?コードが停止したときのtの値は何ですか?あなたは何を変えたのですか?これは結果に影響する可能性があるためです。 –

+0

...私が作った「マイナーな適応」の1つです。インデックス関数の( "f2")の値を( "f"&t)に変更します。そうでなければ常にf2のみを与えます。変更後、( "f"&t)の値は77で、tも77です。 – DHI

0

注:代わりにあなたは、あなたがVBAでApplication.Matchを使用することができますワークシートに使用する場合がありますIndex/Matchコンボの

。このようなもの:

Sub GetMatch 
    Dim indexRng As Range, matchRng as Range 

    Set indexRng = ThisWorkbook.Worksheets("Sheet1").Range("A1:A10") 
    Set matchRng = ThisWorkbook.Worksheets("Sheet1").Range("B1:B10") 

    debug.print indexRng.Cells(Application.Match("something",matchRng,0)).Value 
End Sub 
+0

ありがとうございました! – DHI

関連する問題