仮想通貨ブログに専念するため、たまーに更新します!仮想通貨ブログはこちら!

【VBA】SQL(INSERT文)自動生成ツールを作成!

  • URLをコピーしました!
悩んでいる男の子

VBAでSQLのINSERT文を自動生成するツールを作成したいんだけど、どうすればいいのかな?

こんな悩みを解決します。

  • 本記事の内容
  • VBAでSQLのINSERT文を自動生成するツールの作成方法
  • 本記事の執筆者
いずみん(@izumin_0401)

今回は、VBAでINSERT文を自動生成するツールを作成してみます。

いずみん

すぐ読み終わるので、是非最後まで読んでみてください!

プログラミングを学びたい方必見!

オンライン特化のプログラミングスクールなら「」が超おススメ!

副業としてプログラミングを学びたい方にもおすすめのスクールです!

  • 初心者が9割以上なので挫折せずに学べる!
  • 受講者に副業の仕事を1案件以上斡旋! ※条件あり
  • オンライン完結型なので、在宅でもお仕事可!
  • プロのメンターがサポートしてくれる!

キャリアカウンセリングメンター相談無料でできるのもおすすめポイントです!

目次

フォーマットはこんな感じ

ボタンを押すと、フォーマットに従ってINSERT文を出力します。

4行目は項目の型を選択できるようにしています。

Excelはここに置いてます!

ExcelはGitHub上に置いてあるので参考にしてみてください。

DML自動生成ツールのソースコード

'''''''''''''''''''''''''''''''''''''''''''''''''
' 機能:   メイン処理
'
' 機能説明: 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);

INSERT文が作成されていますね。

まとめ

今回は、VBAでINSERT文を自動生成するツールを作成してみました。

ツールを作るのに時間はかかりましたが、個人的には重宝しています(笑)

ではまた!

  • 関連記事
  • 自由な生き方がしたいなら!

自由な生き方をするためには、稼ぐスキルを身に付けなければなりません。

当サイト「リバトレ」では稼ぐスキルに関する情報を日々発信しているので、興味のあるものから見て頂ければ嬉しいです。

稼ぐスキルを身に付けよう!!
SNSもフォローしてね!

この記事が気に入ったら
いいね または フォローしてね!

シェアするんやで!
  • URLをコピーしました!
  • URLをコピーしました!
目次