【エクセル マクロ】スネークケース・キャメルケース変換

スネークケースで書かれたテーブル定義をEntityに書くためにキャメルケースにしたり、その逆に変換したり。けっこう変換する機会は多いですよね。

そこで、Excel VBAを使って簡単に変換する方法をご紹介します。

目次

【エクセル マクロ】スネークケース・キャメルケース変換

こちらのサイトの情報を参考にさせてもらいました。
汎用的なソースコードまではいきませんが、それなりに変換出来ます。

機能

主な機能は以下のようなものです。

  • パスカルケース・キャメルケース→スネークケース(大文字・小文字)
  • スネークケース(大文字・小文字)→パスカルケース・キャメルケース
  • 全角→半角変換
  • スネークケース(大文字・小文字)への変換の場合、前後の”_”を削除
  • 末尾の数値を考慮

ソースコード

ソースコードです。エクセルの「開発タブ」を開いて、Visual Basicから標準モジュールに貼り付けて使ってください。「Excel マクロ有効ブック(*.xlsm)」での保存も忘れないでください。

標準モジュールの使い方が分からない方は、こちらを参考にしてください。

''' パスカルケース・アッパーキャメルケース(PascalCase) 変換
''' </summary>
''' <param name="value">変換する値</param>
''' <param name="isCamel">キャメルケース・ローワーキャメルケース(camelCase)にするか</param>
''' <returns></returns>
Public Function ToPascal(ByVal value As String, Optional ByVal isCamel As Boolean = False) As String

    Dim ret As String: ret = ""

    ' 半角変換
    value = StrConv(value, vbNarrow)

    ' スネークケースであるか
    If IsSnake(value) Then
        ' 変換
        ret = SnakeToPascal(value)
    Else
        ' そのまま
        ret = value
    End If

    ' パスカルケース・キャメルケース変換
    If isCamel Then
        ' 先頭文字を小文字、それ以外はそのまま
        ToPascal = LCase(Mid(ret, 1, 1)) & Mid(ret, 2, Len(ret))
    Else
        ' 先頭文字を大文字、それ以外はそのまま
        ToPascal = UCase(Mid(ret, 1, 1)) & Mid(ret, 2, Len(ret))
    End If

End Function


''' <summary>
''' スネークケース → パスカルケース 変換
''' </summary>
''' <param name="value">変換する値</param>
''' <returns></returns>
Private Function SnakeToPascal(ByVal value As String) As String

    Dim ret As String: ret = ""
    Dim values As Variant
    Dim i As Long

    ' アンスコ区切りの配列を取得
    values = Split(value, "_")

    ' 先頭文字を大文字、それ以外を小文字に変換
    For i = LBound(values) To UBound(values)
        ret = ret & UCase(Mid(values(i), 1, 1)) & LCase(Mid(values(i), 2, Len(values(i))))
    Next i

    SnakeToPascal = ret

End Function


''' <summary>
''' スネークケース(SNAKE_CASE) 変換
''' </summary>
''' <param name="value">変換する値</param>
''' <param name="isUpper">大文字に変換するか</param>
''' <returns></returns>
Public Function ToSnake(ByVal value As String, Optional ByVal isUpper As Boolean = True) As String

    Dim ret As String: ret = ""

    ' 半角変換
    value = StrConv(value, vbNarrow)

    ' スネークケースであるか
    If IsSnake(value) Then
        ' そのまま
        ret = value
    Else
        ' 変換
        ret = PascalToSnake(value)
    End If
     
    ' 前後のアンスコの除去
    ret = TrimUnderscore(ret)

    ' 大文字・小文字変換
    If isUpper Then
        ' 大文字
        ToSnake = UCase(ret)
    Else
        ' 小文字
        ToSnake = LCase(ret)
    End If

End Function


''' <summary>
''' パスカルケース → スネークケース 変換
''' </summary>
''' <param name="value">変換する値</param>
''' <returns></returns>
Private Function PascalToSnake(ByVal value As String) As String

    Dim ret As String: ret = ""
    Dim i As Long
    Dim character As String

    ' 文字を一文字ずつ取り出して繰り返す
    For i = 1 To Len(value)

        ' 対象文字
        character = Mid(value, i, 1)

        ' 先頭文字
        If i = 1 Then
            ret = ret & character
            GoTo CONTINUE
        End If

        ' 数値
        If IsNumeric(character) Then
            ret = ret & character
            GoTo CONTINUE
        End If

        ' 小文字
        If LCase(character) = character Then
            ret = ret & character
            GoTo CONTINUE
        End If

        ' 大文字 かつ 前の文字が小文字
        If UCase(character) = character And LCase(Mid(value, i - 1, 1)) = Mid(value, i - 1, 1) Then
            ' アンダースコアを追加
            ret = ret & "_" & character
            GoTo CONTINUE
        End If

        ret = ret & character
        
CONTINUE:
    Next i

    PascalToSnake = ret

End Function


''' <summary>
''' 前後のアンスコの除去
''' </summary>
''' <param name="value"></param>
''' <returns></returns>
Private Function TrimUnderscore(ByVal value As String) As String

    Dim ret As String: ret = ""
    Dim values As Variant
    Dim i As Long

    ' スネークケースであるか
    If IsSnake(value) Then
        ' アンスコ区切りの配列を取得
        values = Split(value, "_")

        ' 先頭文字を大文字、それ以外を小文字に変換
        For i = LBound(values) To UBound(values)
            ' 空じゃない場合、追加
            If Len(values(i)) > 0 Then
                ' 先頭はアンスコをセットしない
                If Len(ret) = 0 Then
                    ret = ret & values(i)
                Else
                    ret = ret & "_" & values(i)
                End If
            End If
        Next i

        TrimUnderscore = ret
    Else
        TrimUnderscore = value
    End If

End Function


''' <summary>
''' スネークケースであるか
''' </summary>
''' <param name="value">変換する値</param>
''' <returns>true:スネークケース</returns>
Private Function IsSnake(ByVal value As String) As Boolean

    Dim values As Variant

    ' アンスコ区切りの配列を取得
    values = Split(value, "_")

    If UBound(values) > 0 Then
        IsSnake = True
        Exit Function
    End If

    IsSnake = False

End Function

使い方

Excelのセルに以下のように関数を入力すれば使えます。

ToPascal関数

ToPascal関数の使い方です。引数にTrueを追加することでキャメルケースになります。

excel スネークケース キャメルケース 変換 エクセル スネークケース・キャメルケース変換

ToPascal関数の結果です。

excel スネークケース キャメルケース 変換 エクセル スネークケース・キャメルケース変換

ToSnake関数

ToSnake関数の使い方です。引数にFalseを追加することで小文字表示になります。

excel スネークケース キャメルケース 変換 エクセル スネークケース・キャメルケース変換

ToSnake関数の結果です。

excel スネークケース キャメルケース 変換 エクセル スネークケース・キャメルケース変換

編集後記

VBAで使うとソースコードのカラーがおかしいですね。
気になりますけど、我慢していただけると助かります。

こちらの記事も読まれています!


参考サイト

【Excel マクロ】スネークケース・キャメルケース変換 ユーザー定義関数 demicadeのブログ

よかったらシェアしてね!
目次
閉じる