こんにちは。
仕事の縛り
只野です。
はい。
テーブル定義作成してそれからER図を作成してくれってよくありますね。
世の中便利なER図作成ツールは沢山あるかと思います。それらを使えばサクッと作成する事ができるでしょう。
だがしかし!
仕事でER図を納品物として納める場合は専用ツールから出力されるファイルは認めてもらえない事が多いです。なぜならば納品後にシステム改修などが入りER図を修正する場合に、使用したツールが必要になるからです。
この理由から納品物として認めてもらえるのは一般で使用されるツールとなるわけです。現在文書系で一般的なツールと言えば「Microsoft Office」ですね。
「Microsoft Office」で扱える形式で設計書やその他もろもろを作成すればツール問題はほぼ発生しないでしょう。
後の手間暇を考えると最初から「Microsoft Office」を使用して全て作成した方が効率的です。
ですがER図ともなるとやっぱり作成しづらいわけですよ。
図ですからね図!
そりゃ作りにくいわ!って話です。グラフィカルな物を文書系ツールで作る事自体が間違っている気がします。
泣く泣くExcelで作成開始するわけですけど、図を作成する時に使用する「オートシェイプ」って結構わがままじゃないですか、その位置じゃねーよ的なやつとかサイズが一定にならないとかグループ化とその他もろもろ……
もうVBAで作っちゃいましょうね!
ER図用のオートシェイプを出力する。
はい。そんなわけでER図作成用のオートシェイプをVBAで出力してやろうって事です。
大体テーブル定義書が存在してそれを元にExcelで図なりセル等を駆使して、各テーブル間の関連を表現するかと思います。
セルで表現しようとすると表示位置などを修正するのが大変なので、私はオートシェイプを使用して図で作成していく事が多いです。
その図をテーブル定義書を読み込んで出力してくれるVBAがあれば作業効率上がりそうじゃないですか
テーブル定義書は大体どこも似たような書き方をするので、一度出力用VBAを作成しておけば今後も使えるだろうという目論見です。
こんな形のテーブル定義多いですよね。

SI業界はExcel大好きです。はい。一度テーブル定義を作成するフォーマットが決まってしまえば各情報のセル位置は決まりますね。
あとはVBAで気合を入れて組めば各テーブル定義にそったオートシェイプが作れるはずだ!
そもそもVBAでオートシェイプどうやって作るんだってところからです。調べました。
VBAでオートシェイプ作成
Dim sheet As Worksheet
Dim ret As Shape
Set sheet= ActiveSheet
'オートシェイプ作成(四角)
With sheet.Range(sheet.Cells(rowindex, colindex), sheet.Cells(rowindex, colindex + SHAPE_SIZE))
Set ret = sheet.Shapes.AddShape(Type:=msoShapeRectangle, _
Left:=.Left, _
Top:=.Top, _
Width:=.Width, _
Height:=.Height)
End With
'オートシェイプ名
ret.Name = sname
'背景色
ret.Fill.ForeColor.RGB = RGB(255, 255, 255)
'表示テキスト
ret.TextFrame.Characters.text = text
'テキストカラー
ret.TextFrame.Characters.Font.Color = RGB(0, 0, 0)
'テキストサイズ
ret.TextFrame.Characters.Font.Size = SHAPE_TEXT_SIZE
'テキスト表示位置(縦)
ret.TextFrame.VerticalAlignment = xlVAlignCenter
'テキスト余白(上)
ret.TextFrame.MarginTop = 0
'テキスト余白(下)
ret.TextFrame.MarginBottom = 0
'テキスト余白(左)
ret.TextFrame.MarginLeft = 5
'テキスト余白(右)
ret.TextFrame.MarginRight = 0
'枠線スタイル
ret.Line.DashStyle = msoLineSolid
'枠線色
ret.Line.ForeColor.RGB = RGB(0, 0, 0)
これでオートシェイプが作れます。
ソースコードの5行目がオートシェイプをシートに追加している箇所となります。
Set ret = sheet.Shapes.AddShape(Type:=msoShapeRectangle, _
Left:=.Left, _
Top:=.Top, _
Width:=.Width, _
Height:=.Height)
VBAで扱えるWorkSheetオブジェクトを利用してshapes.AddShapeメソッドを利用すればアクティブシートの指定した位置にオートシェイプを作成する事ができます。
TypeのVBA定数※1を変更すれば作成する図形を選択できます。
※1 MsoAutoShapeType
表示位置などは上記例ですと指定したセル情報から表示位置、サイズを設定しています。
独自でサイズ指定をするよりはExcelのセルに合わせて表示位置やサイズを設定した方が管理しやすそうだったので、この方法を取っています。
これで準備は整いました。
ER図用オートシェイプ出力ソース
後はそれっぽいロジックを考えて
ダウンロードリンク
完成です。
2018/02/26 修正
・シート存在チェック追加
・グループ化不可対応追加
2018/04/21 修正
・存在チェックがコンパイルエラーとなっているファイルを変更
ブログにソースを張り付けると見にくかったのでリンクからzipをダウンロードして見てください。バグもあると思いますし←
ダウンロードしたzipを解凍後、下記方法でVBAモジュールを取り込めます。

ソースの説明はソースのコメントに記載していますので、そちらをご覧ください。
※ソースを利用して発生した問題については一切責任を取りません。
今回は下記仕様で作成してみました。
まずER図用オートシェイプの出力対象にするシートですが、テーブル定義書には大体下記の様に一覧系の資料があります。

これに記載されているテーブルを出力対象にします。ソース内で手動で設定する方法も作ってあります。
あとはテーブル定義に従いオートシェイプを出力するだけです。
各設定はソース内の定数を修正すれば大丈夫なように作成しました。
出力対象の設定:

テーブル定義の設定:

出力した結果はこうなります。


テーブル単位でグループ化を行い、項目単位で一つの図になっています。キーやNot Null等は表示方法を変えています。後は好きに線を引くだけです(アナログ)

線を引くまでVBAで出力できればかっこよいんですけどね。定義書に記載する内容が複雑になりそうなので、微妙なところではあります。めんどくさい図の作成が省かれただけでも良しとします(妥協)
そもそもExcelでER図を作るというアナログな方法が行けないと思いますが笑
本日はこの辺で