Excelの表をテキストにコピーするマクロ(ExcelでJavaの変数とgetter/setterを作る)

Excelを使ってコーディング

いまどきは生成AIにおまかせでJavaのメンバー変数とgetter/setterのセットなんてできちゃうんですかね?
それでもコーディング規約通りのJavaDocをつけたり、仕様書に書いた一覧通りに作らなければならなかったりするときはちょっと苦労する?かもしれません。
IDEがあるとはいえ、一つ一つ手でコーディングしていくのは面倒くさいし、ミスが混入する機会を増やしてしまいます。
そこでよくやる小技なのですが、Excelで定型のコードを式で作る、なんてことをもう何十年もやっています。

式を使って文字列を編集したときの悩みごと

member変数として

/**
 * ほげほげ
 */
private String hoge;

を作るような式を作ったとして、セルをコピーすると

"/**
 * ほげほげ
 */
private String hoge;"

改行が入っちゃうとダブルクオーテーションで区切られちゃうんですよね。
他にも手があるのかもしれませんが、選択範囲をきれいにコピーしてテキストに落としてくれるExcelマクロを作って使っています。
VBAは見習いなので、コード汚いところは勘弁してください。

Sub コード出力()

    Dim rootRow As Integer
    Dim rootCol As Integer
    
    Dim myText As String
    Dim DataObj As MSForms.DataObject
    
    rootRow = Selection.Row
    rootCol = Selection.Column
    Dim r, c As Integer
    For r = 0 To Selection.Rows.Count - 1
        For c = 0 To Selection.Columns.Count - 1
            myText = myText + Cells(rootRow, rootCol).Offset(r, c).Value + vbCrLf + vbCrLf
        Next c
    Next r
    ' DataObjectオブジェクトを作成
    Set DataObj = New MSForms.DataObject
    
    ' テキストを設定
    DataObj.SetText myText
    ' クリップボードに送信
    DataObj.PutInClipboard
    
    Set DataObj = Nothing
    MsgBox "テキストをクリップボードにコピーしました。", vbInformation

End Sub

使い方は簡単、セルを範囲選択してマクロを起動させるだけです。

Excelシートの例

こんな感じのExcelシートを作ります。

A列にメンバー変数の論理名、B列にメンバー変数の物理名、C列にデータ型を書きます。
そしてE,F,G列にこんな式を入れておきます。

C列 ① メンバー変数

="/**
 * "&IF($A5="",$B5,$A5)&"
 */
private "&$C5&" "&$B5&";"

JavaDoc、メンバー変数(論理名)が空のときはメンバー変数(物理名)を使用します。
これは以下どの式も共通です。

D列 ② getterメソッド

="/**
 * "&IF($A5="",$B5,$A5)&"の取得
 *
 * @return "&$B5&"
 */
public "&$C5&" "&IF($C5="boolean","is","get")&UPPER(LEFT($B5,1))&MID($B5,2,LEN($B5))&"() {
    return this."&$B5&";
}"

C列がbooleanのときはisXxxx、それ以外のときはgetXxxxのpublicメソッド名になります。

E列 ③ setterメソッド

="/**
 * "&IF($A5="",$B5,$A5)&"の設定
 *
 * @param "&$B5&IF($A5="",""," "&$A5)&"
 */
public void set"&UPPER(LEFT($B5,1))&MID($B5,2,LEN($B5))&"("&$C5&" "&$B5&") {
    this."&$B5&" = "&$B5&";
}"

setterメソッドはそのままsetXxxxのpublicメソッドです。

マクロ実行

シートのC5:G7を選択して、マクロを起動すると、クリップボードに下記のようなコードがコピーされます。

/**
 * ほげほげ
 */
private String hoge;

/**
 * ほげほげの取得
 *
 * @return hoge
 */
public String getHoge() {
    return this.hoge;
}

/**
 * ほげほげの設定
 *
 * @param hoge ほげほげ
 */
public void setHoge(String hoge) {
    this.hoge = hoge;
}

/**
 * ふがふが
 */
private boolean fuga;

/**
 * ふがふがの取得
 *
 * @return fuga
 */
public boolean isFuga() {
    return this.fuga;
}

/**
 * ふがふがの設定
 *
 * @param fuga ふがふが
 */
public void setFuga(boolean fuga) {
    this.fuga = fuga;
}

/**
 * ぶげぶげ
 */
private int buge;

/**
 * ぶげぶげの取得
 *
 * @return buge
 */
public int getBuge() {
    return this.buge;
}

/**
 * ぶげぶげの設定
 *
 * @param buge ぶげぶげ
 */
public void setBuge(int buge) {
    this.buge = buge;
}

あとはこのコードをIDEなりに貼り付けてコードフォーマットして使います。

マクロは「行ごと」にコピーするループになっているので、お好みで「列ごと」にするとか、「メンバー変数だけ先に列で処理して、その後getter→setterを作る」とか、カスタマイズしてみてください。

コメント

タイトルとURLをコピーしました