正規表現の説明で、よく郵便番号が例に使われます。
いくつかの郵便番号の表示形式から 正規表現 を使って7桁数字に変換する関数を作成します。
ユーザー定義関数(functionプロシージャ)コード
まず作成したコードを紹介します。
'---------------------------------------------------------------------- ' fnTransPostalForm ' 郵便番号を半角7桁数字に変換する ' 引数 : in_strtext = 変換前文字列 ' 戻り値 : String = 7桁半角数字文字列 '---------------------------------------------------------------------- Function fnTransPostalForm(in_strText As String) As String Dim strText As String Dim objRgE As Object '正規表現オブジェクト strText = in_strText '半角に統一 strText = StrConv(strText, vbNarrow) ' 'セル内でゼロが欠落した場合にゼロを頭につける ' If IsNumeric(strText) Then ' If Val(strText) = Int(strText) And _ ' Val(strText) > 0 And Val(strText) < 1000000 Then ' strText = Right("00" & strText, 7) ' End If ' End If Set objRgE = CreateObject("VBScript.RegExp") With objRgE objRgE.Pattern = "^〒?([0-9]{3})$-?([0-9]{4})$" objRgE.IgnoreCase = False objRgE.Global = True End With ' '形式チェック ' If objRgE.test(strText) Then '戻り値セット fnTransPostalForm = objRgE.Replace(strText, "$1$2") ' Else ' Err.Raise _ ' Number:=19199, Description:="郵便番号の形式が不正です。" ' End If Set objRgE = Nothing End Function
引数(パラメータ)の前提条件
引数(パラメータ)となる郵便番号の形式は以下のいずれかであることが前提です。
なお、"N"は、半角か全角は問いませんが、0から9の数字のいずれかの1文字を表します。
- 〒NNN-NNNN
- 〒NNNNNNN
- NNN-NNNN
- NNNNNNN
「 fnTransPostalForm( "〒123-9876" ) 」とすると、"1239876"を返します。
この形式に反する引数(パラメータ)が指定された場合、半角変換されただけの文字列が返ってきます。
コードの簡単な説明
まず、StrConv関数を使って半角文字に変換可能な文字をすべて半角に変換します。
ここからは正規表現オブジェクトを使用しています。
この記事をご覧いただいている方は、正規表現の初心者の方がほとんどだと思うので、本来正規表現そのものについて説明すべきでしょう。
ただ、正規表現やオブジェクトのプロパティの情報はあふれていますので、解説は省略します。
正規表現を学習すれば理解できるのですが、PatternプロパティとReplaceメソッドに記述している内容だけ解説します。
「^」
"^" は、このあとに記述する文字(今回は'〒'または[0-9])で始まることを意味します。
「〒?」と「-?」
"〒?" は、郵便マークがあったりなかったりすることを意味します。
同様に、"-?"は、ハイフンがあったりなかったりすることを意味します。
「[0-9]」
"[0-9]" は半角数字であること意味します。
前段処理で全角数字は半角に変換されているため、半角数字のみを対象としていますが、全角数字も対象にしたいときは「[0-90-9]」となります。
「{3}」と「{4}」
"{N}"は、直前の文字はN回連続することを意味します。
つまり、[0-9]{3}は半角3桁数字を、[0-9]{4}は半角4桁数字を表します。
それぞれを "()" で囲んでいますが、これにより3桁と4桁をそれぞれかたまりで処理できます。
「$」
"$" は文末を意味します。これをつけることで、数字3桁と4桁で構成されるもの以外つまり8けた数字などを排除します。
Replaceメソッド
Patternプロパティでなく、戻り値をセットしているときに使用している"Replace"メソッドの説明になります。
Pattenプロパティで、半角3桁数字と半角4桁数字をかたまりとして指定しましたが、「$1$2」はこのかたまりを連結したものを返すということを意味します。
3桁と4桁をハイフンでつなげたいときは「$1-$2」と記述します。
郵便番号の形式チェックもしたい場合
郵便番号の形式が正しいことを前提にしていますが、形式チェック自体も行いたい場合は戻り値を設定している周辺のコメントアウトしているif文を編集してください。
ただ、ここで記述している強制的にエラーにする処理はおすすめしませんので修正して利用してください。
ご質問は下の 「コメントを書く」 からお願いします。
ExcelやVBA全般に関わる質問で、比較的簡単にお答えできるものはできる限り回答したいと思います。
回答を公開でなくメールでやり取りしたいという場合は、その旨記載していただければ非公開で回答することも可能です。
有償での作業依頼は非公開にしますので、条件等をお知らせください。