1

よく使用する Excel の数式がありVLookupます。Index/Match「M」列の最後の数値を与える埋め込みがあります。
ワークシートの数式は次のとおりです。

=VLOOKUP(INDEX($M$10:$M75,MATCH(9.99999999999999E+307,$M$10:$M75)),Data,4)

セル$M75は、この式が入っている行のセルです。列 M には数値、非数値、および空白のセルがありますが、必要な ID は常に数値です。

だから私は簡単に書けるカスタム関数を書こうとしています=current()

ここに私が持っているものがあります:

Function Current()
  Dim LookupRange As Variant
  Dim indexVar As Variant
  LookupRange = Range("$M$1:M" & ActiveCell.Row)
  indexVar = Application.Index(Range(LookupRange), Application.Match(9.99999999999999E+307, Range(LookupRange)))
  Current = Application.WorksheetFunction.VLookup(indexVar, Worksheets("Info").Range("Data"), 4)
End Function

さまざまな変数タイプ (String、Long、Variant) を使用してみましたが、関数を機能させることができないようです。
これで十分な情報かどうかはわかりませんが、何か不足しているかどうかを誰かが確認できますか? Windows 7 で Excel 2013
しか使用できない#VALUE!

4

1 に答える 1

3

このコードには、あなたの説明と矛盾するいくつかの問題があります。

  • 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(この方法で作業する方が簡単です)。また、ワークシート オブジェクト変数も作成しますが、これも扱いやすいと思います。

于 2013-09-30T16:39:29.880 に答える