キャメルケース・スネークケース相互変換ツールを作ってみた

今回の内容はタイトルにもあるように、キャメルケースをスネークケースへ、スネークケースをキャメルケースへ変換するツールをExcelVBAにて作成してみました。

#なぜこのツールを作成しようと思ったのか

私は今のプロジェクトが二つ目の開発現場になりますが、前々からDtoクラスを作成するときに
テーブル定義書からカラム名を見て手動でスネークケースからキャメルケースに置き換えるのが不安であったので、
確実に変換できればいいなぁと思っていました。
（もしかしたらサクラエディタなどで正規表現使えば簡単にできるかも？？）
というわけで今回は週末に時間を取ってツールを作ることにしました。

#キャメルケースとスネークケースとは？？
一応軽く説明だけしておきます。

キャメルケースとは・・・
変数名などの二つ目の単語の先頭文字を大文字にして表記したものを指します。
例： syainId, pathRouteStr

スネークケースとは・・・
単語をアンダースコア(_)でつないで表記したものを指します。

例： syain_id, path_route_str

#実際にツールを作成してみました

大体一時間くらいで作成しました。

```
Sub henkan()

    '入力されている行数を取得
    maxRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To maxRow
    
        '対象の文字列
        tgtStr = Cells(i, 1)
    
        'キャメルケースかスネークケースであるか
        'スネークケースの場合
        If InStr(tgtStr, "_") Then
            
            convStr = ""
    
            countStr = Len(tgtStr)
    
            'アンスコチェック
            isUnderscore = False
        
            For j = 1 To countStr
                 
                '一文字ずつ判定する
                pickStr = Mid(tgtStr, j, 1)
         
                'アンスコであるか
                If pickStr = "_" Then
            
                    isUnderscore = True
            
                    '次の文字へ
                    GoTo Continue
        
                'アンスコを含んでいない場合は取り出した文字を変換先文字列へ追加
                Else
                    '直前の文字がアンスコだった場合大文字へ変換
                    If isUnderscore = True Then
                        pickStr = UCase(pickStr)
                    End If
                    '変換先文字列へ格納
                    convStr = convStr & pickStr
        
                    'アンスコチェックを戻す
                    isUnderscore = False
                End If
        
                '対象文字列の最後だった場合隣のセルへ貼り付ける
                If j = countStr Then
                    Cells(i, 2) = convStr
                End If
Continue:
            Next j
    
        'キャメルケースの場合
        Else   
            convStr = ""
            
            '対象の文字列
            tgtStr = Cells(i, 1)
            
            countStr = Len(tgtStr)
            
            For k = 1 To countStr
            
                '一文字ずつ判定する
                pickStr = Mid(tgtStr, k, 1)
                
                '大文字であれば直前にアンスコを付けて小文字へ変換
                If pickStr = UCase(pickStr) Then
                    
                    pickStr = "_" & LCase(pickStr)
                End If
                '変換先文字列に足していく
                convStr = convStr & pickStr
                
                '対象文字列の最後だった場合隣のセルへ貼り付ける
                If k = countStr Then
                    Cells(i, 2) = convStr
                End If
            Next k
        End If
    Next i
End Sub
```

実際に入力するExcelのシートは以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/a4a3ee80-79ef-440d-a06c-134dac64e44e.png)

A列の二行目から変換したい文字を入力するとB列へ変換したものを表示します。


#ポイント

まず、今回のツールのポイントは
①汎用性を高めるために入力された行数分だけ繰り返すようにしている
②キャメル⇒スネーク、スネーク⇒キャメルのいずれへも対応できるように入力されている文字列がどちらのケースになるのかを判定している。
③スネークケースからキャメルケースへ変換する際はアンダースコアを破棄してること
④キャメルケースからスネークケースへ変換する際は二つ目以降の単語の文字列の前にアンダースコアを連結させていること

①については、
前回の記事でも触れた最終行の取得法を用いて入力されている行数分ループするようにしています。

②キャメルケースとスネークケースの最大の違いはアンダースコアを含んでいるかということ。
そのため、入力されている文字列がどちらに該当しているかはアンダースコアがあるかで判定しています。

③スネークケースからキャメルケースへ変換する際は、アンダースコアを破棄して二つ目以降の単語の先頭文字を大文字にする必要があるため、
一文字ずつ取り出し、それがアンダースコアであれば、破棄して「isUnderscore 」をTrueし次の文字列まで処理をスキップするために　Go To Continueを使用しています。
そして次の文字の処理時に「isUnderscore 」がTrueの場合は大文字変換をするようにしています。

④キャメルケースからスネークケースへ変換する際は、取り出した一文字が大文字であるかがキーになります。
大文字であった場合は単語の連結部分に該当します。
スネークケースの特徴であるアンダースコアつなぎにするために、大文字の文字の場合は直前にアンダースコアを付けて小文字へ変換してあげるようにしています。


#まとめ
今回は二回目にして少し実践的な内容になりました。
自分的にはいい勉強になりました。
ロジックを考えるのが時間を取られてしまいました。
いい頭の運動になった（(笑)

少し難しい関数もバシバシ使っているため今後は本記事に内で使用している関数についても投稿していこうと思います。