【VBA】セルの内容を一括でSQL文に変換するマクロ

Excel/VBA

このデータでINSERT(UPDATE)しといて!とエクセルを渡される事が個人的に多々あります。
そんな時に毎度ちまちま文字列くっ付けてSQL作るのが面倒だったので解消するマクロを作ってみた

スポンサーリンク

やりたい事


例えばこんな社員テーブルがあったとして、

名前状態役職ID
本田在籍チーフ1
茂野在籍正社員2
佐藤退職3
小森在籍正社員4

この内容に更新しといて~とこんなエクセルが飛んでくる↓

こんな時いつもE1に=”UPDATE テーブル SET ” & $A$1 & ” = “・・・ みたいな感じでちまちま作ってオートフィルしてた訳です。

カラムがこの程度なら大した事無いですが、実際のテーブルはもっととんでもなく多い。しかも日付の時にはシリアル値になっちゃうからTEXTで変換しなきゃ~等で超面倒。

なのでこいつをサクッとやっつけようってのが今回のマクロ。ちなみにMySQL用です。

MakeUpdateSQL


コード実態↓コピペでそのまま使えます。

Sub MakeUpdateSQL()
  
    ' Table名を入力させる
    Dim strTableName As String
    strTableName = InputBox("テーブル名を入力してください")
    
    ' 空またはキャンセルの場合
    If strTableName = "" Then
      Exit Sub
    End If
    
    ' 選択範囲値格納
    Dim arr As Variant
    arr = Selection.Value
    
    ' テキスト読み込み(無ければ作成)
    Dim strPath As String
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    strPath = wsh.SpecialFolders("Desktop") & "\UpdateSQL.txt"
    Set wsh = Nothing
    
    ' テキストオープン
    Open strPath For Output As #1
    
    ' カウンタ
    Dim nRowCnt As Long
    Dim nColCnt As Long
    
    ' 1列目はカラム名称なので2列目から始める
    For nRowCnt = 2 To UBound(arr, 1)
       For nColCnt = 1 To UBound(arr, 2)
          Select Case nColCnt
                ' 初回行
                Case 1
                   Print #1, "UPDATE ";
                   Print #1, strTableName;
                   Print #1, " SET ";
                   Print #1, arr(1, nColCnt);
                   Print #1, " = '";
                   Print #1, Trim(arr(nRowCnt, nColCnt));
                   Print #1, "',";
                ' 最終更新値行
                Case UBound(arr, 2) - 1
                   Print #1, arr(1, nColCnt);
                   Print #1, " = '";
                   Print #1, Trim(arr(nRowCnt, nColCnt));
                   Print #1, "' ";
                ' 最終行(WHERE句)
                Case UBound(arr, 2)
                   Print #1, "WHERE ";
                   Print #1, arr(1, nColCnt);
                   Print #1, " = '";
                   Print #1, Trim(arr(nRowCnt, nColCnt));
                   Print #1, "';"
                ' 更新値行
                Case Else
                   Print #1, arr(1, nColCnt);
                   Print #1, " = '";
                   Print #1, Trim(arr(nRowCnt, nColCnt));
                   Print #1, "',";
          End Select
       Next
    Next
    
    ' ファイルクローズ
    Close #1
    ' 作成したテキストを開く
    CreateObject("Shell.Application").ShellExecute strPath
End Sub

単純に文字列を&(アンパサンド)して結合させるとフリーズするのでテキスト作成して直書き方式にしました。毎度値にTrim掛けてるのは数値型だと前後にスペースが出来てしまう為それの削除用。

ルールとして最後の行はWHERE句にしてるのと、日付カラムに対して空白UPDATEするとSQL投げた際にエラーになるので、予め1900/01/01等のそのカラムの初期値で埋めとく事。

実際の動き

以前上記記事で作成した自分用のメニューの中に突っ込んで使って見た

INSERTしたい場合でもループの中身ちょっと変えるだけで応用効くはずなので、是非活用してみて下さい~(ᵔᴥᵔ)

コメント