このコードには、あなたの説明と矛盾するいくつかの問題があります。
LookupRange
バリアント配列です。これをテストすると、1004 Method 'Range' of object '_Global' failed
への割り当てでエラーが発生しますindexVar
。
- あなた
Dim LookupRange As String
のコメントに従っても、Type Mismatch
エラーが発生します。
は範囲でなければならないのでLookupRange
、範囲として宣言しSet
、代入ステートメントでキーワードを使用します。
Set lookupRange = Range("$M$10:$M" & ActiveCell.Row)
- への割り当てのタイプミスの可能性があります
lookupRange
。式では、もともと を使用$M$1
しますが、関数では を使用します$M$10
。
この範囲を から開始し$M$10
、行 1 ~ 9 の間の任意のセルで数式を評価しようとすると、エラーが発生します。
関連して、 に数値がない場合lookupRange
、エラーが返されます。たとえば、Current()
cellを入力M2
すると のルックアップ範囲が作成されM1:M2
、数値データがありません。

これをどのように処理したいのかわかりませんが、私の答えには、そのエラーを回避する方法が 1 つ含まれています。必要に応じて変更できます。ついに:
- この数式は再計算されて望ましくない結果になる可能性があるため、に依存する
ActiveCell.Row
ことは悪い考えのように思えます。
代わりに、これを式の必須引数にします。これは、次のようにワークシートから呼び出すことができます=Current(Row())
。
すべてをまとめると、これはうまくいくはずだと思います。一致が見つからないというエラーの例/エスケープを提供します。:
Public Function Current(r As Long)
Const bigNumber As Double = 9.99999999999999E+307
Dim wsInfo As Worksheet: Set wsInfo = Worksheets("Info")
Dim lookupRange As Range
Dim indexVar As Long
Dim myVal As Variant
Set lookupRange = Range("$M$1:$M" & r)
If Not Application.WorksheetFunction.Sum(lookupRange) = 0 Then
indexVar = Application.Index(lookupRange, Application.Match(bigNumber, lookupRange))
myVal = Application.WorksheetFunction.VLookup(indexVar, wsInfo.Range("Data"), 4)
Else:
myVal = "No numbers found in: " & lookupRange.Address
End If
Current = myVal
End Function
コメントから更新
変数宣言の前にApplication.Volatile
リンクを追加できます。これにより、再計算が強制されます。
ワークシートの任意のセルで計算が行われるたびに。
ただし、他のワークシート (たとえば、Worksheets("Info")
別のワークシート) の値が変更された場合、これは計算を強制しません。
関数を含むシートをアクティブにするたびに再計算を強制する=Current(Row())
には、これをワークシートのコード モジュールに配置できます。
Private Sub Worksheet_Activate()
Me.Calculate
End Sub
これはおそらく、数式VLOOKUP
を実際に使用せずにネイティブ機能を複製することに最も近いものです。VLOOKUP
その他の注意事項:
正しく/厳密に型指定された変数を優先してindexVar as Long
、倍精度変数を宣言して作成します9.99999999999999E+307
(この方法で作業する方が簡単です)。また、ワークシート オブジェクト変数も作成しますが、これも扱いやすいと思います。