'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: メイン処理
'
' 機能説明: SQLをファイルに出力するメイン処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub doMain()
On Error GoTo myError
Call OutputSqlForFile
Call SelectTopSheet
Call ShowMessage
Exit Sub
myError:
Call ShowErrorMessage
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL出力処理
'
' 機能説明: SQLをファイルに出力する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub OutputSqlForFile()
Dim workSheetIndex As Long
Dim row As Long
Dim sql As String
Open GetThisWorkBookPath & "\" & Constant.OUTPUT_FILE_NAME For Output As #1
For workSheetIndex = Constant.WORK_SHEET_INDEX_START To Worksheets.Count
Call ActiveWorkSheet(workSheetIndex)
For row = Constant.DATA_ROW To GetMaxRow
Call CreateSqlForInsertInto(sql)
Call CreateSqlForTableName(sql)
Call CreateSqlForLeftBrackets(sql)
Call CreateSqlForColumnName(sql)
Call CreateSqlForValues(sql)
Call CreateSqlForValue(sql, row)
Call CreateSqlForRightBrackets(sql)
Print #1, sql
Next row
Next workSheetIndex
Close #1
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 本ブックパス取得処理
'
' 機能説明: 本ブックのパスを取得する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function GetThisWorkBookPath() As String
GetThisWorkBookPath = ActiveWorkbook.Path
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: ワークシートアクティブ処理
'
' 機能説明: 現在のワークシートをアクティブにする
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub ActiveWorkSheet(ByVal workSheetIndex As Long)
Worksheets(workSheetIndex).Activate
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: テーブル名取得処理
'
' 機能説明: テーブル名を取得する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function GetTableName() As String
GetTableName = Cells(Constant.TABLE_NAME_ROW, Constant.TABLE_NAME_COL).value
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 最大行取得処理
'
' 機能説明: 最大行を取得する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function GetMaxRow() As Long
GetMaxRow = Cells(Rows.Count, 1).End(xlUp).row
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 最大列取得処理
'
' 機能説明: 最大列を取得する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function GetMaxCol() As Long
GetMaxCol = Cells(Constant.COLUMN_NAME_ROW, Columns.Count).End(xlToLeft).Column
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 最大列かどうか
'
' 機能説明: 最大列かどうかを判定する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function IsMaxCol(ByVal col As Long) As Boolean
IsMaxCol = col = GetMaxCol
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 型が文字かどうか
'
' 機能説明: 型が文字かどうかを判定する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function IsStringType(ByVal col As Long) As Boolean
IsStringType = Cells(Constant.DATA_TYPE_ROW, col).value = Constant.DATA_TYPE_STRING
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: エスケープ処理
'
' 機能説明: エスケープ処理を行う
' ※「'」のみ対応
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Function Escape(ByVal value As String) As String
Escape = Replace(value, "'", "''")
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「INSERT INTO」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForInsertInto(ByRef sql As String)
sql = "INSERT INTO "
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「テーブル名」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForTableName(ByRef sql As String)
sql = sql + GetTableName
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「左括弧」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForLeftBrackets(ByRef sql As String)
sql = sql + " ("
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「カラム名」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForColumnName(ByRef sql As String)
Dim col As Long
For col = 1 To GetMaxCol
sql = sql + Cells(Constant.COLUMN_NAME_ROW, col).value
Call CreateSqlForComma(sql, col)
Next col
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: 最大列ではない場合、カンマを付与する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForComma(ByRef sql As String, ByVal col As Long)
If Not IsMaxCol(col) Then
sql = sql + ","
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「VALUES」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForValues(ByRef sql As String)
sql = sql + ") VALUES ("
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「値」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForValue(ByRef sql As String, ByVal row As Double)
Dim col As Long
Dim value As String
For col = 1 To GetMaxCol
value = Cells(row, col).value
If IsNull(value) Or Trim(value) = "" Then
sql = sql + "null"
Else
If IsStringType(col) Then
sql = sql + "'" + Escape(value) + "'"
Else
sql = sql + value
End If
End If
Call CreateSqlForComma(sql, col)
Next col
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: SQL作成
'
' 機能説明: SQLの「右括弧」部分を作成する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub CreateSqlForRightBrackets(ByRef sql As String)
sql = sql + ");"
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: TOPシート選択
'
' 機能説明: TOPのシートを選択する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub SelectTopSheet()
Worksheets(1).Activate
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 完了メッセージ出力処理
'
' 機能説明: 完了メッセージを出力する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub ShowMessage()
MsgBox "【出力先】" & GetThisWorkBookPath & "\" & Constant.OUTPUT_FILE_NAME & vbCrLf & "出力きゃっほーーーー!!!"
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: エラーメッセージ出力処理
'
' 機能説明: エラーメッセージを出力する
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub ShowErrorMessage()
MsgBox "予期せぬエラーが発生しました。", vbExclamation
End Sub
標準モジュール「Main」に上記ソースコードを記載します。
'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能: 共通定数
'
' 機能説明: 定数定義用モジュール
'
'''''''''''''''''''''''''''''''''''''''''''''''''
Public Const OUTPUT_FILE_NAME As String = "dml.sql"
Public Const WORK_SHEET_INDEX_START As Long = 2
Public Const TABLE_NAME_ROW As Long = 1
Public Const TABLE_NAME_COL As Long = 2
Public Const COLUMN_NAME_ROW As Long = 3
Public Const DATA_TYPE_ROW As Long = 4
Public Const DATA_TYPE_STRING As String = "文字"
Public Const DATA_ROW As Long = 5
標準モジュール「Constant」に上記ソースコードを記載します。
'''''''''''''''''''''''''''''''''''''''
' 機能: メインボタンクリック時
'
' 機能説明: メイン処理を呼び出す
'
'''''''''''''''''''''''''''''''''''''''
Private Sub MainBtn_Click()
Main.doMain
End Sub
ボタンを設置したシートに、上記ソースコードを記載します。
出力されるファイルはこんな感じ
INSERT INTO mst_unko (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','a','2019','unko''s',0);
INSERT INTO mst_unko (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','c','2019','d',0);
INSERT INTO mst_unko (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','e','2019','f',0);
INSERT INTO mst_kuso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','a','2019','b',0);
INSERT INTO mst_kuso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','c','2019','d',0);
INSERT INTO mst_kuso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','e','2019','f',0);
INSERT INTO mst_kusoso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','a',null,null,null);
INSERT INTO mst_kusoso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','c',null,null,null);
INSERT INTO mst_kusoso (create_time,create_user,update_time,update_user,delete_flg) VALUES ('2018','e',null,null,null);
コメント