はじめに
インサートSQL生成用エクセルマクロを作成しました。自分用ですが、皆さんにも使ってもらえたらうれしいです。
出力されたSQLがOracle database環境で動くことは確認しています。
ソース
SqlInsertMacro.txt
Sub SqlInsertMacro()
Dim insert As String: insert = "INSERT INTO " '出力SQLフォーマット
Dim sql As String: sql = "" '出力SQL本体
Dim sqlcount As Long: sqlcount = 0 'SQL数
Dim Column As Long: Column = 0 '列数
'SQL数カウント
Do
'// セル値が未設定の場合
If Cells(sqlcount + 4, 3).Value = "" Then
'// ループを抜ける
Exit Do
End If
'// ループカウンタを加算
sqlcount = sqlcount + 1
Loop
'列数カウント
Do
'// セル値が未設定の場合
If Cells(3, Column + 1).Value = "" Then
'// ループを抜ける
Exit Do
End If
'// ループカウンタを加算
Column = Column + 1
Loop
'VALUESまでのフォーマット作成
insert = insert & Range("A1").Value & " ("
For i = 1 To Column
'最初のカラム以外は前にカンマを付ける
If i <> 1 Then
insert = insert & ","
End If
insert = insert & Cells(2, i).Value
Next i
insert = insert & ") VALUES ("
'最後まで作成し、出力する
For j = 1 To sqlcount
sql = insert
For k = 1 To Column
'最初のカラム以外は前にカンマを付ける
If k <> 1 Then
sql = sql & ","
End If
'型が数字の場合
If Cells(3, k).Value = "NUMBER" Then
sql = sql & Cells(j + 3, k).Value
'型がDATEの場合
ElseIf Cells(3, k).Value = "DATE" Then
sql = sql & "TO_DATE('" & Cells(j + 3, k).Value & "')"
'型がTIMESTAMPの場合
ElseIf Cells(3, k).Value = "TIMESTAMP" Then
sql = sql & "TO_DATE('" & Cells(j + 3, k).Value & "')"
'シングルクォーテーションをつけたい型の場合
Else
sql = sql & "'" & Cells(j + 3, k).Value & "'"
End If
Next k
'SQL作成終了
sql = sql & ");"
'作成されたSQL文を出力
Cells(j + 3, k).Value = sql
Next j
End Sub
使い方
1行目…テーブル名を入力
2行目…項目名を入力
3行目…項目の型を入力
4行目以降…データを入力
マクロを実行すると、最後の列の次の列(この例だとF列)にインサートSQLが生成されます。
おまけ
今回のマクロを作成する際に、テスト用に使用したSQLです。
SQL.txt
DROP TABLE HOGE;
CREATE TABLE HOGE
(
CHA CHAR(10), -- 固定長文字列
VARC VARCHAR(100), -- 文字列
NUM NUMBER, -- 数値
DA DATE, -- 日付
TIST TIMESTAMP -- タイムスタンプ
);
INSERT INTO HOGE (
CHA
,VARC
,NUM
,DA
,TIST
) VALUES (
'0001'
,'田中太郎'
,32
,TO_DATE('2024-03-20', 'YYYY-MM-DD')
,TO_DATE('2024-03-20', 'YYYY-MM-DD')
);
select * from hoge;