Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2016)
ワークシート上の関数式とVBAのコードの結果が異なります
投稿日時: 24/03/20 14:50:44
投稿者: shimoichimabu

ワークシート上の関数式とVBAの結果が異なります。
ワークシート上の関数式の結果は正しいと思います。
ワークシート上の関数式をVBAに書き換えても同じ結果が得られません。
なぜでしようか?(VBAのコード内の "" の記述が間違っている?)
 
A1は「セルの書式設定」で「文字列」に設定しています。
 
<ワークシート上での関数式の結果>
 
式1 =ISNA(MATCH(A1,{"1/1";"1/2";"1/3"},0))
 A1:1/1の時、FALSE  A1:1/4の時、TRUE
 
式2 =ISERROR(MATCH(A1,{"1/1";"1/2";"1/3"},0))
 A1:1/1の時、FALSE  A1:1/4の時、TRUE
--------------------------------------------------------
 
<VBAコードの結果>
 
Code3 MsgBox IsError(Application.Match(Range("A1").Value, "{""1/1"";""1/2"";""1/3""}", 0))
 A1:1/1の時、TRUE  A1:1/4の時、TRUE
 
Code4 MsgBox Application.IsNA(Application.Match(Range("A1").Value, "{""1/1"";""1/2"";""1/3""}", 0))
 A1:1/1の時、FALSE  A1:1/4の時、FALSE

回答
投稿日時: 24/03/20 15:47:51
投稿者: simple

提示のコードのMatchの対象範囲は単なる文字列ですから、Matchは常にエラー値を返します。
対象範囲は一次元配列である必要があります。
こんな風にします。

Sub test()
    '標準的な書き方
    MsgBox IsError(Application.Match(Range("A1").Value, Array("1/1", "1/2", "1/3"), 0))
    MsgBox IsError(Application.Match(Range("A2").Value, Array("1/1", "1/2", "1/3"), 0))
    
    'Application.Evaluate([ ])を使用する場合
    MsgBox IsError(Application.Match(Range("A1").Value, [{"1/1","1/2","1/3"}], 0))
    MsgBox IsError(Application.Match(Range("A2").Value, [{"1/1","1/2","1/3"}], 0))
End Sub

参考までに。
VBA で Application.Matchを使う場合、対象範囲は一次元配列である必要があります。
Sub test2()
    Dim v1, v2
    v1 = [{"1/1","1/2","1/3"}]
    v2 = [{"1/1";"1/2";"1/3"}]
    Stop
End Sub
でローカルウインドウで確認してください。
v1は一次元配列
v2は二次元配列です。
従って、
v2のような二次元配列を対象範囲に指定すると、必ずエラーが返ります。

投稿日時: 24/03/20 21:16:03
投稿者: shimoichimabu

simpleさん回答ありがとうございます。
 
>提示のコードのMatchの対象範囲は単なる文字列ですから、Matchは常にエラー値を返します。
ここでは、Array関数を使うのですね。
Arrayでコードを実行したら、うまくいきました。
 
>VBA で Application.Matchを使う場合、対象範囲は一次元配列である必要があります。
v2 = [{"1/1";"1/2";"1/3"}]は確かにローカルウインドウで確認すると、二次元配列でした。