2011年5月21日土曜日

Excel VBA Java用定数クラス作成マクロ UTF-8(BOM無)編

<エクセルのレイアウト>

3行目
B列 区分名
C列 値
D列 名称
E列 型(String等)
F列 配列 ○:配列値行番号使用、◎:配列値直接入力使用 
G列 配列値行番号
H列 配列値直接入力


4行目以降 は値

<マクロの内容>


Option Explicit
Private Const 入力開始行 = 4
Private Const 区分名列 = 2
Private Const 値列 = 3
Private Const 名称列 = 4
Private Const 型列 = 5
Private Const 配列列 = 6
Private Const 配列値行番号列 = 7
Private Const 配列値直接入力列 = 8
Private Const 囲む列 = 9
Private Sub CommandButton1_Click()
    Dim maxRow As Integer           ' 最終行番号
    Dim outRow As Integer           ' 出力行
    Dim tmpFileName As String       ' 一時ファイル名
    Dim fileName As String          ' ファイル名
    Dim i, j, k, cnt As Integer
    Dim tmpFile As ADODB.Stream     ' 一時ファイル出力用ストリーム
    Dim readFile As ADODB.Stream    ' ファイル読込用ストリーム
    Dim writeFile As ADODB.Stream   ' ファイル出力用ストリーム
    Dim wStr As String              ' ワーク文字
    Dim 配列値行番号() As String
    Dim 配列値直接入力() As String
    Dim 行番号, 直接入力 As Variant
   
    '最終行取得
    maxRow = ActiveSheet.Range("B65536").End(xlUp).Row
    '入力開始位置確認
    If maxRow < 入力開始行 Then
        MsgBox "値が入力されていません。"
        Exit Sub
    End If
    '一時ファイル出力処理
    Set tmpFile = CreateObject("ADODB.Stream")
    '文字コード設定
    tmpFile.Charset = "UTF-8"
    'ファイルオープン
    tmpFile.Open
    'バッファに出力
    tmpFile.WriteText "/******************************************************************", adWriteLine
    tmpFile.WriteText " * モジュール名", adWriteLine
    tmpFile.WriteText " * " & Range("B1").Value, adWriteLine
    tmpFile.WriteText " *", adWriteLine
    tmpFile.WriteText " * 変更履歴", adWriteLine
    tmpFile.WriteText " *    変更日        変更者    変更概要", adWriteLine
    tmpFile.WriteText " *    YYYY/MM/DD    氏  名   新規作成", adWriteLine
    tmpFile.WriteText " ******************************************************************", adWriteLine
    tmpFile.WriteText " */", adWriteLine
    tmpFile.WriteText "", adWriteLine
    tmpFile.WriteText "package jp.co.xxx.common.constant;", adWriteLine
    tmpFile.WriteText "", adWriteLine
    tmpFile.WriteText "/**", adWriteLine
    tmpFile.WriteText " * 共通定数", adWriteLine
    tmpFile.WriteText " * <p>", adWriteLine
    tmpFile.WriteText " * 使用する定数を定義する", adWriteLine
    tmpFile.WriteText " * </p>", adWriteLine
    tmpFile.WriteText " */", adWriteLine
    tmpFile.WriteText "public class " & Range("B1").Value & " {", adWriteLine
    ' 開始行を設定
    outRow = 入力開始行
    ' 最終行まで繰り返す
    Do Until outRow > maxRow
        tmpFile.WriteText vbTab & "/**", adWriteLine
        'コメントの出力 開始
        tmpFile.WriteText vbTab & " * " & Cells(outRow, 区分名列).Value & "の定数です。", adWriteLine
        tmpFile.WriteText vbTab & " */", adWriteLine
        'コメントの出力 終了
        If Cells(outRow, 配列列).Value <> "" Then
            wStr = "public static final " & Cells(outRow, 型列).Value _
                    & " C_" & Cells(outRow, 区分名列) & "_" _
                    & Cells(outRow, 名称列).Value & " = {"
            tmpFile.WriteText vbTab & wStr
            cnt = LenB(StrConv(wStr, vbFromUnicode)) / 4
            If (LenB(wStr) Mod 4) > 0 Then
                cnt = cnt + 1
            End If
            wStr = ""
            For k = 1 To cnt
                wStr = wStr & vbTab
            Next k
            If Cells(outRow, 配列列).Value = "○" Then
                配列値行番号 = Split(Cells(outRow, 配列値行番号列).Value, ",", , vbTextCompare)
                i = UBound(配列値行番号)
                j = 0
                For Each 行番号 In 配列値行番号
                    If j > 0 Then
                        tmpFile.WriteText wStr
                    End If
                    tmpFile.WriteText "C_"
                    tmpFile.WriteText Cells(Int(行番号), 区分名列).Value
                    tmpFile.WriteText "_"
                    tmpFile.WriteText Cells(Int(行番号), 名称列).Value
                    If j < i Then
                        tmpFile.WriteText ", ", adWriteLine
                    End If
                    j = j + 1
                Next
            ElseIf Cells(outRow, 配列列).Value = "◎" Then
                配列値直接入力 = Split(Cells(outRow, 配列値直接入力列).Value, ",", , vbTextCompare)
                i = UBound(配列値直接入力)
                j = 0
                For Each 直接入力 In 配列値直接入力
                    If j > 0 Then
                        tmpFile.WriteText wStr
                    End If
                    If Cells(outRow, 囲む列).Value <> "" Then
                        tmpFile.WriteText """"
                    End If
                    tmpFile.WriteText 直接入力
                    If Cells(outRow, 囲む列).Value <> "" Then
                        tmpFile.WriteText """"
                    End If
                    If j < i Then
                        tmpFile.WriteText ", ", adWriteLine
                    End If
                    j = j + 1
                Next
            End If
            tmpFile.WriteText "};", adWriteLine
            tmpFile.WriteText "", adWriteLine
        Else
            tmpFile.WriteText vbTab & "public static final "
            tmpFile.WriteText Cells(outRow, 型列).Value
            tmpFile.WriteText " C_"
            tmpFile.WriteText Cells(outRow, 区分名列)
            tmpFile.WriteText "_"
            tmpFile.WriteText Cells(outRow, 名称列).Value
            tmpFile.WriteText " = "
            If Cells(outRow, 型列).Value = "String" Then
                tmpFile.WriteText """"
            End If
            wStr = Cells(outRow, 値列).Value
            wStr = Replace(wStr, "半角空白", " ", , , vbTextCompare)
            wStr = Replace(wStr, """", "", , , vbTextCompare)
            tmpFile.WriteText wStr
            If Cells(outRow, 型列).Value = "String" Then
                tmpFile.WriteText """"
            End If
            tmpFile.WriteText ";", adWriteLine
            tmpFile.WriteText "", adWriteLine
        End If        ' 行を加算
        outRow = outRow + 1
    Loop
    tmpFile.WriteText "", adWriteLine
    tmpFile.WriteText vbTab & "/**", adWriteLine
    tmpFile.WriteText vbTab & " * コンストラクタ", adWriteLine
    tmpFile.WriteText vbTab & " */", adWriteLine
    tmpFile.WriteText vbTab & "private " & Range("B1").Value & "() {", adWriteLine
    tmpFile.WriteText vbTab, adWriteLine
    tmpFile.WriteText vbTab & "}", adWriteLine
    tmpFile.WriteText "}", adWriteLine
    'ファイル名設定
    tmpFileName = ThisWorkbook.Path & "\tmp" & Range("B1").Value & ".java"
    fileName = ThisWorkbook.Path & "\" & Range("B1").Value & ".java"
    '一時ファイルに書き込み
    tmpFile.SaveToFile tmpFileName, adSaveCreateOverWrite
    '一時ファイルをクローズ
    tmpFile.Close
    Set tmpFile = Nothing
   
    'ここからBOM除去処理
    '一時ファイルの4バイト目から読み込む
    Set readFile = CreateObject("ADODB.Stream")
    readFile.Open
    readFile.Type = adTypeBinary
    readFile.LoadFromFile (tmpFileName)
    readFile.Position = 3
   
    '出力ファイルをオープン
    Set writeFile = CreateObject("ADODB.Stream")
    writeFile.Open
    writeFile.Type = adTypeBinary
    '読み込んだデータをそのままファイルに出力する(4バイト目以降を出力)
    writeFile.Write (readFile.Read(adReadAll))
    writeFile.SaveToFile fileName, adSaveCreateOverWrite
       
    'ファイルをクローズ
    writeFile.Close
    Set writeFile = Nothing
    readFile.Close
    Set readFile = Nothing
   
    '一時ファイル削除
    Kill tmpFileName
   
End Sub

0 件のコメント:

コメントを投稿