2016-06-14 9 views
0

VBAでindexコマンドを使用してマクロを実行しようとしています。これは、リスクマトリックスのリスク変数で、「チャンス」と「エフェクト」変数に基づいています。組織がリスクアセスメントを実行するのに役立つツールを作成しています。'Worksheetfunction.Index'を機能させるのが難しい(Excel 2010)

ユーザーは、チャンスとエフェクトの変数(X軸とY軸)の入力を行います。合計は、この入力に基づいて行列から選択する必要があります。マトリックスは別のシート上に作成されます。

Dim ws2 As Worksheet 
 
Set ws2 = Worksheets("RisicoMatrix") 
 

 
Dim effectIniVar As Long 
 
Dim waarschijnlijkheidIniVar As Long 
 
Dim risicoIniVar As Long 
 

 
effectIniVar = WorksheetFunction.Match(comboIniEffect, ws2.Range("A3:A10"), 0) 
 

 
waarschijnlijkheidIniVar = WorksheetFunction.Match(comboIniWaarschijnlijkheid, ws2.Range("B2:I2"), 0) 
 

 
risicoIniVar = Application.WorksheetFunction.Index(ws2.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar)

最初の二つのmatchコマンドが正常に動作し、私に正しい値を与えるが、インデックス行は動作しません:

は、これまでのところ、私はこれを得ました。マクロを実行すると、ランタイム13エラー、型の不一致エラー、デバッグ時に 'index'行がハイライト表示されます。私はおそらく、この行についてはあまり正確ではないことを知っていますが、私はフォーラムで見つけた例を理解していません。

マクロはフォームフィールドから実行されるため、VBAでこれを実現したいと考えています。リスクマトリクスは、そこの要素の1つに過ぎません。

ご協力いただければ幸いです。

時間と労力をいただきありがとうございます。

+0

2番目のインスタンスで「Match」のスペルが間違っているようです。それを超えて、「働かない」よりも多くの情報を提供する必要があります。 – Rory

+0

お返事ありがとうございます。ポストにコピーするときに誤字が入り込んだ。動作しないのは、 'runtime-13>型の不一致'エラーが発生し、デバッグ時に 'index'行が黄色で表示されます。私はラインが間違っていることを知っています。私の質問は: 'Match'を使わずにVBAで 'index'を適用するにはどうすればいいですか? – Ni3ls

+0

次に、コードを修正して、「**動作しない」という**正確な意味を明確にすることをお勧めします。 ;) – Rory

答えて

0

私は暗黙のうちにLongタイプに変換可能ではない戻り値について、Roryと多くの関係があります。

どちらのあなたは「さらにMatch()機能はいくつかを持つことができますデバッグ目的

のために、主に(私は信じている)あなたのコードをステップと Index(ws2.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar)

によって返されるどの値を参照するか、あなたは、エラーハンドラをそこに置きます側」効果限り 『最も効果的にそうあなたのように行くことができるRangeオブジェクト

Find()方法で扱うことが可能マッチングが懸念された文字列『』対』番号は、次のとおりです。

Option Explicit 

Sub main2() 
    Dim effectIniVar As Long 
    Dim waarschijnlijkheidIniVar As Long 
    Dim risicoIniVar As Long 
    Dim comboIniEffect As String, comboIniWaarschijnlijkheid As String '<--| just a guess 
    Dim myVal As Variant '<--| variable to hold value returned by Index function 

    comboIniEffect = 3 '<--| following on my guess 
    comboIniWaarschijnlijkheid = "D" '<--| following on my guess 

    With Worksheets("RisicoMatrix") 
     If Not FindIndex(.Range("A3:A10"), comboIniEffect, "R", effectIniVar) Then Exit Sub '<--| try finding the row match, otherwise exit 
     If Not FindIndex(.Range("B2:I2"), comboIniWaarschijnlijkheid, "C", waarschijnlijkheidIniVar) Then Exit Sub '<--| try finding the column match, otherwise exit 
     myVal = Application.WorksheetFunction.index(.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar) '<--| get value by Index function 
     On Error GoTo errorhandler '<--| set your error handler 
     risicoIniVar = CLng(myVal) '<--| try forcing value returned by Index into a Long type 
     On Error GoTo 0 '<--| resume standard error handling 
    End With 

    MsgBox effectIniVar & ", " & waarschijnlijkheidIniVar & ", " & risicoIniVar '<--| if everything has worked, then show: row, column and value 
    Exit Sub 

errorhandler: 
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & "while forcing '" & myVal & "' into a Long" '<--| show error conditions 
End Sub 


Function FindIndex(rng As Range, val As Variant, rowOrCol As String, index As Long) As Boolean 
    Dim found As Range 

    With rng 
     Set found = .Find(what:=val, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) 
     If Not found Is Nothing Then 
      FindIndex = True 
      index = IIf(UCase(rowOrCol) = "R", found.Row - .Rows(1).Row + 1, found.Column - .Columns(1).Column + 1) 
     End If 
    End With 
End Function 
+0

有益で広範な回答をいただきありがとうございます。私はすべての変数を文字列に変換して働きました。私はあなたのコードに、あなたが何を示唆しているのかを理解するために、さらに詳しく調べます。再度、感謝します! – Ni3ls

+0

あなたは大歓迎です。私があなたのニーズに答えたことが分かったら、私の答えを受け入れたものとしてマークしてください。ありがとうございました – user3598756

関連する問題