質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

3198閲覧

[Excelマクロ]SQLテーブルからINSERT・UPDATE・DELETE文を作成したい

syu2048

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2022/02/15 09:17

編集2022/02/15 09:21

ある発注機関の発注機関コードおよび組織名をまとめたExcelファイルをもとに、MySQLにあるテーブル「t_発注機関」の挿入・更新・削除を行うSQL文を生成するマクロを作成しています。

実際に作成する前に、UPDATE文のみですがSQL文を作成するマクロを見つけたのでこれを参考にしようと考えています。
更新するEXCELファイルのテーブルは以下の通りです。
1行目が更新するカラム名、2行目以降が更新するデータです。
カラム名の先頭に「w_」を付けたものが、UPDATE文のWHERE条件になります。

ID発注機関コード取引先w_IDw_発注機関コードw_取引先
111111ALL111111new_ALL
222222RED222222new_RED
333333NON333333new_NON
444444PON444444new_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_IDw_発注機関コードw_取引先チェック
111111ALL111111new_ALL名称変更
222222RED222222new_RED名称変更
333333NON333333new_NON名称変更
444444PON   削除
555555SON   新規設置

この時、上記のマクロで実行すると、「チェック」のカラムも書き込まれて、以下の文になってしまいます。

  • 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の文章を入れる条件分岐の書き方について、良いアイデアがありましたら、ご教示いただきますよう、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

最終行のみ書き込まれる件については別問題と判断し、別で質問させていただきます。
条件分岐については解決した、ということにさせていただきます。
ご回答ありがとうございました。

投稿2022/02/21 01:55

syu2048

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

VBA書きなれてないので間違ってたらすみませんですが、思うに

vba

1If currentColumnIndex = targetRange.Columns.Count Then 2 ' 「チェック」の列に相当する処理 3Else 4 ' それ以外の列の処理 5End If 6

こんな感じで条件分岐させればできそうな気がします。

投稿2022/02/15 12:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syu2048

2022/02/17 06:35

回答ありがとうございます。 16行目~21行目までのコードを以下のように変更しました。 Dim sql As String sql = True Dim first As Boolean first = True Dim first2 As Boolean first2 = True Dim i As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 4) = "名称変更" Then sql = "UPDATE t_発注機関 SET " ElseIf Cells(i, 4) = "新規設置" Then sql = "INSERT INTO t_発注機関 VALUES " Else: Cells(i, 4) = "削除" sql = "DELETE FROM t_発注機関 WHERE " End If Next 上記のコードを追記して実行したところ、全ての行が「INSERT」で始まるSQL文が作成されてしまいます。 原因が何かわかるでしょうか。 追加の質問で申し訳ございませんが、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問