
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
Excel MATCH関数で検索範囲内に同じ値の検索値が複数ある場合
Access(アクセス)
-
-
4
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
5
matchプロパティを取得できません…と出ます。
PowerPoint(パワーポイント)
-
6
別のシートから値を取得するとき
Visual Basic(VBA)
-
7
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
8
VBA エラー回避を教えてください。ループ内のMatchで値がないと止まってしまいます。
Excel(エクセル)
-
9
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
10
VBAでのMATCH関数
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
動的配列が存在(要素が有る)か...
-
ログデータを表示するグラフに...
-
ジャグ配列とは
-
VBでbyte配列型のインスタンス...
-
EXCEL VBA で、0から?1から?
-
遅延バインディングを使用でき...
-
変数を動的に作るには?
-
Visual C++ でコントロールを...
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JavaScriptの変数をjavaのメソ...
-
ORA-01858: 数値を指定する箇所...
-
javaで質問です。 文字列2023/2...
-
JScrollPaneで、表示がおかしく...
-
JavaScriptを使ってロト6の当...
-
streamで送信されたArrayListを...
-
JavaScriptとVBScriptに関して
-
ループ処理の際、最後だけ","を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
動的配列が存在(要素が有る)か...
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
C言語 重複しない4ケタの乱数...
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
VBでbyte配列型のインスタンス...
-
10進数を4桁のバイト配列に格納...
-
ジャグ配列とは
-
ログデータを表示するグラフに...
-
ゲーム箱入り娘のつくりかた
-
遅延バインディングを使用でき...
-
VBで作った乱数を一度も重複さ...
-
C#の質問
-
このプログラムがわかりません
-
【MFC】GetCount()とGetSize()...
おすすめ情報
ご返答ありがとうございます。
>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が複数含まれているので
それも意味をなさないかな
ということです。