Documentation Excel VBA

Excelを使用していると、変数名を定数形式(例:“StrThresh” を “STR_THRESH”)に変換する必要が出てくることがあります。特に、コード管理や命名規則の統一のために、このような変換が求められる場合があります。この記事では、VBA(Visual Basic for Applications)を使って選択したセル範囲内の文字列を定数形式に変換するマクロの作成方法を詳しく解説します。

はじめに

Excelで大量のデータを扱う際、変数名や定数名の形式を統一することはコードの可読性やメンテナンス性を向上させるために重要です。特に、キャメルケース(例:“camelCase”)からスネークケース(例:“CAMEL_CASE”)への変換は一般的な要件の一つです。そこで、VBAを使用して、この変換を自動化するマクロを作成します。

命名規則の種類

マクロを作成する前に、プログラミングでよく使われる命名規則について理解しておきましょう。

命名規則形式主な用途
キャメルケース最初小文字、以降の単語の先頭を大文字camelCaseJavaScript変数、メソッド名
パスカルケースすべての単語の先頭を大文字PascalCaseクラス名、VBA関数名
スネークケース単語をアンダースコアで区切り、小文字snake_casePython変数、データベースカラム
定数形式(アッパースネークケース)単語をアンダースコアで区切り、大文字CONSTANT_CASE定数名、環境変数
ケバブケース単語をハイフンで区切り、小文字kebab-caseURL、CSSクラス名

今回のマクロでは、キャメルケースやパスカルケースから定数形式への変換を行います。

変換の要件

今回のマクロでは以下の要件を満たします。

  1. 大文字変換 すべての文字を大文字に変換します。
  2. アンダースコアの挿入 小文字の後に大文字が続く場合、その間にアンダースコア(_)を挿入します。

例えば:

  • “StrThresh” → “STR_THRESH”
  • “camelCase” → “CAMEL_CASE”
  • “XMLHttpRequest” → “XML_HTTP_REQUEST”

VBAマクロのコード

以下が、上記の要件を満たすVBAマクロのコードです。

Sub ConvertStringFormat()
    Dim cell As Range
    Dim text As String
    Dim i As Integer
    Dim result As String

    ' 選択されたセル範囲に対して処理を行う
    For Each cell In Selection
        text = cell.Value
        result = ""

        ' 文字列を1文字ずつ処理
        For i = 1 To Len(text)
            ' 現在の文字が大文字で、前の文字が小文字の場合、アンダースコアを挿入
            If i > 1 Then
                If UCase(Mid(text, i, 1)) = Mid(text, i, 1) And _
                   LCase(Mid(text, i - 1, 1)) = Mid(text, i - 1, 1) Then
                    result = result & "_"
                End If
            End If

            ' 文字を大文字に変換して追加
            result = result & UCase(Mid(text, i, 1))
        Next i

        ' 結果をセルに書き込む
        cell.Value = result
    Next cell
End Sub

コードの説明

  1. 変数の宣言

    • cell: 処理対象のセルを表します。
    • text: セル内の元の文字列。
    • i: ループカウンタ。
    • result: 変換後の文字列を蓄積します。
  2. セル範囲のループ処理

    • For Each cell In Selection で選択されたすべてのセルを順に処理します。
  3. 文字列の1文字ずつの処理

    • For i = 1 To Len(text) で文字列の各文字を順に処理します。
    • 現在の文字が大文字で、前の文字が小文字の場合、resultにアンダースコアを追加します。
    • すべての文字を大文字に変換し、resultに追加します。
  4. 結果の書き戻し

    • 変換後の文字列を元のセルに上書きします。

エラーハンドリング付きの改良版

実務で使用する際は、エラーハンドリングを追加して堅牢なマクロにすることをお勧めします。

Sub ConvertStringFormatSafe()
    On Error GoTo ErrorHandler

    Dim cell As Range
    Dim text As String
    Dim i As Integer
    Dim result As String
    Dim convertedCount As Long

    ' 選択範囲のチェック
    If Selection Is Nothing Then
        MsgBox "セルを選択してください。", vbExclamation, "エラー"
        Exit Sub
    End If

    ' 選択がセル範囲か確認
    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択してください。", vbExclamation, "エラー"
        Exit Sub
    End If

    convertedCount = 0

    ' 画面更新を一時停止(処理高速化)
    Application.ScreenUpdating = False

    ' 選択されたセル範囲に対して処理を行う
    For Each cell In Selection
        ' 空セルはスキップ
        If Len(Trim(cell.Value)) > 0 Then
            text = CStr(cell.Value)
            result = ""

            ' 文字列を1文字ずつ処理
            For i = 1 To Len(text)
                If i > 1 Then
                    If IsUpperCase(Mid(text, i, 1)) And IsLowerCase(Mid(text, i - 1, 1)) Then
                        result = result & "_"
                    End If
                End If
                result = result & UCase(Mid(text, i, 1))
            Next i

            cell.Value = result
            convertedCount = convertedCount + 1
        End If
    Next cell

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox convertedCount & " 件のセルを変換しました。", vbInformation, "完了"
    Exit Sub

