![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
Office365です。
WorksheetFunction.(X)Match
でのワイルドカード検索で引っかかった
配列内の行数を取得したいと考えています。
複数該当箇所があるので、先頭及び末尾以外の2件目、3件目、、n-1件目の
行数も取得したいのです。
先にワイルドカードでの共通文言でFilterをかけて、
得られた戻り値の配列の要素を1つずつ
改めてMatchの検索値として検索しても、
Filterの戻り値の配列内に完全に同じValueが存在しているため、
初めの目的の配列に対してMatchで検索するのでは、
やはり同じ値の2件目が取れてこないのです。
究極は目的配列を1要素ずつループを回してIfで検索していってもいいのですが
少し記述が長くなります。
2件目以降を取得するために(X)Matchにおける「次を検索」のような工夫がございましたら
ご教授くださると幸いです。
No.5ベストアンサー
- 回答日時:
以下の考えが、ご質問者の意図にそったものかは判りませんが、
(1)Xmatchワークシート関数を使って、配列を逆から検索
(2)検索値が見つかったら、配列のサイズを発見位置より1つ少ない要素数に減らして小さくする
(3)検索値が発見されないか、配列サイズ(要素数)が0になるまでLOOP
というアルゴリズムで考えればよいのではないでしょうか。
この考えでサンプルを作成してみました。
Option Base 1
Sub sample()
'末尾が1の文字セルを探す
Dim r As Long 'Match関数で探す配列のインデックス番号
Dim s As Long 'Match関数の検索対象配列の要素数
Dim ans As String '結果を格納する文字変数
Dim data() As Variant '検索対象データの動的配列を準備
ans = ""
s = 10 '配列の初期サイズを指定
ReDim data(s)
data() = Array("b1", "b1", "a2", "b1", "b1", "a2", "b1", "b1") 'サンプルデータを格納
Do
r = 0 'Match関数で探す配列のインデックス番号を初期化
On Error Resume Next
r = WorksheetFunction.XMatch("*1", data, 2, -1) 'XMatchワークシート関数で指定範囲を逆方向に検索
On Error GoTo 0
If r = 0 Then Exit Do 'XMatchで検索値が見つからなければ終了
ans = ans & r & "番目" & vbCrLf '結果表示に発見した要素のインデックス番号を追加
s = r - 1 '次の検索対象配列のサイズ(要素数)を算出
If s = 0 Then Exit Do 'XMatchで検索対象配列の要素数が0になったら終了
ReDim Preserve data(s) '検索対象配列のサイズ(要素数)を変更
Loop
If ans = "" Then
ans = "検索対象は見つかりませんでした"
Else
ans = "検索対象は" & vbCrLf & vbCrLf & ans & vbCrLf & "に見つかりました"
End If
MsgBox ans
End Sub
上記コードを実行すると、サンプルデータのb1の位置である、1、2、4、5、7、8が取得できます(順番は8、7、5・・・と降順ですが・・・)。
また、Xmatch関数の第一引数、"*1"を"*2"に変更すると、a2の位置である3、6が取得できます。
すみません、アカウントが半分死んでいてお礼が大変に遅くなりました。
ありがとうございました。
確かに。この方法が一番シンプルだったかもしれません。
No.4
- 回答日時:
最初に見つけた要素に、”済”みたいな文字を代入して、潰した上で次の検索を行うのはどうでしょう?
配列の中身を変更したくないのであれば、別の作業用変数に格納した上で潰せば、影響は無いように思います。
すみません、アカウントが半分死んでいてお礼が大変に遅くなりました。
ありがとうございました。
なるほど、考えもつかなかったです。配列をコピーしてなら可能ですね。
No.1
- 回答日時:
どう言う事をしてて躓いているのかがちょっと不明っぽい。
XMATCHは使った事ないですけど複数の値(配列)は返さないですよね?
Fillterによって配列を作成したってなら、
http://officetanaka.net/excel/vba/function/Filte …
一次元で0スタートならUBound(Tokyo) - 1が要素数になると思えるのですが、そう言う訳ではないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- Excel(エクセル) INDEX関数とMATCH関数を使用し値を返す数式についてです 2 2022/04/20 13:40
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) Excel 値を返す数式についてです 3 2022/11/21 20:08
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
レコードセットの中身を配列に、そしてワークシートに。
Visual Basic(VBA)
-
-
4
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
5
VBA プロシージャの名前の取得
その他(Microsoft Office)
-
6
条件付書式で「=#N/A」に色を付けたい
Excel(エクセル)
-
7
ApplicationとWorksheetFunctionの違い
Visual Basic(VBA)
-
8
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
9
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数を動的に作るには?
-
IF関数でEmpty値を設定する方法。
-
C言語 重複しない4ケタの乱数...
-
VBAで配列の計算
-
複数のテキストボックスに同じ...
-
EXCEL VBA で、0から?1から?
-
配列通しのOR演算
-
VB.net 引数で配列変数を渡す際...
-
【MFC】GetCount()とGetSize()...
-
動的配列が存在(要素が有る)か...
-
パソコンキーボードで時分秒を...
-
排列と配列の漢字の使い分けは
-
javaプログラムについて
-
C#の質問
-
javaで質問です。 文字列2023/2...
-
C言語のポインターに関する警告
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
変数を動的に利用するには?
-
ダブルクォーテーションのrepla...
-
System.out.printlnの出力先
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
C言語 重複しない4ケタの乱数...
-
変数を動的に作るには?
-
VB.net 引数で配列変数を渡す際...
-
応用情報技術者試験の令和元年...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
VBでbyte配列型のインスタンス...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
遅延バインディングを使用でき...
-
Visual C++ でコントロールを...
-
Excel VBAで配列の途中から(X)M...
-
C++、クラスメンバの構造体配列...
-
C言語で3次元配列の課題をして...
-
For文と配列
-
重複なしでランダムに画像を表...
おすすめ情報
ご返答ありがとうございます。
>XMATCHは使った事ないですけど複数の値(配列)は返さないですよね?
そうなんです。
それを何とかして複数の結果を得たいと思っています。
配列として戻り値を一括に得たいということではなく、
ループ中で何度もMatchを用いて個々の数値として得られれば構いません。
・(X)Matchによって複数検索結果を得る
a1
b1
b1
a2
b1
なる配列があるとして、
"*1"
Matchで検索をかけると、
2という結果しか得られません。
逆から検索をかけて5も取得できますが、3は得られない状況です。
ワークシート上なら
IndexとMatchを組み合わせて、
Matchの検索範囲をずらすと言う手があると思います。
しかし今回はVBAの配列上を検索範囲とすることになります。
Filter云々については、この捕捉欄の文字数の関係で、お礼に記します。
ああ、10回まで補足できるのか。
Filter云々については、
初めに"*1"でFilterに準ずることをすれば、
得られる配列の要素を「ワイルドカードを含まない具体的な」Matchの検索値
とすることもできますが、
今回は全く同じ値b1が複数含まれているので
それも意味をなさないかな
ということです。