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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

3回答

2402閲覧

【正規表現】【Excel】【VBA】似た文字列群から完全一致する文字列を検索できない

howto_o

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/03/30 08:15

編集2020/03/30 08:19

前提・実現したいこと

● 前提
Excelで、似ている文字列群の中から
任意の単語を検索し
その位置(座標)が知りたい

- 文字列群(Excelのシート1 / マス目B1:B3)
AAAB
AAA
AAAC
- 検索したい文字(Excelのシート2 / マス目E27)
AAA

ExcelのMATCH関数やVBAのFIND関数で
"完全一致"を使って検索しました。
ですが、文字列群の上の行から順に検索されるため
「AAA」ではなく「AAAB」の位置が返ってきてしまいます。

● 実現したいこと
Excelで、文頭から途中まで同じ文字列群の中から
任意の単語1つ(文頭から文末まで完全一致する)を検索し
その位置(座標)が知りたい

試したこと

ExcelのMATCH関数やVBAのFIND関数を試した。
※ 正規表現でできるならその方法を教えて欲しいです。

"完全一致"を使って検索できるが
文字列群の上の行から順に検索されるため
「AAA」ではなく「AAAB」の位置が返ってきてしまう

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

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

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

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

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

nanami12

2020/03/30 08:26

n文字列数と条件に加えればどうでしょか
hatena19

2020/03/30 08:31

現状のVBAコードを質問に追記してください。
howto_o

2020/03/30 08:36

nanami12様 検索したいAAAの文字数と 見つけた文字数が一致していたら完全一致ということでしょうか。 それはまだ試していませんでした。
howto_o

2020/03/30 08:36

hatena19様 はい、追記いたします。
guest

回答3

0

関数使わずに、単純比較。  速度は遅い??

VBA

1Dim sh1 As Worksheet 2Dim sh2 As Worksheet 3Set sh1 = Worksheets("Sheet1") 4Set sh2 = Worksheets("Sheet2") 5 6Dim S As String 7S = sh2.Range("E27").Text 8 9Dim target As Range 10For Each target In sh1.Range("B1:B3") 11 If S = target.Text Then 12 Debug.Print target.Row 13 Exit Sub 14 End If 15Next

投稿2020/03/30 09:47

sinzou

総合スコア392

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

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

0

VBAでも普通に2が返りますね。

vba

1 'MATCH関数 2 MsgBox WorksheetFunction.Match("AAA", Range("B1:B3"), 0) 3 4 'Findメソッド 5 MsgBox Range("B1:B3").Find("AAA", LookAt:=xlWhole).Row

投稿2020/03/30 08:45

編集2020/03/30 08:49
hatena19

総合スコア34075

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

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

0

ベストアンサー

「AAA」ではなく「AAAB」の位置が返ってきてしまう

普通に「=MATCH(E1,B1:B3,0)」で2が返ってきませんか?
ワイルドカード文字が検索文字に含まれる場合=MATCH(SUBSTITUTE(SUBSTITUTE(E1,"?","~?"),"*","~*"),B1:B3,0)

※sheet1のE1に検索対象を入れています。
イメージ説明

VBAならRange.Find2,2が返りませんか?
※ワイルドカード文字が検索文字列に含まれる場合は邪魔くさいので ワークシート関数のFindを使った方がいいです。

VBA

1Sub Macro1() 2 Dim target As Range 3 Set target = Range("B1:B3").Find(What:=Range("E1").Text, _ 4 LookAt:=xlWhole, MatchCase:=True) 5 Debug.Print target.Row & "," & target.Column 6End Sub

イメージ説明

投稿2020/03/30 08:33

編集2020/04/02 09:01
Y.H.

総合スコア7918

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

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

howto_o

2020/03/30 08:51

