Microsoft Excel 2007 マクロで正規表現
Microsoft Excel 2007 マクロで正規表現
Excel 2007のマクロで正規表現を使った時のメモです。
正規表現を使用する必要はなかったのですが、何か今後のためになるかと思って使ってみました。
私が実現したいことは以下
- ワークブック内の全てのシートに対して実行したい
- 特定のセルに入っている"100 ml"の様な値を100とmlに分けたい(どうやら%は数値とくっついているようなので別に処理しないといけない)
具体的には
|
項目名1 |
項目名2 |
項目名3 |
|
項目1 |
|
|
100 ml |
|
を
|
項目名1 |
項目名2 |
項目名3 |
|
項目1 |
|
|
100 |
ml |
みたいな。
以下手順です。
1.Excelを開く
言わずもがな。
2.Visual Basicを開く
Excelを開いた状態でAlt + F11を押す。
3.VBScriptで正規表現を使用できるようにする
[ツール]-[参照設定]から、Microsoft VBScript Regular Expression 5.5をチェックしてOKをクリック。
4.コードを記述する。
初心者ですので見栄えはあれですけど、とりあえず以下のコードで自分がやりたいことが実現できました。%の処理についてはまだやってません。そのうちかきます。
matchcollection, match, submatchesの関係を理解するのが自分にはちょっと時間がかかりました。
Sub ParseUnit()
Dim i As Long, msg As String
Dim RE As New VBScript_RegExp_55.RegExp
Dim mc As VBScript_RegExp_55.MatchCollection
Dim m As VBScript_RegExp_55.Match
Dim sm As VBScript_RegExp_55.SubMatches
Dim sheet As Worksheet
For Each sheet In Worksheets
sheet.Activate
'数値 空白 単位となる
'%は数値とくっついてるので再考
strPattern = "^(.*)\s(.*)$"
With RE
.Pattern = strPattern
.IgnoreCase = True
.Global = False
'1行目は項目なので飛ばす
i = 2
'PIDが存在する行まで実行
Do Until Cells(i, 1).Value = Empty
If .Test(Cells(i, 4)) Then
Set mc = .Execute(Cells(i, 4))
Set m = mc.Item(0)
Set sm = m.SubMatches
'数値はそのままの位置に
Cells(i, 4).Value = sm.Item(0)
'単位を一つ右のセルに移動
Cells(i, 5).Value = sm.Item(1)
End If
i = i + 1
Loop
End With
Next
MsgBox "end"
Set mc = Nothing
Set RE = Nothing
End Sub