VBAの勉強を始めてみた

色々試しています。

VBAでカタカナ(または数字・英字・記号)のみを全角(または半角)にする

今回はVBAを使って、エクセルに入力された文字列のうち、カタカナ(または数字・英字・記号)のみを全角(または半角)にしてみようと思います。
これがどんな時に役立つかというと・・・・・・、カタカナや英字や数字や記号のみを半角全角にしたい時です(*`・ω・)※そのまんま
かんたんなのでさっそくやってみましょう!

目次

  

数字のみを変換する

◇全角→半角

Sub 数字のみ半角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
        For i = 1 To Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[0-9]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbNarrow))
            End If
        Next i
    Next myRange
    
End Sub

一発目なので簡単に説明します。セル内の文字列を左端から1文字ずつ、全角数字かそうでないかを調べ、全角数字であれば半角数字に変換します。これを右端まで繰り返します。右端まで行ったら、次のセルに処理が移ります。とっても愚直です。

 

◇半角→全角

Sub 数字のみ全角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
        For i = 1 To Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[0-9]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbWide))
            End If
        Next i
    Next myRange
    
End Sub

説明省略。

 

英字のみを変換する

◇全角→半角

Sub 英字のみ半角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
        For i = 1 To Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[A-Za-z]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbNarrow))
            End If
        Next i
    Next myRange
    
End Sub

説明省略。

 

◇半角→全角

Sub 英字のみ全角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
        For i = 1 To Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[A-Za-z]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbWide))
            End If
        Next i
    Next myRange
    
End Sub

説明省略。

 

カタカナのみを変換する

◇全角→半角

Sub カタカナのみ半角にする()
    '選択範囲に対して処理を行います
    '「-」は、ひらがなとカタカナ区別なく半角にします。半角にしたくない場合、ァ-ヶの後のーを消去して下さい
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
    
        i = 1
    
        Do While i <= Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[ァ-ヶー]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbNarrow))
            End If
            
            i = i + 1
            
        Loop
    Next myRange
    
End Sub

濁点・半濁点が付くカタカナを半角にすると、1文字増える(例えば「ガ」を半角にすると、「カ」と「゙」の2文字になる)ので、ループ回数が固定であるFor ~NextではなくDo While ~Loopを使っています。 お節介かもしれませんが、長音符号を含む、例えば「ラーメン」を変換すると「ラーメン」になってしまうので、「ラーメン」になるように「-」も変換対象にしてます。

 

◇半角→全角

Sub カタカナのみ全角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer
    Dim cnt As Integer
    DimAs Integer

    For Each myRange In Selection
    
        i = 1
    
        Do While i <= Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[ヲ-゚]" Then
                cnt = cnt + 1
                If Mid(myRange.Value, i, 1) Like "[゙゚]" Then=+ 1 '濁点と半濁点の数をカウントする
                End If
            ElseIf cnt > 0 Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i - cnt, cnt, _
                StrConv(Mid(myRange.Value, i - cnt, cnt), vbWide))
                i = i - 濁: 濁 = 0 '濁点と半濁点の数をiから引く
                cnt = 0
            End If
            
            i = i + 1
            
        Loop
        
        If cnt > 0 Then
            myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i - cnt, cnt, _
            StrConv(Mid(myRange.Value, i - cnt, cnt), vbWide))= 0
            cnt = 0
        End If

    Next myRange
    
End Sub

1文字ずつ変換すると、ガ→カ゛のようにカタカナと濁点・半濁点がそれぞれ全角になってしまいます。ということで、左端から1文字ずつ調べ、半角のカタカナと半角の濁点・半濁点が連続する間は、その数をカウントするだけにします。連続が途切れたら、そこまでをまとめて変換します(まとめて変換すれば、ガのように1文字のカタカナになる)。濁点と半濁点の分だけ文字数が減るので、iからマイナスします。

 

記号のみを変換する

◇全角→半角

Sub 記号のみ半角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
    
        i = 1
    
        Do While i <= Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[!0-90-9A-Za-zA-Za-zァ-ヶヲ-゚]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbNarrow))
            End If
            
            i = i + 1
            
        Loop
    Next myRange
    
End Sub

正確に言うと、数字・英字・カタカナではないものを変換します。

 

◇半角→全角

Sub 記号のみ全角にする()
    '選択範囲に対して処理を行います
    Dim myRange As Range
    Dim i As Integer

    For Each myRange In Selection
    
        i = 1
    
        Do While i <= Len(myRange.Value)
            If Mid(myRange.Value, i, 1) Like "[!0-90-9A-Za-zA-Za-zァ-ヶヲ-゚]" Then
                myRange.Value = Application.WorksheetFunction.Replace(myRange.Value, i, 1, _
                StrConv(Mid(myRange.Value, i, 1), vbWide))
            End If
            
            i = i + 1
            
        Loop
    Next myRange
    
End Sub

説明省略。

 

 

以上です。とくに処理が速くなるような工夫はしていないので、膨大なセル数を変換対象にすると時間がかかるかもしれません。(PCのスペックによって差があります)

 

※コードの使用方法

SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら