ちょいと複雑になってしまいましたが、こんな感じだと正規表現を使って、
変換する対象を限定することも可能ですよ。
' Option Explicit
Private m_RegExp As Object ' // RegExp Object
' 使いかたサンプル
Sub Sample()
Cells.Clear
With Range("A1:E500")
.Value = "あいうアイウABCabc123"
.Select
End With
DoEvents
MsgBox CStr(Selection.Count) & "個のテストデータセット完了。デモを開始"
MsgBox "全角英数字を半角にします"
Call RegStrConvRng(Selection, "[A-z0-9]+", vbNarrow)
DoEvents
MsgBox "半角英数字を全角にします"
Call RegStrConvRng(Selection, "[A-z0-9]+", vbWide)
DoEvents
MsgBox "カタカナを平仮名にします"
Call RegStrConvRng(Selection, ".*", vbHiragana)
DoEvents
MsgBox "平仮名をカタカナにします"
Call RegStrConvRng(Selection, ".*", vbKatakana)
DoEvents
MsgBox "正規表現で置換対象を限定することが可能です"
Cells.Clear
Range("A1").Value = "アイウあいうABC123"
MsgBox "B1 セルにユーザー定義関数を設定します"
Range("B1").Formula = "=RegStrConv(A1,""[A-z0-9]+"",8)"
MsgBox "終わり"
End Sub
' // 指定した Range に対して RegStrConv 関数を実行する
Private Sub RegStrConvRng( _
ByVal Target As Range, _
ByVal Pattern As String, _
ByVal ConvMode As VbStrConv _
)
Dim rArea As Range
Dim vBuf As Variant
Dim i As Long
Dim j As Long
' 終了条件:: データが無い
If Application.CountA(Target) = 0 Then Exit Sub
' 終了条件:: 定数セルが無い
If Not Target.MergeCells And Target.Count > 1 Then
On Error Resume Next
Set Target = Target.SpecialCells( _
xlCellTypeConstants, _
xlNumbers Or xlTextValues)
On Error GoTo 0
If Target Is Nothing Then Exit Sub
End If
' 置換メイン
On Error GoTo ERROR_HANDLER
For Each rArea In Target.Areas
vBuf = rArea.Value
If Not IsArray(vBuf) Then
ReDim vBuf(1 To 1, 1 To 1)
vBuf(1, 1) = rArea.Value
End If
For i = 1 To UBound(vBuf, 1)
For j = 1 To UBound(vBuf, 2)
vBuf(i, j) = RegStrConv(vBuf(i, j), Pattern, ConvMode)
Next j
Next i
rArea.Value = vBuf
Erase vBuf
Next rArea
Set Target = Nothing
Exit Sub
ERROR_HANDLER:
MsgBox Err.Description, vbCritical
End Sub
' // StrConv 拡張関数(ワークシート関数としても使えます)
Public Function RegStrConv( _
ByVal SourceText As String, _
ByVal Pattern As String, _
ByVal ConvMode As VbStrConv _
) As String
' 目 的: 正規表現を使って StrConv 関数の対象を限定させることが可能
' 引 数: SourceText 対象文字列
' : Pattern 正規表現マッチングパターン
' : ConvMode StrConv 関数の第二引数と同一
' : 1:大文字 2: 小文字 3: 頭のみ大文字 4: 全角 8: 半角
' : 16:カタカナ 32:ひらがな
' 備 考: ConvMode の定数は組み合わせが可能(例)半角化+カタカナ=8+16=24
Dim MC As Object ' MatchCollection
Dim M As Object ' Match
Dim Buf
Dim i As Long
If m_RegExp Is Nothing Then
Set m_RegExp = CreateObject("VBScript.RegExp")
End If
With m_RegExp
.Pattern = Pattern
.Global = True
.IgnoreCase = False
Set MC = .Execute(SourceText)
End With
For Each M In MC
SourceText = Replace$(SourceText, _
M.Value, _
StrConv(M.Value, ConvMode), _
Compare:=vbTextCompare)
Next M
Set MC = Nothing: Set M = Nothing
RegStrConv = SourceText
End Function
お礼
>このような質問の核心部分は最初に提示すべきでしたね すみませんでした、お手間を取らせる結果となってしまいました。 お蔭様でやりたかったことが完璧にできました。 ありがとうございました。