2017-06-29 13 views
0

とインデックスとの一致は、私は私のシートの最初の列に、この式を有する:エクセル:VBA

=IFERROR(INDEX(Plan2!$A$1:$K$20;MATCH(Plan3!B2;Plan2!$B$1:$B$20;0);MATCH(Plan3!$A$1;Plan2!$A$1:$K$1;0));"") 

enter image description here

そして、それは私が欲しいもののために完璧にフィット:プラン2に見上げる(私databse )を使用して、Plan3の列Bの情報を取得します。

私が知りたいのは、これを同じことをするVBAに変換することです。私が実行しようとすると

Sub AlocSubs() 

Dim i As Long 
Dim ws1 As Worksheet 
Dim ws2 As Worksheet 

Set ws1 = Sheets("Plan2") 
Set ws2 = Sheets("Plan3") 

For i = 2 To 20 
    ws2.Cells(i, 1).Value = Application.WorksheetFunction.Index(ws1.Range("A1:K20"), .match(ws2.Range("B2"), ws1.Range("B1:B20"), 0), .match(ws2.Range("A1"), ws1.Range("A1:K1"), 0)) 
Next i 

End Sub 

は、私がメッセージを取得::

Compilation error: Reference is not valid.

をそして私は、この行がハイライトされ得る:

Sub AlocSubs() 

これは、これは私がこれまで試したものですVBAで式を変換しようとすると、コードが最初に実行されるので、何がうまくいかないのか分かりません。

ご意見をお寄せください。

+0

'.match(...)'とは何ですか?それを呼び出す適切な方法ではないAFAIK ... – BruceWayne

+0

@BruceWayne実際にこの質問では、VBAで式を使用する正しい方法であれば、私はそれを理解しようとしていました。 .. – paulinhax

答えて

0

これを試してみてください:

Sub AlocSubs() 
    Dim i As Long 
    Dim ws1 As Worksheet 
    Dim ws2 As Worksheet 
    Dim strFormula As String 

    Set ws1 = Sheets("Plan2") 
    Set ws2 = Sheets("Plan3") 
    strFormula = "=IFERROR(INDEX(Plan2!$A$1:$K$20;MATCH(Plan3!B2;Plan2!$B$1:$B$20;0);MATCH(Plan3!$A$1;Plan2!$A$1:$K$1;0));"""")" 

    With ws2 
     With .Range(.Cells(2, 1), .Cells(20, 1)) 
      .Formula = strFormula 
      .Value = .Value 
     End With 
    End With 
End Sub 

注:私はあなたの式をテストしていませんでした私はそれがこのようにする必要がありますね。コードは、VBAを使用して数式の結果を表示する方法を示します。

+0

ワークシートの数式を使用して結果を計算し、静的な結果を入力することを目標にしている場合は、['Evaluate'](https://bettersolutions.com/excel/functions/)でコードを短くすることができますvba-evaluate.htm)。 :) – Vegard

+0

@Vegard - 'Evaluate'はコードを短縮しますが、あなたは正しいですが、私は個人的には文字の制限のために評価を使用しませんが、それはここで問題ではありません。 – Mrig

+0

@Mrigure私がテストしたときに '.Formula = strFormula'という行にランタイムエラー1004がありました... – paulinhax

0

.matchを使用しましたが、前にはWithという文がありません。また、数式にiを使用しないでください。

With Application.WorksheetFunction 
    For i = 2 To 20 
     ws2.Cells(i, 1).Value = .Index(ws1.Range("A1:K20"), .Match(ws2.Range("B" & i), ws1.Range("B1:B20"), 0), .Match(ws2.Range("A1"), ws1.Range("A1:K1"), 0)) 
    Next i 
End With 
+1

'match'が何も見つからない場合、実行時にコードが失敗します。エラーキャッチャーを導入するか、 'Application.WorksheetFunction.Match'の代わりに' Application.Match'を使用する必要があります。 – Vegard

+0

私はこのコードをテストしました。実行時に 'Run-time error 1004:'が出ます。これはマッチ関数を認識しません。 – paulinhax