web-dev-qa-db-ja.com

VBA Matchでエラー2042が表示されるのはなぜですか?

列Aがあります。

+--+--------+
|  |  A     |
+--+--------+
| 1|123456  |
|--+--------+
| 2|Order_No|
|--+--------+
| 3|    7   |
+--+--------+

今私が入力した場合:

=Match(7,A1:A5,0)

私が得るシート上のセルに

3

結果として。 (これは望ましいことです)

しかし、この行を入力すると:

Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)

CurrentRowは「エラー2042」の値を取得します

私の最初の本能は、値7が実際に範囲内にあることを確認することでした。

私の次は多分Match関数に文字列が必要だったので、試しました

Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(Cstr(CurrentShipment), Range("A1:A5"), 0)

無駄に。

13
user2140261

VBAのリストを参照してください セルエラー値

Constant    Error number  Cell error value
xlErrDiv0   2007          #DIV/0!
xlErrNA     2042          #N/A
xlErrName   2029          #NAME?
xlErrNull   2000          #NULL!
xlErrNum    2036          #NUM!
xlErrRef    2023          #REF!
xlErrValue  2015          #VALUE!

CurrentShipmentの値をIntegerからLongではなくStringに変換してみてください:

CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0)
12
Vincent MAURY

これの補足事項として、また将来このエラーが発生する可能性があり、関数がエラーを返す可能性がある場合、バリアント型は非常にうまく機能します。

Dim vreturn as variant 

vreturn = Application.Match(CurrentShipment, Range("A1:A5"), 0) ' this could be any function like a vlookup for example as well

If IsError(vreturn) Then
    ' handle error
Else
    CurrentRow = cint(vreturn)
End If
15
KDT

オブジェクトブラウザーで一致関数を検索すると、doubleが返されるため、変数CurrentRowをdoubleとして宣言し、3つのバリアントパラメーターを受け入れます。動作する場合は、以下のコードを試してください。

enter image description here

enter image description here

  Sub sample()

    Dim CurrentShipment As Variant
    CurrentShipment = 7

    Dim CurrentRow As Double
    CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)
    End Sub
1
user2063626

興味深いことに、空のExcelシートにデータを入力してから、元のコードスニペットを実行しました。 CurrentShipmentをStringまたはLongとしてキャストすることなく、予想どおり3を返しました。

CurrentRowをDIMしないとデフォルトでVariantになりますが、両方をIntegerまたはCurrentRow Byteに設定してもエラーはスローされないため、戻り値の型としてDoubleを使用することは冗長です。

Sub Match()

Dim CurrentShipment As Integer
Dim CurrentRow As Byte '<--- NOTE

CurrentShipment = 7
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)

MsgBox CurrentRow

End Sub
0
Skip Intro

私にとっては、何も型キャストしなくてもうまくいきました。私は両方を使用しました:

Application.WorksheetFunction.Match(CurrentShipment, Range("A1:A5"), 0)

そして

Application.Match(CurrentShipment, Range("A1:A5"), 0)

整数、Double、Long、またはVariantとしてディメンション化されたCurrentShipment、すべて正常に機能しました...

0
K_B