VBA　パターンマッチング　メモ

# はじめに
学習メモです。間違えている可能性があります。

# 正規表現（のような）マッチング
Like演算子を用いることで、簡易的なパターンマッチングを行うことが出来る。

| 記号 | 意味 | 例 |
|:-----------:|:------------| :------------| 
| ?      |  任意の１文字       |「ささ?」の場合、ささき/ささや/ささこなど |
| *       | 0個以上の任意の文字        | 「あ*」の場合、あい/あかさ/あいうえおなど |
| #      |  1文字の数値       |「##」の場合、01/34/68など |
| []      |  []内に指定した文字の中の１文字       |「[A-C]」の場合、A/B/C |
| [!]      |  [!]内に指定した文字の中に含まれない１文字      | 「[!A-C]」の場合、D/F/Gなど |

## 4桁数値のチェック（Like演算子）

```
例）４桁の数値かどうか判別する処理
Sub check()
    Dim number As String
    number = Cells(1, 1).Value '今回はCells(1,1)に対象があるとする
    If number Like "####" Then
        Debug.Print ("4桁の数字です")
    Else
        Debug.Print ("4桁の数字ではありません")
    End If
End Sub
```

「####」は数値４桁を表しているため、このような処理でできる。

# VBAで正規表現を利用する（RegExp）
マクロVBAで正規表現を行う場合は、RegExpオブジェクトを使用する。
RegExpオブジェクトは、正規表現の機能を提供するオブジェクトとのこと。

今回は、事前バインディングで使用する。
VBE→ツール→参照設定→「Microsoft VBScript Regular Expressions 5.5」にチェックを入れる。
その後、「Dim 変数名 As New RegExp」と宣言することで使用できるようになる。

## 4桁数値のチェック（正規表現）

```
Sub sample()
    Dim re As New RegExp '事前バインディング
    
    With re
        .Global = True '検索文字列全体について検索する(True)
        .IgnoreCase = True '検索するときに大文字と小文字を区別しない(True)
        .Pattern = "^\d{4}$" '４桁数値を判別するパターン　先頭と末尾を指定しないと4桁以上も対象となってしまう
        If .test(Cells(1, 1)) Then
            Debug.Print ("4桁の数値です")
        Else
            Debug.Print ("4桁の数値ではありません")
        End If
    End With
End Sub
```

まず、特定のオブジェクト型（New RegExp）として変数reを宣言。
Withステートメントを用いて、指定オブジェクト名の記述を省略。

今回は３つのRegExpオブジェクトプロパティを指定。
※よく考えたら、Patternプロパティだけでよさそう。とりあえずメモ用なので残しておく。

| プロパティ | 説明 |
|:-----------:|:------------| 
| Global      |  検索文字列全体について検索する場合True、最初の一致を検索する場合False（既定値）       |
| IgnoreCase      |  検索するときに大文字小文字を区別しない場合True、区別する場合False（既定値）       |
| Pattern      |  検索するパターンの設定      |

このようなプロパティを用いることで、より複雑な検索ができる。

testメソッドは、引数に指定した対象からパターンに一致する場合Trueを返す。一致しない場合Falseを返す。そのためIfステートメントを用いて、各結果に対する文字列を出力している。

パターンに関しては、以下のものを使用。

| シンボル | 機能 |
|:-----------:|:------------| 
|  ^     |  文字列の先頭にのみマッチする  |
|  $    |  文字列の末尾にのみマッチする  |
|  \d     | 任意の数字にマッチする。[0-9]と等価   |
|  {x}    | 正規表現のx個の直前の文字にマッチ   |

もし、パターンが「\d{4}」だった場合、先頭と末尾を指定していないため
「1234abc5」や「1abc2345」のように4桁の数値がまとまってあればマッチしてしまう。

そのため、「^\d$」と先頭と末尾を指定することで、前後どちらからでも4桁の数値（4桁の数値）となる。


# 事前バインディングと実行時バインディング（おまけ）
### 事前バインディングと実行時バインディングとは？
バインディングは、bind=関連付ける、結びつけるという意味。
オブジェクトがオブジェクト変数に代入されるとき、バインディングと呼ばれる処理を実行する。

ざっくりいうと、どちらも外部のActiceXオブジェクトを参照するものでそのタイミングが違う。

### ActiveXオブジェクトとは？

>ActiveXオブジェクトとは、オートメーションをサポートするアプリケーションがオートメーションインターフェースを通してほかのアプリケーションに公開しているオブジェクト
[第138回.外部ライブラリ（ActiveXオブジェクト）](https://excel-ubara.com/excelvba1/EXCELVBA438.html)

VBAでは、このライブラリのオブジェクトを参照することでアプリケーションを操作できる。

### 事前バインディング
特定のオブジェクト型として宣言された変数に代入される場合、オブジェクトは事前（コンパイル時）にバインディングされる。ただし、参照設定が必要。

・参照設定
VBEのツール→参照設定から参照したいファイルを指定する。
そうすることで、参照設定で直接オブジェクトを呼び出すことが出来る。

### 実行時バインディング
オブジェクトがObject型として宣言された変数に代入される場合、実行時にバインディングされる。






# 参考
- [正規表現のようなマッチング](http://officetanaka.net/excel/vba/tips/tips35.htm)
- [VBAで正規表現を利用する（RegExp）](https://excel-ubara.com/excelvba4/EXCEL232.html)
- [RegExp オブジェクト](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392403(v=msdn.10)?redirectedfrom=MSDN)
- [第138回.外部ライブラリ（ActiveXオブジェクト）](https://excel-ubara.com/excelvba1/EXCELVBA438.html)
- [事前バインディングと遅延バインディング（実行時バインディング）](https://excel-ubara.com/excelvba4/EXCEL227.html)
- [第51回.Withステートメント](https://excel-ubara.com/excelvba1/EXCELVBA351.html)