<エクセルのレイアウト>
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 件のコメント:
コメントを投稿