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

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

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

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

正規表現

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

Q&A

3回答

2472閲覧

VBAの正規表現について

piyotaka

総合スコア39

VBA

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

正規表現

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

0グッド

0クリップ

投稿2016/09/07 15:43

編集2016/09/09 05:28

VBAと正規表現について勉強している者です。

1 2以下の構造の場合,どういったコードになるか 3ご教授願えると幸いです。 4 5既存ファイルを開く 67開いたファイルのA列を空白まで読み込む 89読み込んだ中に,特定の文字がある場合, 10その文字のあった横一列を配列に入れる 1112新規ファイルを開く 1314横一列が入った配列を新規ファイルに書き込み 1516既存,新規ファイルを閉じる 17 18特定の文字は,(tar)(cab)(msi)が検索パターンです(検索対象はA列です)。 19 20正規表現自体をコードに落とした時の書き方自体があまり良く理解できていないので, 21ここのご教授もして頂けると大変有難いです。 22 23不足部分,質問があれば何でも仰ってください。 24 25以上,よろしくお願いいたします。 26 27 28Sub Sample() 29 Dim RE, strPattern As String, i As Long, msg As String, reMatch 30 Set RE = CreateObject("VBScript.RegExp") 31 strPattern = "*.(t|c|m)(a|s)(r|b|i)$" 32 With RE 33 .Pattern = strPattern 34 .IgnoreCase = True 35 .Global = True 36 For i = 1 To 10 37 Set reMatch = .Execute(Cells(i, 1)) 38 If reMatch.Count > 0 Then 39 msg = msg & reMatch(0).Value & vbCrLf 40 End If 41 Next i 42 End With 43 MsgBox msg 44 Set reMatch = Nothing 45 Set RE = Nothing 46End Sub 47 48上記のようなコードは, 49エラーになります。 50strPattern = "*.(t|c|m)(a|s)(r|b|i)$" 51が構文としておかしいと考えているのですが, 52直し方がよくわかりません。

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

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

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

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

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

ynakano

2016/09/08 14:51

「正規表現を使うこと」自体が目的に含まれていますでしょうか? それともあくまで特定の文字列を判別できればよいのでしょうか?
piyotaka

2016/09/08 15:00

正規表現を使いたいです。 出来ない場合は,他の方法でとは考えてはいますが, できるならば,正規表現を使いたいです。
ynakano

2016/09/08 15:03

ありがとうございました。
diracpaul

2016/09/09 15:10

「特定の文字は,(tar)(cab)(msi)が検索パターンです(検索対象はA列です)」がわかりません。A列のセルを順次調べ、この中に「tar」あるいは「cab」「msi」だったらメッセージを表示するのでしょうか? それとも、セル内の末尾が「.tar」「.cab」「.msi」か調べるのでしょうか? 文字列の検索ルールを具体的に書いてください。
guest

回答3

0

「特定の文字は,(tar)(cab)(msi)が検索パターンです 」 という検索条件がわかりませんが、とりあえず、A列のセル値の末尾が 「.tar」「.cab」「.msi」だったらヒットするという条件した場合の正規表現は以下のようになります。
strPattern = "^.*(.tar|.cab|.msi)$"

正規表現の場合、「^$|.()」などの特殊文字以外については、そのまま続けて定義するとその文字が見つかったらヒットするとなります。例えば、 "^tar$"とかくと、文字列が"tar"であればヒットします。このときの^は先頭、$は最後を示します。
したがって、tarあるいはcabであれば、”^(tar|cab)$”となります。

.tarまたは.cabであれば、.を意味の無い文字コードと認識させるため、.の前に¥を追加し"^(¥.tar|¥.cab)$"とします。

その前に任意文字列を許す*.tarや*.cab等にしたいのであれば、正規表現として「.*」を指定します。.は、任意の1文字を表し、*は、それを0回以上を示します。

詳しい使い方については、VBAの正規表現に対する説明がWebにたくさんあるので検索してみてください。

投稿2016/09/10 05:13

diracpaul

総合スコア157

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

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

0

正規表現を使わなくてもいけるような気がします。

まず、必ずセルA1に値が入っているという前提だと、

Range("a1").CurrentRegion.Select Selection.Rows.Count Selection.Columns.Count

で縦方向、横方向いくつまで値が入っているか最大値を取得できます。
(矩形範囲の選択となります。MsbBoxで表示させるなどして試してください。)

A1から縦方向最大値までループを回してセルA<n>の値を各々取得したら、instr関数で"tar"、"cab"、"msi"が含まれるか否かを判断できます。
文字列が含まれていない場合は0を返すので、それで判断できます。
検索文字列が拡張子のようなので、必ず文字列の末尾に来るとわかっているならright関数でもよいと思います。

検索文字列があった場合は、セルA<n>:<m><n>までをコピーし、新規ファイルのA<l>に貼り付け、でどうでしょうか。
当然貼り付けたら<l>の値をインクリメントします。

投稿2016/09/07 23:36

編集2016/09/08 01:26
ynakano

総合スコア1894

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

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

ynakano

2016/09/07 23:42

補足します。 セルの最大値を数値で取得すると、横方向(A,B,C...)のセル番地の取り扱いが面倒になると思います。 その場合、rangeでセル番地を指定するのではなく、cellsで指定できます。 例えば"cells(3,1).select"とした場合、"A3"が選択されます。 上記のとおり、rangeとは縦横方向の指定が逆になりますが、ループで回す等する場合はセル番地がすべて数値で扱えるのでやりやすくなります。
guest

0

まず簡単にコードを起こすには「マクロの記録」で一連の操作を
実施・コード化することをお勧めします。

その後で正規表現などのコードを組み込めば良いと思います。

正規表現はこちらが参考になります。
http://officetanaka.net/excel/vba/tips/tips38.htm

また、次のような処理順に書き換えると配列が必要なくなり、
大量データでも処理しやすいと思います。

既存ファイルを開く ↓ 新規ファイルを開く ↓ <ループ開始> 開いたファイルのA列を空白まで読み込む ↓ 読み込んだ中に,特定の文字がある場合, その文字のあった横一列を新規ファイルに書き込み <ループ終了> ↓ 既存,新規ファイルを閉じる

投稿2016/09/07 15:50

編集2016/09/07 16:03
Tipo

総合スコア239

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問