Y.H.様 ご確認いただきありがとうございます。 A, B, Cの文字列の場合ですと その通りで'2'が返ってきました。 (自分も今知りました。) ですが、実際は下記のような文字列を検索したいのです。 - 検索したい文字 /*Hoge*//*HUGA_HUGA_HUGA*/ - 検索する文字列群 /*Hoge*//*HUGA_HUGA_HUGA_ABC*/ /*Hoge*//*HUGA_HUGA_HUGA*/ /*Hoge*//*HUGA_HUGA_HUGA_DEF*/ そうするとY.H.様がやってくれたケースでも '1'が返ってくるのでそれが分からず。。。
Y.H.

2020/03/30 08:56

*,?はワイルドカードなので =MATCH(SUBSTITUTE(SUBSTITUTE(E1,"?","~?"),"*","~*"),B1:B3,0) とかすればできそうですね。
howto_o

2020/03/30 08:58

Y.H.様 Range.Findを使用した場合、 下記のような文字列でも (2, 2)が返ってくるのでしょうか。 - 検索したい文字 /*Hoge*//*HUGA_HUGA_HUGA*/ - 検索する文字列群 /*Hoge*//*HUGA_HUGA_HUGA_ABC*/ /*Hoge*//*HUGA_HUGA_HUGA*/ /*Hoge*//*HUGA_HUGA_HUGA_DEF*/
howto_o

2020/03/30 09:02

Y.H.様 ありがとうございます! まずは簡易的に確認させていただきましたところ 「=MATCH(SUBSTITUTE(SUBSTITUTE(E1,"?","~?"),"*","~*"),B1:B3,0)」 を使用すると、 本当に検索したい、完全一致の文字の位置が返ってきました。
Y.H.

2020/03/30 09:17 編集

VBAのRange.FIndは、After引数が邪魔くさいので VBAからワークシート関数のFind(WorksheetFunction.Match)を使う方がいいでしょうね。 やってることは「=MATCH(SUBSTITUTE(SUBSTITUTE(E1,"?","~?"),"*","~*"),B1:B3,0)」 と同じです。 Dim str As String str = Replace(Range("E1"), "?", "~?") str = Replace(str, "*", "~*") Dim ret As Integer ret = WorksheetFunction.Match(str, Range("B1:B3"), 0) Debug.Print ret
howto_o

2020/04/01 06:13

Y.H.様 str = Replace(Range("E1"), "?", "~?") str = Replace(str, "*", "~*") 上記について解説していただけますと幸いです。 ”Replace(Range("E1"), "?", "~?")” で、E1範囲の文字を置き換えようとしていることは分かりますが なぜ "?" なのかが理解できていません。 下記などは参照してみたのですが、もう少し詳しく教えていただけませんか。 https://qiita.com/Yinaura/items/eed08b8cf9b82160a202
Y.H.

2020/04/01 06:27 編集

"?"は任意の1文字にマッチします。 "?"自体を検索したい場合は"~?"と~でエスケープします。 "*"は任意の0文字以上にマッチします。 "*"自体を検索したい場合は"~*"と~でエスケープします。 普通にExcelで[CTRL]+[F]で検索した場合も同じです。 セルA1に"ABCD" 、セル A2に"AB?CD" を入れて、"B?"で検索したときと、"B~?"で検索したときの動作を比較してみてください。前者はA1,A2両方マッチしますが、後者はA2のみマッチします。
howto_o

2020/04/01 07:28 編集

Y.H.様 ありがとうございます! "~"を前に付けるとワイルドカードとしてではなく "*"や"?"を検索したい文字として認識してくれてたのですね。 下記のReplace関数は、SUBSTITUTE関数で良いかと思っていますが 合っていますか? Dim str As String str = Replace(Range("E1"), "?", "~?") str = Replace(str, "*", "~*") Dim ret As Integer ret = WorksheetFunction.Match(str, Range("B1:B3"), 0) Debug.Print ret
Y.H.

2020/04/01 07:32

> 下記のReplace関数は、SUBSTITUTE関数で良いかと思っていますが ここで使用しているのはVBAのReplace()関数です。 ワークシート関数のSUBSTITUTE()を使用する場合は WorksheetFunction.SUBSTITUTE() を使用してください
howto_o

2020/04/02 08:52

分かりました。 VBAかワークシートで使う関数は異なりました。 教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問