【VBA】PROPER関数を使用してスネークケース→キャメルケースを変換する

よくやりたい処理として、DBの定義書のカラム名(スネークケース)からキャメルケースの作成があります。

例えばJavaのPojoを作成したい場合などです。

パッと検索を行ったところ、qiitaで実際に関数を作成してくれている人がいました。この処理は完璧だと思います。

さすがqiitaだぜ!!

https://qiita.com/khayashi4337/items/c2d51387e44b922d4e46

これで全く問題もないのですが、別解もあるかなあと思ったので記載してみたいと思います。

スネークケースとキャメルケース

正直、スネークケースとキャメルケースについて細かいルールを把握しているわけではないので、ついでに勉強をしてみました。

スネークケースのルール

  • アンダースコア(_)を区切記号として単語をつなげる。
  • アンダースコアは連続させない
  • すべて小文字

(例)very_good

キャメルケース

  • 先頭は小文字(大文字なのはパスカルケース)
  • 大文字が連続した場合は区切り文字ではない

(例)veryGood

大した内容ではないですが、要はキャメル→スネークに変換する場合、大文字が連続していた時は区切り文字として判断させない必要があります。

今回使用するもの

キャメルケースへの変換について1文字ずつ調べていくのが最初に思いつくところです。

しかし、全く別の調べ物をしていた時に、PROPERという関数を見つけました。

UPPER、LOWERは知っていたが、正直コレは知らなかった。

英字文字列の単語の先頭の文字、および記号の次の文字を大文字に変換します。 それ以外の英字はすべて小文字にします。

https://support.office.com/ja-jp/article/proper-%E9%96%A2%E6%95%B0-52a5a283-e8b2-49be-8506-b2887b889f94

スネークケース→キャメルケースの変換

Function SnakeToCamel(ByVal val) As String
    Dim sp As Variant
    Dim i As Integer
    If val = "" Then Exit Function
    sp = Split(val, "_")
    SnakeToCamel = WorksheetFunction.Proper(sp(0))
    For i = 1 To UBound(sp)
      SnakeToCamel = SnakeToCamel & WorksheetFunction.Proper(sp(i))
    Next
    SnakeToCamel = LCase(Left(SnakeToCamel, 1)) & Mid(SnakeToCamel, 2, Len((SnakeToCamel)))
End Function

かなりスマートに書けた気がする。

Evaluateとかの挙動で変になることが多いので、Excel関数系の呼び出しは個人的に抵抗があったが、書きやすいところは関数で書いていくことにしよう。

キャメルケース→スネークケースの変換

こちらはいい案が思いつかなかったので泥臭くやっています。

Function CamelToSnake(ByVal val) As String
    Dim i As Integer
    Dim komoji As String

    komoji = LCase(val)
    
    For i = 1 To Len(komoji)
        If Mid(val, i, 1) = Mid(komoji, i, 1) Then
            CamelToSnake = CamelToSnake & Mid(komoji, i, 1)
        ElseIf Mid(val, i - 1, 1) = Mid(komoji, i - 1, 1) Then
            CamelToSnake = CamelToSnake & "_" & Mid(komoji, i, 1)
        Else
            CamelToSnake = CamelToSnake & Mid(komoji, i, 1)
        End If
    Next
    
End Function

いきなり全部小文字にした後、for文を2文字目から回していき、大文字であったらif文がfalseになるのでハイフンを付与しています。

ただし、1文字前も一致したら大文字の連続なのでハイフンを付けない形にしています。

正規表現でsplit出来ないかなあとか考えていたのですが、そんな事すると余計難しいわってなりそうだったので…。


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)