ExcelVBAでテンプレートを使う
来源:互联网 发布:做淘宝客需要交钱吗 编辑:程序博客网 时间:2024/06/07 03:40
VBAでもテンプレートエンジンがあるか調べてみた。
あった。MiniTemplator
機能が限定されているので使いやすい。
テンプレートを使ってJavaのVOを生成するVBAサンプルを作ってみた。
ちなみにExcel2003で動作確認し、参照設定でMicrosoft Scripting Runtime、MicrosoftActiveX Data Object 2.8 Libraryを追加した。
- テンプレートファイル(VOTemplate.txt)
package ${Package};<!-- $BeginBlock ForeachImport -->import ${Import};<!-- $EndBlock ForeachImport -->/** * ${ClassName}。 * * @author kgu */public class ${Class} {<!-- $BeginBlock ForeachField -->/** * ${FieldName}。 */private ${Type_} ${Field}${=Default};<!-- $EndBlock ForeachField --><!-- $BeginBlock ForeachGetterSetter -->/** * ${FieldName}を取得する。 * * @return ${FieldName} */public ${Type_} ${Getter}() {return ${Field};}/** * ${FieldName}を設定する。 * * @param ${Field} ${FieldName} */public void ${Setter}(${Type_} ${Field}) {this.${Field} = ${Field};}<!-- $EndBlock ForeachGetterSetter -->}
- VO定義書イメージ
- VBAソースコード(標準モジュール)
Option ExplicitSub CreateVO()'------------------------------------------------------------------------------' 定義シートからJavaのVOを生成するVBA。'------------------------------------------------------------------------------On Error GoTo Err_Lbl Dim Package As String 'パッケージ名 Dim Import As String '型パッケージ Dim ClassName As String 'クラス論理名 Dim Class As String 'クラス物理名 Dim FieldName As String 'メンバ変数論理名 Dim Type_ As String '型 Dim Field As String 'メンバ変数物理名 Dim Default As String 'デフォルト値 Dim Getter As String 'ゲッターメソッド Dim Setter As String 'セッターメソッド Dim Row As Integer '行番号 Dim Templator As New MiniTemplator 'テンプレートエンジン Dim FileObject As New ADODB.Stream 'ファイルオブジェクト Dim ImportMap As New Scripting.Dictionary '型パッケージ重複チェック用連想配列 With ActiveSheet 'アクティブシートが処理対象 'テンプレート埋め込みデータを取得 Package = .Cells(1, 2) Class = .Cells(2, 2) ClassName = .Cells(2, 4) 'テンプレートファイル読み込み Templator.ReadTemplateFromFile ThisWorkbook.Path & "\" & "VOTemplate.txt" 'テンプレートファイルの${変数}にデータをセット Templator.SetVariable "Package", Package Templator.SetVariable "Class", Class Templator.SetVariable "ClassName", ClassName Row = 4 '処理開始行 While .Cells(Row, 1) <> "" 'テンプレート埋め込みデータを取得 Field = .Cells(Row, 1) FieldName = .Cells(Row, 2) Type_ = .Cells(Row, 3) Import = .Cells(Row, 4) Default = .Cells(Row, 5) 'テンプレートファイルの${変数}にデータをセット Templator.SetVariable "Field", Field Templator.SetVariable "FieldName", FieldName Templator.SetVariable "Type_", Type_ Dim ImportAndType_ As String ImportAndType_ = Import & "." & Type_ If Import <> "" And (Not ImportMap.Exists(ImportAndType_)) Then '型パッケージは同じものをインポートしないように重複チェックし、 '<!--BeginBlock ブロック -->に追加 Templator.SetVariable "Import", ImportAndType_ Templator.AddBlock "ForeachImport" ImportMap.Add ImportAndType_, "true" End If If Default <> "" Then Templator.SetVariable "=Default", " = " & Default Else Templator.SetVariable "=Default", "" End If Dim FieldGetterSetter As String If Left(Field, 2) = UCase(Left(Field, 2)) Then 'メンバ変数名は先頭の大文字が2回以上連続する場合そのまま FieldGetterSetter = Field Else 'メンバ変数名は先頭の小文字を大文字に変換 FieldGetterSetter = UCase(Left(Field, 1)) & Right(Field, Len(Field) - 1) End If Templator.SetVariable "Setter", "set" & FieldGetterSetter If UCase(Type_) = "BOOLEAN" And (Import = "" Or Import = "java.lang") Then ' boolean型のとき Templator.SetVariable "Getter", "is" & FieldGetterSetter Else Templator.SetVariable "Getter", "get" & FieldGetterSetter End If ' ブロックを追加 Templator.AddBlock "ForeachField" Templator.AddBlock "ForeachGetterSetter" Row = Row + 1 Wend End With Dim BytData() As Byte Dim JavaFileName As String ' ファイル名を作成 JavaFileName = ThisWorkbook.Path & "\" & Class & ".java" With FileObject .Open .Charset = "UTF-8" ' 文字コード指定 .Type = adTypeText .WriteText Templator.GenerateOutputToString '作成したデータをファイルに出力 ' UTF-8で書き出すとBOM付きになるので解除する処理 .Position = 0 .Type = adTypeBinary .Position = 3 BytData = .Read .Close .Open .Type = adTypeBinary .Write BytData .SaveToFile (JavaFileName), adSaveCreateOverWrite .Close End WithExit_Lbl: Set Templator = Nothing Set FileObject = Nothing Exit SubErr_Lbl: MsgBox Err.Number & ":" & Err.Description Resume Exit_Lbl End Sub
- 作成されるJavaファイル
package root.entity;import java.sql.Timestamp;/** * 社員。 * * @author kgu */public class Emp {/** * ID。 */private Integer id;/** * 社員名。 */private String name;/** * 所属部署ID。 */private Integer deptId;/** * 登録日時。 */private Timestamp rgTime;/** * 更新日時。 */private Timestamp upTime;/** * 削除フラグ。 */private boolean delFlag = false;/** * IDを取得する。 * * @return ID */public Integer getId() {return id;}/** * IDを設定する。 * * @param id ID */public void setId(Integer id) {this.id = id;}/** * 社員名を取得する。 * * @return 社員名 */public String getName() {return name;}/** * 社員名を設定する。 * * @param name 社員名 */public void setName(String name) {this.name = name;}/** * 所属部署IDを取得する。 * * @return 所属部署ID */public Integer getDeptId() {return deptId;}/** * 所属部署IDを設定する。 * * @param deptId 所属部署ID */public void setDeptId(Integer deptId) {this.deptId = deptId;}/** * 登録日時を取得する。 * * @return 登録日時 */public Timestamp getRgTime() {return rgTime;}/** * 登録日時を設定する。 * * @param rgTime 登録日時 */public void setRgTime(Timestamp rgTime) {this.rgTime = rgTime;}/** * 更新日時を取得する。 * * @return 更新日時 */public Timestamp getUpTime() {return upTime;}/** * 更新日時を設定する。 * * @param upTime 更新日時 */public void setUpTime(Timestamp upTime) {this.upTime = upTime;}/** * 削除フラグを取得する。 * * @return 削除フラグ */public boolean isDelFlag() {return delFlag;}/** * 削除フラグを設定する。 * * @param delFlag 削除フラグ */public void setDelFlag(boolean delFlag) {this.delFlag = delFlag;}}
- ExcelVBAでテンプレートを使う
- ExcelVBAでオートシェイプを扱う
- ExcelVBA编程入门范例
- (ExcelVBA编程入门范例)
- excelvba数组入门浅析
- ExcelVBA设置文件属性
- EXCELVBA的学习历程
- ExcelVBA函数生成SQL.xlsm
- ExcelVBA:批量更改文件后缀名
- ExcelVBA编程系列之数据类型(1):常量
- ExcelVBA编程系列之数据类型(1):常量
- ExcelVBA笔记(一):录制宏
- EXCELVBA字符串处理常用函数汇总
- ExcelVBA编程系列之对象模型(3):趣谈ExcelVBA编程中的对象、方法和属性
- 以ExcelVBA的脉络为主线学习VBA编程
- 趣谈ExcelVBA编程中的对象、方法和属性
- 较多详细注释的excelVBA入门语句
- 以ExcelVBA的脉络为主线学习VBA编程
- Erlang中的错误处理
- 浅忆树人
- 调制解调器Modem、交换机、集线器
- Android Bluetooth 总结
- 随
- ExcelVBAでテンプレートを使う
- IUnknown结构初窥
- 集合之线程安全
- IT职场人生系列
- 说点话
- 血性
- 升级bash
- 勇气
- 基于linux平台下domino启动脚本编写