エクセル小僧:全角英数字を半角英数字に変換(正規表現) [コンピューター]
正規表現を使用して、記号を含む全角英数字を半角英数字に変換するマクロを作成しました。
ほとんどパクリですが。。。
【目的】
・『今年』という名前のセルに全角数字で年の数字が入っている。
・年は平成。西暦2016年なら、『28』。
・これを半角数字に変換して、今年かどうか判定したい。
・マクロ2は、引数の文字列中の全角英数字を半角英数字に変換するマクロです。
・マクロ1は、全角の年(例:28)を『今年』のセルから取ってきて、マクロ2で半角数字(例:28)に変換し、今年かどうか判定します。
【マクロ1】
Sub Sample1()
'【変数】
Dim myYear1 As Integer ' 年
' 【実行コード】
' 『今年』セルの平成XX年(例:28)を半角数字(28)に変換後、0を足して数値化
myYear1 = zen2han(Range("今年").Value) + 0
' Dateから得られる西暦年の今年(例:2016)から1988を引いて平成XX年(28)にし、
' myYear1と一致しない場合は、今年のファイルでないことを警告
If myYear1 <> (Year(Date) - 1988) Then MsgBox ("今年のファイルじゃない!(平成" & Range("今年").Value & "年)")
End Sub
【マクロ2】
Function zen2han(ByVal ZenSuu1 As String) As String
'【機能】文字列中の全角英数字を半角英数字に変換(28→28)
'【引数】
' ZenSuu1 :全角数字(28)
'【変数】
Dim i As Integer
Dim myStr As String ' 文字列
Dim re1 As Object ' 正規表現オブジェクト
Dim Match, Matches As Object ' パターンにマッチした文字
'【コード】
Set re1 = CreateObject("VBScript.RegExp") ' 正規表現オブジェクトを生成
With re1
.Pattern = "[\uFF01-\uFF5E]+" 'パターン:unicodeの『!』(FF01)から『~』(FF5E)までの全角文字、1文字以上
.Global = True ' 文字列全体を検索
End With
myStr = ZenSuu1 ' 引数の文字列を代入
If Len(myStr) > 0 Then ' 1文字以上なら実行
Set Matches = re1.Execute(myStr) ' マッチングを実行。結果をMatchesコレクションとして返す
' マッチしたすべての全角文字列(Matchesコレクション中のMatchオブジェクト)を半角文字列に置換
For Each Match In Matches
' Replace(A, B, C) : Aの文字列の中から、Bの文字列を検索し、Cの文字列で置き換える
' StrConv(A, vbNarrow) : Aの文字列を半角文字列に変換
myStr = Replace(myStr, Match.Value, _
StrConv(Match.Value, vbNarrow))
Next Match
zen2han = myStr ' マッチした文字列を半角に変換した文字列を返す
Else
' 引数の文字列が無い場合
MsgBox ("文字列がありません。")
zen2han = "####"
End If
End Function
ほとんどパクリですが。。。
【目的】
・『今年』という名前のセルに全角数字で年の数字が入っている。
・年は平成。西暦2016年なら、『28』。
・これを半角数字に変換して、今年かどうか判定したい。
・マクロ2は、引数の文字列中の全角英数字を半角英数字に変換するマクロです。
・マクロ1は、全角の年(例:28)を『今年』のセルから取ってきて、マクロ2で半角数字(例:28)に変換し、今年かどうか判定します。
【マクロ1】
Sub Sample1()
'【変数】
Dim myYear1 As Integer ' 年
' 【実行コード】
' 『今年』セルの平成XX年(例:28)を半角数字(28)に変換後、0を足して数値化
myYear1 = zen2han(Range("今年").Value) + 0
' Dateから得られる西暦年の今年(例:2016)から1988を引いて平成XX年(28)にし、
' myYear1と一致しない場合は、今年のファイルでないことを警告
If myYear1 <> (Year(Date) - 1988) Then MsgBox ("今年のファイルじゃない!(平成" & Range("今年").Value & "年)")
End Sub
【マクロ2】
Function zen2han(ByVal ZenSuu1 As String) As String
'【機能】文字列中の全角英数字を半角英数字に変換(28→28)
'【引数】
' ZenSuu1 :全角数字(28)
'【変数】
Dim i As Integer
Dim myStr As String ' 文字列
Dim re1 As Object ' 正規表現オブジェクト
Dim Match, Matches As Object ' パターンにマッチした文字
'【コード】
Set re1 = CreateObject("VBScript.RegExp") ' 正規表現オブジェクトを生成
With re1
.Pattern = "[\uFF01-\uFF5E]+" 'パターン:unicodeの『!』(FF01)から『~』(FF5E)までの全角文字、1文字以上
.Global = True ' 文字列全体を検索
End With
myStr = ZenSuu1 ' 引数の文字列を代入
If Len(myStr) > 0 Then ' 1文字以上なら実行
Set Matches = re1.Execute(myStr) ' マッチングを実行。結果をMatchesコレクションとして返す
' マッチしたすべての全角文字列(Matchesコレクション中のMatchオブジェクト)を半角文字列に置換
For Each Match In Matches
' Replace(A, B, C) : Aの文字列の中から、Bの文字列を検索し、Cの文字列で置き換える
' StrConv(A, vbNarrow) : Aの文字列を半角文字列に変換
myStr = Replace(myStr, Match.Value, _
StrConv(Match.Value, vbNarrow))
Next Match
zen2han = myStr ' マッチした文字列を半角に変換した文字列を返す
Else
' 引数の文字列が無い場合
MsgBox ("文字列がありません。")
zen2han = "####"
End If
End Function
ヤバイぜ! ありがとうございます[__猫]
マクロ1は引数がありませんでしたね。
誤記修正しました。(^_0)ノ
by cheese999 (2016-05-03 21:40)
説明を追加しました。(^_0)ノ
by cheese999 (2016-05-05 20:52)