ErrorHandler:
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub

' 大文字判定用の関数
Function IsUpperCase(char As String) As Boolean
    If Len(char) <> 1 Then
        IsUpperCase = False
        Exit Function
    End If
    IsUpperCase = (char >= "A" And char <= "Z")
End Function

' 小文字判定用の関数
Function IsLowerCase(char As String) As Boolean
    If Len(char) <> 1 Then
        IsLowerCase = False
        Exit Function
    End If
    IsLowerCase = (char >= "a" And char <= "z")
End Function

改良版の特徴

機能説明
エラーハンドリングOn Error GoTo でエラー時に適切なメッセージを表示
入力チェック選択範囲が有効かどうかを事前に確認
空セルスキップ空のセルを処理せず効率化
処理高速化ScreenUpdating = False で画面更新を一時停止
完了通知処理完了後に変換件数を表示

逆変換:定数形式からキャメルケースへ

定数形式からキャメルケースに戻す逆変換のマクロも用意しておくと便利です。

Sub ConvertToСamelCase()
    Dim cell As Range
    Dim text As String
    Dim words() As String
    Dim result As String
    Dim i As Integer

    For Each cell In Selection
        If Len(Trim(cell.Value)) > 0 Then
            ' 小文字に変換してアンダースコアで分割
            text = LCase(cell.Value)
            words = Split(text, "_")
            result = ""

            For i = LBound(words) To UBound(words)
                If i = 0 Then
                    ' 最初の単語はそのまま小文字
                    result = words(i)
                Else
                    ' 2番目以降は先頭を大文字に
                    If Len(words(i)) > 0 Then
                        result = result & UCase(Left(words(i), 1)) & Mid(words(i), 2)
                    End If
                End If
            Next i

            cell.Value = result
        End If
    Next cell
End Sub

Sub ConvertToPascalCase()
    Dim cell As Range
    Dim text As String
    Dim words() As String
    Dim result As String
    Dim i As Integer

    For Each cell In Selection
        If Len(Trim(cell.Value)) > 0 Then
            ' 小文字に変換してアンダースコアで分割
            text = LCase(cell.Value)
            words = Split(text, "_")
            result = ""

            For i = LBound(words) To UBound(words)
                ' すべての単語の先頭を大文字に
                If Len(words(i)) > 0 Then
                    result = result & UCase(Left(words(i), 1)) & Mid(words(i), 2)
                End If
            Next i

            cell.Value = result
        End If
    Next cell
End Sub

逆変換の動作例

変換前キャメルケースパスカルケース
STR_THRESHstrThreshStrThresh
CAMEL_CASEcamelCaseCamelCase
XML_HTTP_REQUESTxmlHttpRequestXmlHttpRequest

マクロの使い方

以下の手順でマクロをExcelに導入し、実行します。

1. Excel VBAエディタを開く

  • Excelを開き、Alt + F11 を押してVBAエディタを起動します。

2. 新しいモジュールを挿入する

  • VBAエディタ内で、左側のプロジェクトエクスプローラーから対象のブックを選択。
  • メニューから 挿入 > モジュール を選択します。

3. コードを貼り付ける

  • 挿入されたモジュールに、上記のVBAコードをコピー&ペーストします。

4. Excelシートに戻る

  • Alt + Q を押してVBAエディタを閉じ、Excelシートに戻ります。

5. マクロを実行する

  • 変換したい文字列が入力されているセル範囲を選択します。
  • リボンの 開発 タブをクリックし、マクロ を選択します。
  • マクロ一覧から ConvertStringFormat を選び、実行 をクリックします。

注: 開発 タブが表示されていない場合は、ファイル > オプション > リボンのユーザー設定開発 にチェックを入れて表示させてください。

ショートカットキーの設定

頻繁に使用する場合は、ショートカットキーを設定すると便利です。

' Alt + F8 でマクロ一覧を表示
' オプション ボタンをクリック
' ショートカットキー欄に Ctrl + Shift + C などを設定

