VBAでオートシェイプを扱ったことがないのでやってみた。
テキストボックスをコネクタでつないで作成した遷移図からstruts-config.xmlを生成するサンプルを紹介する。
サンプルは、Excel2003で動作確認し、参照設定でMicrosoft Scripting Runtime、Microsoft ActiveX Data Object 2.8 Libraryを追加した。
また、ExcelVBAでテンプレートを使うで紹介したMiniTemplatorを使用しテンプレートファイルを作成、struts-config.xmlはStruts1.3向けに作成している。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <!-- ========== Form Bean Definitions ================================== --> <form-beans><!-- $BeginBlock ForeachFormBeanTag --> <form-bean name="${ScreenName}Form" type="${RootPackage}.form.${SubPackage}.${ScreenName}Form" /><!-- $EndBlock ForeachFormBeanTag --> </form-beans> <!-- ========== Action Mapping Definitions ============================= --> <action-mappings><!-- $BeginBlock ForeachActionTag --> <action path="/${SubPackage}/${ScreenName}" type="${RootPackage}.action.${SubPackage}.${ScreenName}Action" name="${ScreenName}Form" input="/WEB-INF/jsp/${SubPackage}/${ScreenName}.jsp" scope="request" validate="false"><!-- $BeginBlock ForeachForwardTag --> <forward name="${ScreenName}" path="${ForwardPath}"/><!-- $EndBlock ForeachForwardTag --> </action><!-- $EndBlock ForeachActionTag --> </action-mappings> </struts-config>
- 画面遷移図イメージ
Option Explicit Sub CreateStrutsConfig() '------------------------------------------------------------------------------ ' 画面遷移図からstruts-config.xmlを生成する。 '------------------------------------------------------------------------------ On Error GoTo Err_Lbl Dim RootPackage As String 'ルートパッケージ Dim Shp As Shape 'シェーブ Dim ActionAndForwardsMap As New Scripting.Dictionary 'ActionとForwardのマップ Dim Forwards As String 'Forward先 Dim FileObject As New ADODB.Stream 'ファイルオブジェクト Dim Templator As New MiniTemplator 'テンプレートエンジン 'テンプレートファイル読み込み Templator.ReadTemplateFromFile ThisWorkbook.Path & "\" & "struts-config.xml.txt" RootPackage = ActiveSheet.Cells(1, 2) 'ルートパッケージのテンプレート埋め込み Templator.SetVariable "RootPackage", RootPackage For Each Shp In ActiveSheet.Shapes 'アクティブシートのシェープを一つずつ処理 If Shp.Connector Then 'シェープがコネクタであるとき With Shp.ConnectorFormat If Shp.Line.BeginArrowheadStyle <> msoArrowheadNone _ Or Shp.Line.EndArrowheadStyle <> msoArrowheadTriangle _ Or Not .BeginConnected _ Or Not .EndConnected Then 'コネクタの開始ヘッドが"―"でない、コネクタの終了ヘッドが"->"でない 'コネクタの開始や終了がシェープに接続されていない 'といった条件に当てはまるときは不正とする MsgBox "コネクタが不正です。", vbExclamation GoTo Exit_Lbl End If Dim BeginText As String '開始シェープのテキスト Dim EndText As String '終了シェープのテキスト BeginText = .BeginConnectedShape.TextFrame.Characters.text EndText = .EndConnectedShape.TextFrame.Characters.text Forwards = ActionAndForwardsMap.Item(BeginText) If Forwards = "" Then Forwards = EndText Else 'Forward先が複数あるときはタブで区切る Forwards = Forwards & vbTab & EndText End If If ActionAndForwardsMap.Exists(BeginText) Then ActionAndForwardsMap.Remove BeginText End If 'ActionとForward先の紐付け ActionAndForwardsMap.Add BeginText, Forwards End With End If Next Dim Action As Variant 'Action Dim ActionSplit() As String 'Action分割 Dim ForwardSplit() As String 'Actionに対応するForward先 Dim SubPackage As String 'サブパッケージ Dim ScreenName As String '画面名 Dim i As Integer 'カウンタ For Each Action In ActionAndForwardsMap.Keys 'Actionタグを一つずつ作成 ActionSplit = Split(Action, ".") If UBound(ActionSplit) <> 1 Then MsgBox "サブパッケージとActionクラスの分割に失敗しました。", vbExclamation GoTo Exit_Lbl End If SubPackage = ActionSplit(0) ScreenName = ActionSplit(1) 'Actionに対応するForward先取得 ForwardSplit = Split(ActionAndForwardsMap.Item(Action), vbTab) For i = 0 To UBound(ForwardSplit) If ForwardSplit(i) <> Action Then ' 画面名のテンプレート埋め込み Templator.SetVariable "ScreenName", ForwardSplit(i) 'Forward先テンプレート埋め込み Templator.SetVariable "ForwardPath", "/" & Replace(ForwardSplit(i), ".", "/") & ".do" 'Forwardブロックに追加 Templator.AddBlock "ForeachForwardTag" End If Next '自画面へのForward先を必ず記述 Templator.SetVariable "ScreenName", "MySelf" Templator.SetVariable "ForwardPath", "/WEB-INF/jsp/" & Replace(Action, ".", "/") & ".jsp" Templator.AddBlock "ForeachForwardTag" 'サブパッケージのテンプレート埋め込み Templator.SetVariable "SubPackage", SubPackage '画面名のテンプレート埋め込み Templator.SetVariable "ScreenName", ScreenName 'Actionタグブロックに追加 Templator.AddBlock "ForeachActionTag" 'Formタブブロックに追加 Templator.AddBlock "ForeachFormBeanTag" Next Dim BytData() As Byte Dim JavaFileName As String ' ファイル名を作成 JavaFileName = ThisWorkbook.Path & "\" & "struts-config.xml" 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 With Exit_Lbl: Set Templator = Nothing Set FileObject = Nothing Exit Sub Err_Lbl: MsgBox Err.Number & ":" & Err.Description, vbExclamation Resume Exit_Lbl End Sub
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <!-- ========== Form Bean Definitions ================================== --> <form-beans> <form-bean name="MenuForm" type="root.form.menu.MenuForm" /> <form-bean name="EmpRegForm" type="root.form.emp.EmpRegForm" /> <form-bean name="EmpDelForm" type="root.form.emp.EmpDelForm" /> <form-bean name="EmpModForm" type="root.form.emp.EmpModForm" /> <form-bean name="EmpListForm" type="root.form.emp.EmpListForm" /> </form-beans> <!-- ========== Action Mapping Definitions ============================= --> <action-mappings> <action path="/menu/Menu" type="root.action.menu.MenuAction" name="MenuForm" input="/WEB-INF/jsp/menu/Menu.jsp" scope="request" validate="false"> <forward name="emp.EmpList" path="/emp/EmpList.do"/> <forward name="MySelf" path="/WEB-INF/jsp/menu/Menu.jsp"/> </action> <action path="/emp/EmpReg" type="root.action.emp.EmpRegAction" name="EmpRegForm" input="/WEB-INF/jsp/emp/EmpReg.jsp" scope="request" validate="false"> <forward name="emp.EmpList" path="/emp/EmpList.do"/> <forward name="MySelf" path="/WEB-INF/jsp/emp/EmpReg.jsp"/> </action> <action path="/emp/EmpDel" type="root.action.emp.EmpDelAction" name="EmpDelForm" input="/WEB-INF/jsp/emp/EmpDel.jsp" scope="request" validate="false"> <forward name="emp.EmpList" path="/emp/EmpList.do"/> <forward name="MySelf" path="/WEB-INF/jsp/emp/EmpDel.jsp"/> </action> <action path="/emp/EmpMod" type="root.action.emp.EmpModAction" name="EmpModForm" input="/WEB-INF/jsp/emp/EmpMod.jsp" scope="request" validate="false"> <forward name="emp.EmpList" path="/emp/EmpList.do"/> <forward name="MySelf" path="/WEB-INF/jsp/emp/EmpMod.jsp"/> </action> <action path="/emp/EmpList" type="root.action.emp.EmpListAction" name="EmpListForm" input="/WEB-INF/jsp/emp/EmpList.jsp" scope="request" validate="false"> <forward name="emp.EmpReg" path="/emp/EmpReg.do"/> <forward name="emp.EmpMod" path="/emp/EmpMod.do"/> <forward name="emp.EmpDel" path="/emp/EmpDel.do"/> <forward name="menu.Menu" path="/menu/Menu.do"/> <forward name="MySelf" path="/WEB-INF/jsp/emp/EmpList.jsp"/> </action> </action-mappings> </struts-config>