
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)
-
Excel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合
Access(アクセス)
-
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
VBA データ(特定値)のある最終行を取得したい
Excel(エクセル)
-
6
配列の要素がすべてカラかどうかの判断
Visual Basic(VBA)
-
7
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
10
ApplicationとWorksheetFunctionの違い
Visual Basic(VBA)
-
11
vbaでworksheetfunctionでの複数関数がエラーになります
Visual Basic(VBA)
-
12
VBA Match関数の限界
Excel(エクセル)
-
13
VBAのWindowオブジェクトとWorkbookオブジェクトの違い
Visual Basic(VBA)
-
14
Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる
Visual Basic(VBA)
-
15
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
16
VBAでのMATCH関数
Visual Basic(VBA)
-
17
VBAのFind関数で結合セルを検索するとヒットしない
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IF関数でEmpty値を設定する方法。
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
VBAで配列の計算
-
EXCEL VBA で、0から?1から?
-
VB.net 引数で配列変数を渡す際...
-
C# での文字列パディング
-
C言語 重複しない4ケタの乱数...
-
Sourcearrayの読み方を教えてく...
-
配列通しのOR演算
-
2次元配列のマスを数える方法...
-
配列の要素数を超えた参照のコ...
-
連想配列じゃない配列は何て呼...
-
複数のテキストボックスに同じ...
-
C#の質問
-
2次元配列の、黒いマス目で囲...
-
Visual C++ でコントロールを...
-
10進数を4桁のバイト配列に格納...
-
多次元配列
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動的配列が存在(要素が有る)か...
-
IF関数でEmpty値を設定する方法。
-
EXCEL VBA で、0から?1から?
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
パソコンキーボードで時分秒を...
-
変数を動的に作るには?
-
VBでbyte配列型のインスタンス...
-
VBで作った乱数を一度も重複さ...
-
Excel VBAで配列の途中から(X)M...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
ラジオボタンのチェックをEnter...
-
C言語 重複しない4ケタの乱数...
-
排列と配列の漢字の使い分けは
-
For文と配列
-
Visual C++ でコントロールを...
-
C++、クラスメンバの構造体配列...
-
遅延バインディングを使用でき...
-
int型配列の一括初期化
おすすめ情報
ご返答ありがとうございます。
>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が複数含まれているので
それも意味をなさないかな
ということです。