または、開発 タブ > マクロ > 対象マクロを選択 > オプション でショートカットキーを設定できます。

動作例

以下に、マクロの動作例を示します。

変換前変換後
StrThreshSTR_THRESH
camelCaseCAMEL_CASE
XMLHttpRequestXML_HTTP_REQUEST
getUserNameGET_USER_NAME
isValidIS_VALID

実行手順

  1. 上記の変換前の文字列をExcelのセルに入力します。
  2. 該当するセル範囲を選択します。
  3. ConvertStringFormat マクロを実行します。
  4. セルの値が定数形式に変換されます。

カスタマイズと拡張

必要に応じて、このマクロをさらにカスタマイズすることも可能です。

ハイフンを区切り文字に変更(ケバブケース)

アンダースコアの代わりにハイフンを使用し、小文字で出力する場合:

Sub ConvertToKebabCase()
    Dim cell As Range
    Dim text As String
    Dim i As Integer
    Dim result As String

    For Each cell In Selection
        If Len(Trim(cell.Value)) > 0 Then
            text = cell.Value
            result = ""

            For i = 1 To Len(text)
                If i > 1 Then
                    If IsUpperCase(Mid(text, i, 1)) And IsLowerCase(Mid(text, i - 1, 1)) Then
                        result = result & "-"
                    End If
                End If
                ' 小文字に変換
                result = result & LCase(Mid(text, i, 1))
            Next i

            cell.Value = result
        End If
    Next cell
End Sub

複数の変換形式を選択できるユーザーフォーム

より高度な実装として、ユーザーが変換形式を選択できるダイアログを作成することも可能です。

Sub ConvertWithOptions()
    Dim choice As Integer

    choice = MsgBox("変換形式を選択してください:" & vbCrLf & _
                    "はい = 定数形式 (UPPER_SNAKE_CASE)" & vbCrLf & _
                    "いいえ = ケバブケース (kebab-case)" & vbCrLf & _
                    "キャンセル = 中止", _
                    vbYesNoCancel + vbQuestion, "変換形式の選択")

    Select Case choice
        Case vbYes
            Call ConvertStringFormat
        Case vbNo
            Call ConvertToKebabCase
        Case vbCancel
            Exit Sub
    End Select
End Sub

注意点とトラブルシューティング

よくある問題と解決策

問題原因解決策
マクロが実行できないマクロが無効化されているファイル > オプション > トラストセンター でマクロを有効化
日本語が文字化けする文字エンコーディングの問題日本語文字を含むセルは処理対象から除外する
連続大文字が正しく変換されないXMLやHTTPなどの略語改良版のロジックを使用するか、事前に手動で調整

連続大文字の処理改善

XMLやHTTPなどの連続大文字を含む文字列をより適切に処理するバージョン:

Sub ConvertStringFormatAdvanced()
    Dim cell As Range
    Dim text As String
    Dim i As Integer
    Dim result As String
    Dim currentChar As String
    Dim prevChar As String
    Dim nextChar As String

    For Each cell In Selection
        If Len(Trim(cell.Value)) > 0 Then
            text = cell.Value
            result = ""

            For i = 1 To Len(text)
                currentChar = Mid(text, i, 1)

                If i > 1 Then
                    prevChar = Mid(text, i - 1, 1)

                    ' 前が小文字で現在が大文字の場合
                    If IsLowerCase(prevChar) And IsUpperCase(currentChar) Then
                        result = result & "_"
                    ' 前が大文字で現在が大文字、次が小文字の場合(XMLHttpの H の前)
                    ElseIf i < Len(text) Then
                        nextChar = Mid(text, i + 1, 1)
                        If IsUpperCase(prevChar) And IsUpperCase(currentChar) And IsLowerCase(nextChar) Then
                            result = result & "_"
                        End If
                    End If
                End If

                result = result & UCase(currentChar)
            Next i

            cell.Value = result
        End If
    Next cell
End Sub

この改良版では、XMLHttpRequestXML_HTTP_REQUEST に正しく変換されます。

まとめ

この記事では、Excel VBAを使用してセル内の変数名を定数形式に変換するマクロの作成方法を解説しました。

学んだこと

  • キャメルケース、パスカルケース、スネークケースなどの命名規則
  • 基本的な文字列変換マクロの作成方法
  • エラーハンドリングを含む堅牢なマクロの実装
  • 逆変換マクロの作成方法
  • 連続大文字を適切に処理する改良版の実装

自動化することで、手動での変換にかかる時間を節約し、命名規則の一貫性を保つことができます。ぜひ、業務効率化に役立ててください。

参考文献

円