派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

VBAで正規表現を使う(①ファイル名に使用できない文字を置換する)

こんにちは。
派犬事務員のコロ子です。

f:id:SNegishi:20190315225058j:plain
コロ子仕事中

最近覚えた正規表現

正規表現とは?

アプリケーションやプログラミングにおいて正規表現を用いた文字列のパターンマッチングを行う機能のこと(ウィキペディアより抜粋)

正規表現を使うと文字列のいろいろなパターンのマッチングができるらしい。

最近覚えたので、Excelで名前を付けて保存するときにファイル名に使用できない文字があるかをチェックするマクロを作ってみた。

下記のような場合で
ファイル名を番号-品名-型番.xlsmにしたい。

f:id:SNegishi:20190315231435p:plain

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 検索パターンにマッチしたら置換する

コロ子の 思うこと

本音いうと、Patternプロパティでのパターンの設定の方法はかなり複雑で難しい。
新しく覚えた技を使ってみたくて作ったけど、正規表現を使わないでReplaceで置換する方が全然分かりやすくて好き。
会社では他にできる人いないし誰かに見せるでもないけど
もしかしたら、いずれ誰かが見るかもと思って見栄を張って正規表現での方法に作り替えてみた。他の人が見たらどっちが分かりやすいのだろう?
この見栄に意味はあるのか?