質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5660閲覧

ExcelVBAにて、単数列以外の範囲にMatch関数を使用した際にシステムエラーが発生する

rot_snow

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/20 14:29

編集2020/08/21 08:13

Match関数にて表内を検索したい

ExcelVBAにて、Match関数を使用して表から特定の値が設定されたセルを取得しようと試みました。
しかし、検索対象範囲を単数列とした場合は検索処理が実施されるようなのですが、複数列にしたり、行方向にしたり、表全体を対象としたりした際に1004エラーが発生します。

原因や対処法について、ご存じの方がおいででしたら教えていただきたいです。

該当のソースコード

OKパターン WorksheetFunction.Match("検索対象文字列", Range("A:A"))
NGパターン1 WorksheetFunction.Match("検索対象文字列", Range("4:4"))
NGパターン2 dim r:r = Worksheets("作業シート").UsedRange WorksheetFunction.Match("検索対象文字列", r)

補足情報(FW/ツールのバージョンなど)

Office365を使用

追記

パターン2については、多次元配列は未対応なだけ?

NGパターン3 dim r:r = Worksheets("作業シート").UsedRange WorksheetFunction.Match("検索対象文字列", r.Rows(2))

行方向に取得した場合、結果の値が異常値を返します。
行に存在する値を入力してもエラーが発生したり、値が返る場合も違う要素で同じ値が返ったりします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

照合の種類を指定してみてください。

VBA

1NGパターン1 2WorksheetFunction.Match("検索対象文字列", Range("4:4"),0)

MATCH関数は単数行列、一次元配列は対応していますが
複数行列、二次元配列以降は対応していません。

ワークシート関数を使っているので、検証のために
直接シートに数式を書き込むとわかりやすいと思います。

Findメソッドを使うとセル位置を特定できます。
条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド)

投稿2020/08/21 00:11

radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rot_snow

2020/08/21 09:30

色々試した結果、Matchの第三引数の規定値が1であるらしく、その状態で未ソートのデータを引き渡した結果発生した異常のようでした。 ありがとうございます。
guest

0

WorksheetFunction.Match

は、ワークシート上で使うMatch関数をVBAから呼び出しているにすぎません。
なので、
単一列、単一行のみにしか対応できません。(シート上で確認願います。)
複数列複数行に対応する場合は各各をループする必要があります。

それから、WorksheetFunction内の関数は、計算結果がエラー値の場合は、
コード1行全体がエラーとして返ってきます。
注意してください。

ExcelVBA

1Sub test() 2 Dim r As Range 3 Dim ix As Variant 4 Dim k As Variant 5 Dim p As String 6 7 p = "見つかりませんでした。" 8 k = InputBox("キーワード入力") 9 For Each r In Worksheets("作業シート").UsedRange.Rows 10 ix = CVErr(xlErrNA) 11 On Error Resume Next 12 ix = WorksheetFunction.Match(k, r, 0) 13 On Error GoTo o 14 If Not IsError(ix) Then 15 r(ix).Select 16 p = r(ix).Address(False, False) & "にありました。" 17 Exit For 18 End If 19 Next 20 21 MsgBox p 22End Sub

行を指定してエラーになったのは、なぜかはわかりませんが、
エラー値が返ってくるようにシート上でどうにかなってると想像します。

投稿2020/08/21 08:57

mattuwan

総合スコア2143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1004エラーは該当するものが見つからなかったために発生したものだと思います。
エラー処理を追加してください。

VBAからMATCH関数利用時にエラーを回避する

投稿2020/08/20 16:14

meg_

総合スコア10716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rot_snow

2020/08/20 22:43

デバッガで確認した限りでは、値は存在していました。
meg_

2020/08/21 00:17

Windows8.1、Excel2013において下記は動作しました。 > WorksheetFunction.Match("検索対象文字列", Range("4:4"))
meg_

2020/08/21 00:42

NGパターン2の方は駄目でした。 ドキュメントには「指定した順序で指定した値と一致する配列内の項目の相対的な位置を返します。」「検査範囲: 参照値を含む可能性がある連続した範囲のセル。」とあるので、任意のセル範囲でも使用可能と思いましたが対応していないのですね。
rot_snow

2020/08/21 08:49

NGパターン3を追記しました。 偶に通り、偶にエラーになり、通っても結果は異常、という挙動が見られました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問