Going my way

いいなと思ったことをメモしていきます。

SQL作成が面倒な人なための、コピペするだけで使えるUPDATE文作成自動化VBA入門


Advertisements


Excelでデータを編集していて、このセルで編集したデータをそのままSQLにできたらいいのに、と思う人はきっといるはず。

そんな人のために、前回のINSERT文生成自動化マクロに引き続き、UPDATE文を生成するマクロを作ってみた。

コピペするだけで使えるので、そのままコピペするなり,改変するなりして、使ってみてください。

BentoBox(TM) : みんなのアプリを、みんながつくってシェアする

①プロパティを設定する。
f:id:go_my_own_way:20120624202350p:plain

②データはこのように「●」「★」で区切って格納する。何行でも入れることができる。
f:id:go_my_own_way:20120624202507p:plain

VBAのコードはこんな感じ

Const Properties As String = "プロパティ"
Const UPDATE_SHEET As String = "UPDATE"
Option Explicit

Sub UPDATE文生成()
    Dim TABLE_NAME As String
    Dim Column As Long
    Dim Row As Long
    Dim END_Column As Long
    Dim START_WHERE_Column As Long
    Dim END_WHERE_Column As Long
    Dim OutputFolder As String
    Dim OutputTextName As String
    Dim OutputText As String
    Dim reply As Integer

    
    '--------------------
    ' プロパティの設定
    '--------------------
    TABLE_NAME = Worksheets(Properties).Range("B2").Value
    OutputFolder = Worksheets(Properties).Range("B3").Value
    OutputTextName = Worksheets(Properties).Range("B4").Value
    
    
    '---------------------------------
    'フォルダの末尾が[\]でなければ追記
    '---------------------------------
    If Right(OutputFolder, 1) <> "\" Then
        OutputFolder = OutputFolder & "\"
    End If
    
    OutputText = OutputFolder & OutputTextName
    
    reply = MsgBox(OutputFolder & " 以下にUPDATE文を生成します。よろしいですか?", vbYesNo)
    
    If reply = vbNo Then
        Exit Sub
    End If
    
    '--------------------
    ' カラムの末尾の設定
    '--------------------
    Column = 2
    Do While Worksheets(UPDATE_SHEET).Cells(2, Column) <> "●"
        Column = Column + 1
    Loop
    'カラム末尾の列番号
    END_Column = Column - 1
    START_WHERE_Column = Column + 1
    
    '--------------------------------
    ' WHERE条件の末尾の列番号を取得
    '--------------------------------
    Do While Worksheets(UPDATE_SHEET).Cells(2, Column) <> "★"
        Column = Column + 1
    Loop
    
    END_WHERE_Column = Column - 1

    Row = 4
    Open OutputText For Output As #1
    Do While Cells(Row, 1).Value <> "●"
        
        Print #1, "UPDATE " & TABLE_NAME
        Print #1, "SET"

        For Column = 2 To END_Column
            
                '--------------------------------
                ' 最終カラム以外は[,]で区切る
                '--------------------------------
                If Column <> END_Column Then
                    
                    '------------------------------
                    ' 空白の場合はNULL
                    '------------------------------
                    If Cells(Row, Column).Value = "" Then
                        Print #1, Cells(2, Column) & "= NULL,"
                    Else
                        '-----------------------------
                        ' シングルクォテーションの要否
                        '-----------------------------
                        If Cells(3, Column).Value = "○" Then
                            Print #1, Cells(2, Column) & " = '" & Cells(Row, Column).Value & "',"
                        Else
                            Print #1, Cells(2, Column) & " = " & Cells(Row, Column).Value & ","
                        End If
                    End If
                    
                Else
                    
                    '----------------------------
                    ' 空白の場合はNULL
                    '----------------------------
                    If Cells(Row, Column).Value = "" Then
                        Print #1, Cells(2, Column) & "= NULL"
                    Else
                        '-----------------------------
                        ' シングルクォテーションの要否
                        '-----------------------------
                        If Cells(3, Column).Value = "○" Then
                            Print #1, Cells(2, Column) & " = '" & Cells(Row, Column).Value & "'"
                        Else
                            Print #1, Cells(2, Column) & " = " & Cells(Row, Column).Value
                        End If
                    End If
                End If
        
        Next
        
        '--------------------------------
        ' WHERE文以下を記載
        '--------------------------------
        Print #1, "WHERE"
        For Column = START_WHERE_Column To END_WHERE_Column
            
            '-------------------------------------------------
            'WHERE文の最終列かどうか。最終列以外なら[AND]が必要
            '------------------------------------------------
            If Column <> END_WHERE_Column Then
                '----------------------------
                ' 空白の場合はNULL
                '----------------------------
                If Cells(Row, Column).Value = "" Then
                    Print #1, Cells(2, Column) & "= NULL AND"
                Else
                    Print #1, Cells(2, Column) & " = " & Cells(Row, Column) & " AND"
                End If
            
            Else
                '----------------------------
                ' 空白の場合はNULL
                '----------------------------
                If Cells(Row, Column).Value = "" Then
                    Print #1, Cells(2, Column) & "= NULL"
                Else
                    Print #1, Cells(2, Column) & " = " & Cells(Row, Column)
                End If
            
            End If
        Next
        
        
        Print #1, ";"
        Row = Row + 1
    Loop
        
    Close #1

    MsgBox "UPDATE文を生成しました"

End Sub

④上記のマクロを実行すると、設定したフォルダにSQLが出力される。
f:id:go_my_own_way:20120624202810p:plain

⑤テキストの中身はこんな感じ

UPDATE emp_copy
SET
ename = '林',
deptno = 20
WHERE
empno = 1009 AND
deptno = 20
;
UPDATE emp_copy
SET
ename = '小林',
deptno = 30
WHERE
empno = 1010 AND
deptno = 30
;
UPDATE emp_copy
SET
ename = '中林',
deptno = 40
WHERE
empno = 1011 AND
deptno = 20
;
UPDATE emp_copy
SET
ename = '大林',
deptno = 50
WHERE
empno = 1012 AND
deptno = 30
;

SQLを実行した結果
f:id:go_my_own_way:20120624202952p:plain


以下、余談。
このページを見てくれた誰かが、必要なコードを書く時の参考にしてもらえたら嬉しいと思って記事を書いた。
例えば、VBAなんて書いたこともない新人のために。

しかし、自分がプログラムなんてクソも書けなかった新人時代を振り返ると、自分が最も欲しかった情報は

「どうやったらプログラムが書けるようになるの?」

ということだった。

そして、ソースをコピペするだけでは絶対にプログラムを書けるようにはならないのである。

プログラムを書くために必要なことは、第一に

「自分がコンピューターに何をやらせたいのか」

を明確に思い描くことである。

次に、

「やらせたいことを実現するためには、コンピューターにどういう手順を踏ませればよいか」

を組み立てること。

最後に、組み立てた手順をコードにすることである。

そして、手順を考えるために必要な練習は、普段から手を動かして、サンプルを作ったり、ソースを読むことだ。

無から有は生まれないように、まずは実際にサンプルを作って処理を実行してみたり、ソースを読んで処理を追ってみた"経験"があり、
それらを組み合わせることで、手順(いわゆるロジック)を組み立てることができる。

ことVBAに限っては、プログラミングの練習として非常にわかりやすいので、自宅で適当にサンプルを作って動かすといいと思う。
SIerで働く限り、幸か不幸かExcelを使った単純作業を避ける事などできないのだから。