ある発注機関の発注機関コードおよび組織名をまとめたExcelファイルをもとに、MySQLにあるテーブル「t_発注機関」の挿入・更新・削除を行うSQL文を生成するマクロを作成しています。
実際に作成する前に、UPDATE文のみですがSQL文を作成するマクロを見つけたのでこれを参考にしようと考えています。
更新するEXCELファイルのテーブルは以下の通りです。
1行目が更新するカラム名、2行目以降が更新するデータです。
カラム名の先頭に「w_」を付けたものが、UPDATE文のWHERE条件になります。
ID | 発注機関コード | 取引先 | w_ID | w_発注機関コード | w_取引先 |
---|---|---|---|---|---|
1 | 11111 | ALL | 1 | 11111 | new_ALL |
2 | 22222 | RED | 2 | 22222 | new_RED |
3 | 33333 | NON | 3 | 33333 | new_NON |
4 | 44444 | PON | 4 | 44444 | new_PON |
テーブルの構造は以下の通りです。
html
1CREATE TABLE t_発注機関 ( 2ID int not null primary key, 3発注機関コード char(8) not null, 4取引先 varchar(70), 5w_ID char(5), 6w_発注機関コード char(8) , 7w_取引先 varchar(70) 8);
UPDATE文を作成するコードは以下の通りです。
html
1Option Explicit 2 3Sub UPDATE() 4 Dim newbook As Workbook 5 Dim currentCell As Range 6 Dim headCell As Range 7 8 '前処理 9 Dim srcSheet As Worksheet 10 Set srcSheet = ActiveSheet 11 12 Dim targetRange As Range 13 Set targetRange = srcSheet.UsedRange 14 15 '新しいBook作成 16 Set newbook = Workbooks.Add 17 18 'UPDATE文 19 Dim currentRowIndex As Long 20 For currentRowIndex = 2 To targetRange.Rows.Count 21 22 Dim sql As String 23 sql = "UPDATE t_発注機関 SET " 24 Dim first As Boolean 25 first = True 26 Dim first2 As Boolean 27 first2 = True 28 29 Dim currentColumnIndex As Long 30 For currentColumnIndex = 1 To targetRange.Columns.Count 31 Set headCell = srcSheet.Cells(1, currentColumnIndex) 32 Set currentCell = srcSheet.Cells(currentRowIndex, currentColumnIndex) 33 If Left(headCell, 2) <> "w_" Then 34 If (first) Then 35 first = False 36 Else 37 sql = sql & ", " 38 End If 39 If IsNull(currentCell) Or Trim(currentCell.Value) = "" Then 40 sql = sql & headCell & " = 'null'" 41 Else 42 sql = sql & headCell & " = '" & currentCell.Value & "'" 43 End If 44 Else 45 If (first2) Then 46 first2 = False 47 sql = sql & " WHERE " 48 Else 49 sql = sql & " AND " 50 End If 51 If IsNull(currentCell) Or Trim(currentCell.Value) = "" Then 52 sql = sql & Replace(headCell, "w_", "") & " = 'null'" 53 Else 54 sql = sql & Replace(headCell, "w_", "") & " = '" & currentCell.Value & "'" 55 End If 56 End If 57 Next 58 59 sql = sql & ";" 60 61 newbook.ActiveSheet.Cells(currentRowIndex - 1, 1).Value = sql 62 Next 63End Sub 64 65
マクロを実行すると、新しいブックに以下のような、UPDATE文が作成されます。
- UPDATE t_発注機関 SET id = '1', 発注機関コード = '11111', 取引先 = 'ALL' WHERE id = '1' AND 発注機関コード = '11111' AND 取引先 = 'new_ALL';
- UPDATE t_発注機関 SET id = '2', 発注機関コード = '22222', 取引先 = 'RED' WHERE id = '2' AND 発注機関コード = '22222' AND 取引先 = 'new_RED';
- UPDATE t_発注機関 SET id = '3', 発注機関コード = '33333', 取引先 = 'NON' WHERE id = '3' AND 発注機関コード = '33333' AND 取引先 = 'new_NON';
- UPDATE t_発注機関 SET id = '4', 発注機関コード = '44444', 取引先 = 'PON' WHERE id = '4' AND 発注機関コード = '44444' AND 取引先 = 'new_PON';
次にこのテーブルに「チェック」というカラムを追加し、
- 「新規設置」であればINSERT
- 「名称変更」であればUPDATE
- 「削除」であればDELETE
のSQL文を作成し、新しいブックに2行目以降から順次、下方向に書き込んでいくマクロを作りたいと思います。
実際のテーブルは以下の通りです。
ID | 発注機関コード | 取引先 | w_ID | w_発注機関コード | w_取引先 | チェック |
---|---|---|---|---|---|---|
1 | 11111 | ALL | 1 | 11111 | new_ALL | 名称変更 |
2 | 22222 | RED | 2 | 22222 | new_RED | 名称変更 |
3 | 33333 | NON | 3 | 33333 | new_NON | 名称変更 |
4 | 44444 | PON | 削除 | |||
5 | 55555 | SON | 新規設置 |
この時、上記のマクロで実行すると、「チェック」のカラムも書き込まれて、以下の文になってしまいます。
- UPDATE t_発注機関 SET id = '1', 発注機関コード = '11111', 取引先 = 'ALL', id = '1', 発注機関コード = '11111', 取引先 = 'new_ALL', チェック = '名称変更';
- UPDATE t_発注機関 SET id = '2', 発注機関コード = '22222', 取引先 = 'RED', id = '2', 発注機関コード = '22222', 取引先 = 'new_RED', チェック = '名称変更';
- UPDATE t_発注機関 SET id = '3', 発注機関コード = '33333', 取引先 = 'NON', id = '3', 発注機関コード = '33333', 取引先 = 'new_NON', チェック = '名称変更';
- UPDATE t_発注機関 SET id = '4', 発注機関コード = '44444', 取引先 = 'PON', id = 'null', 発注機関コード = 'null', 取引先 = 'null', チェック = '削除';
- UPDATE t_発注機関 SET id = '5', 発注機関コード = '55555', 取引先 = 'LON', id = 'null', 発注機関コード = 'null', 取引先 = 'null', チェック = '新規設置';
理想として、以下のようなSQL文が作成されるようにしたいです。
- UPDATE t_発注機関 SET id = '1', 発注機関コード = '11111', 取引先 = 'ALL', id = '1', 発注機関コード = '11111', 取引先 = 'new_ALL';
- UPDATE t_発注機関 SET id = '2', 発注機関コード = '22222', 取引先 = 'RED', id = '2', 発注機関コード = '22222', 取引先 = 'new_RED';
- UPDATE t_発注機関 SET id = '3', 発注機関コード = '33333', 取引先 = 'NON', id = '3', 発注機関コード = '33333', 取引先 = 'new_NON';
- DELETE FROM t_発注機関 WHERE 発注機関コード = '44444' ;
- INSERT t_発注機関 ( id,発注機関コード,取引先) Values ('5', '55555', 'SON',);
参考にしたマクロについては、コードの意味を全てきちんと理解できていないため、応用するのが難しく困っています。
左の行から順番に読み込むことが原因で全て書き込まれてしまうのだと思いますが、「チェック」の文章を読み込まないようにした上で、INSERTおよびDELETEの文章を入れる条件分岐の書き方について、良いアイデアがありましたら、ご教示いただきますよう、何卒よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。