目的
OracleのDDL文をExcelマクロで作成したい。
作成手順
1.マクロ有効ブック(*.xlsmファイル)を作成
通常のExcelファイル(*.xlsx)ではマクロを保存できないため、マクロ有効形式で作成します。
2.シートの準備
- 以下の3つのシートを作成します。
- 「実行」シート
⇒ DDL作成ボタンと参照先シートの入力欄配置 - 「DDL作成結果」シート
⇒ DDL作成結果を出力 - 作成したいテーブル情報を記載するシート
⇒ シート名は自由。「実行」シートでシート名を記載する必要あり。
- 「実行」シート
3.「テーブル」シートの構成
セル位置 | 内容 |
---|---|
B1 | スキーマ名を入力 |
B2 | 論理テーブル名を入力 |
B3 | 物理テーブル名を入力 |
A5:E5 | テーブル情報を記載 |
↓こんなイメージ
◆「実行」シート
◆「DDL作成結果」シート
◆作成したいテーブル情報を記載するシート
4.マクロ実行ボタンを作成
Visual Basic for Applications(VBA)を使用して、以下のコードを登録します。
- コード
Sub CreateDDL_FromSheetNameInB1_WithDrop() Dim wsExec As Worksheet Dim wsSrc As Worksheet Dim wsOut As Worksheet Dim srcSheetName As String Dim schemaName As String, logicTableName As String, physTableName As String Dim lastRow As Long, i As Long Dim ddl As String, pkCols As String ' 実行シート Set wsExec = ThisWorkbook.ActiveSheet ' 実行シートB1セルから参照元シート名を取得 srcSheetName = Trim(wsExec.Range("B1").Value) If srcSheetName = "" Then MsgBox "B1セルに参照元シート名が入力されていません", vbExclamation Exit Sub End If ' 参照元シートを取得 On Error Resume Next Set wsSrc = ThisWorkbook.Sheets(srcSheetName) On Error GoTo 0 If wsSrc Is Nothing Then MsgBox "参照元シート '" & srcSheetName & "' が見つかりません", vbCritical Exit Sub End If ' スキーマ名・論理テーブル名・物理テーブル名を取得 schemaName = Trim(wsSrc.Range("B1").Value) logicTableName = Trim(wsSrc.Range("B2").Value) physTableName = Trim(wsSrc.Range("B3").Value) ' カラム定義の最終行を取得(A列の最終行) lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row ' CREATE TABLE文作成 ddl = "DROP TABLE " & schemaName & "." & physTableName & " CASCADE CONSTRAINTS;" & vbCrLf ddl = ddl & "CREATE TABLE " & schemaName & "." & physTableName & " (" & vbCrLf pkCols = "" For i = 5 To lastRow If wsSrc.Range("A" & i).Value <> "" Then ddl = ddl & " " & wsSrc.Range("B" & i).Value & " " & wsSrc.Range("C" & i).Value If LCase(wsSrc.Range("D" & i).Value) = "yes" Then ddl = ddl & " NOT NULL" End If ddl = ddl & "," & vbCrLf If LCase(wsSrc.Range("E" & i).Value) = "pk" Then If pkCols <> "" Then pkCols = pkCols & ", " pkCols = pkCols & wsSrc.Range("B" & i).Value End If End If Next i ' PK制約追加 If pkCols <> "" Then ddl = ddl & " CONSTRAINT PK_" & physTableName & " PRIMARY KEY (" & pkCols & ")" & vbCrLf Else ddl = Left(ddl, Len(ddl) - 3) & vbCrLf ' 最後のカンマ削除 End If ddl = ddl & ");" & vbCrLf ' COMMENT文追加 ddl = ddl & "COMMENT ON TABLE " & schemaName & "." & physTableName & " IS '" & logicTableName & "';" & vbCrLf For i = 5 To lastRow If wsSrc.Range("A" & i).Value <> "" Then ddl = ddl & "COMMENT ON COLUMN " & schemaName & "." & physTableName & "." & wsSrc.Range("B" & i).Value & _ " IS '" & wsSrc.Range("A" & i).Value & "';" & vbCrLf End If Next i ' 出力先シート作成 or 取得 On Error Resume Next Set wsOut = ThisWorkbook.Sheets("DDL作成結果") On Error GoTo 0 If wsOut Is Nothing Then Set wsOut = ThisWorkbook.Sheets.Add wsOut.Name = "DDL作成結果" End If ' 出力 wsOut.Cells.Clear wsOut.Range("A1").Value = ddl MsgBox "DDL作成完了", vbInformation End Sub
5.マクロ実行ボタンの設置
- 開発タブ > 挿入 > ボタンを選択。
- マクロ実行ボタンをシート上に配置。
- ボタンに上記マクロを紐づけます。
6.DDL作成結果
終わり
以上の手順で、簡易的なoracleのDDL文作成可能となります。