VBAで正規表現を使う(①ファイル名に使用できない文字を置換する)
こんにちは。
派犬事務員のコロ子です。
最近覚えた正規表現
正規表現とは?
アプリケーションやプログラミングにおいて正規表現を用いた文字列のパターンマッチングを行う機能のこと(ウィキペディアより抜粋)
正規表現を使うと文字列のいろいろなパターンのマッチングができるらしい。
最近覚えたので、Excelで名前を付けて保存するときにファイル名に使用できない文字があるかをチェックするマクロを作ってみた。
下記のような場合で
ファイル名を番号-品名-型番.xlsmにしたい。
A1-AAA/BBB-123:456.xlsm
にしたいけど、ファイル名に使用できない文字が入ってる!
Windowsでファイル名に使用できない文字
① \(半角の¥マーク)
② /
③ :
④ *
⑤ ?
⑥ "
⑦ <
⑧ >
⑨ |
上記に加え、エクセルのファイル名に使用できない文字
⑩ [
⑪ ]
上記11個の文字はファイル名に使用できない。
この文字が入っていたら_(アンダーバー)に置き換えて名前を付けることにしよう。
今まではこんな感じ。(正規表現を使わない場合)
Sub ChangeChar() Dim SampleName As String Dim Model As String SampleName = Range("B2") SampleName = Replace(SampleName, "\", "_") SampleName = Replace(SampleName, "/", "_") SampleName = Replace(SampleName, ":", "_") SampleName = Replace(SampleName, "*", "_") SampleName = Replace(SampleName, "?", "_") SampleName = Replace(SampleName, """", "_") SampleName = Replace(SampleName, "<", "_") SampleName = Replace(SampleName, ">", "_") SampleName = Replace(SampleName, "|", "_") SampleName = Replace(SampleName, "[", "_") SampleName = Replace(SampleName, "]", "_") Model = Range("C2") Model = Replace(Model, "\", "_") Model = Replace(Model, "/", "_") Model = Replace(Model, ":", "_") Model = Replace(Model, "*", "_") Model = Replace(Model, "?", "_") Model = Replace(Model, """", "_") Model = Replace(Model, "<", "_") Model = Replace(Model, ">", "_") Model = Replace(Model, "|", "_") Model = Replace(Model, "[", "_") Model = Replace(Model, "]", "_") ActiveWorkbook.SaveAs _ Filename:=ActiveWorkbook.Path & "\" & _ Range("A2").Value & "-" & SampleName & "-" & Model & ".xlsm" End Sub
ながーい、しつこーい。
正規表現を使うと
Sub NewChangeChar() Dim re As Object '① Dim SampleName As String Dim Model As String Set re = CreateObject("VBscript.RegExp") '② re.Pattern = "[\\/:*?""<>|\[\]]" '③ re.Global = True '④ SampleName = re.Replace(Range("B2").Value, "_") ’⑤ Model = re.Replace(Range("C2").Value, "_") ActiveWorkbook.SaveAs _ Filename:=ActiveWorkbook.Path & "\" & _ Range("A2").Value & "-" & SampleName & "-" & Model & ".xlsm" End Sub
スッキリ!
【説明】
①② 正規表現を使う
Dim 変数 As Object
set 変数 = CreateObject("VBScript.RegExp")
③Pattern 検索パターンを設定する。[ ] 内の文字の任意の一文字にマッチする。
メタ文字(\ [ ] など)とマッチさせるときは文字の前に\を付ける。
"とマッチさせるときは前に"をつける。
④Global 文字列全体を検索する:True(最初の1回だけ:False)
⑤Replace 検索パターンにマッチしたら置換する