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

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

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

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

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3837閲覧

VBAでDBの更新処理のマクロを実行しようとするとエラーがでる

m_s

総合スコア51

VBA

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

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/08/21 09:34

編集2017/08/21 09:51

エクセルでVBAによってSQLでUPDATEを実行したいのですが
以下のVBAコードでマクロを実行した所「オブジェクトが閉じている間は操作が許可されません」というエラーが出てしまいました。

VBA

1Sub ボタン1_Click() 2Dim adoCon As Object ' ADOコネクション 3 Dim adoRs As Object ' ADOレコードセット 4 Dim SQL As String ' SQL 5 Dim i As Long 6 7 ' ADOコネクションを作成 8 Set adoCon = CreateObject("ADODB.Connection") 9 10 On Error GoTo ErrorTrap 11 12 ' ODBC接続 13 adoCon.Open _ 14 "DRIVER={MySQL ODBC 5.3 Unicode Driver};" & _ 15 " SERVER=localhost;" & _ 16 " DATABASE=abc;" & _ 17 " UID=root;" & _ 18 " PWD=root;" 19 20 MsgBox "DB接続成功" 21 22 ' SQL文 23SQL = "UPDATE `mail_db` SET `mail_level` = '10' WHERE `mail_db`.`mail_id` = 10" 24 25 ' SQLの実行 26 Set adoRs = adoCon.Execute(SQL) 27 28 ' レコードセット内の全ての行の読込が 29 ' 終了するまで処理を繰り返す 30 i = 2 31 Do Until adoRs.EOF 32 Cells(i, 1) = adoRs!mail_id 33 Cells(i, 2) = adoRs!mail_from_name 34 Cells(i, 3) = adoRs!mail_subject 35 'Cells(i, 4) = Format(adoRs!addDate, "yyyy/mm/dd") 36 37 i = i + 1 38 ' 次の行に移動する 39 adoRs.MoveNext 40 Loop 41 42 ' 解放処理 43 adoRs.Close 44 adoCon.Close 45 Set adoRs = Nothing 46 Set adoCon = Nothing 47Exit Sub 48 49ErrorTrap: 50 Set adoRs = Nothing 51 Set adoCon = Nothing 52 MsgBox (Err.Description) 53End Sub

調べてみるとSQLを複数回呼び出していることが原因とか聞いたり、「SET NOCOUNT ON」と記入すれば良いとか聞いたので記述してみたのですが解決できませんでした。

この「SET NOCOUNT ON」を記述することで解決できるのであれば上のコードへの挿入箇所、またはそれ以外のコードの記述方法等があれば教えていただきたいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

MSDNのADO Executeメソッドの説明に

Connection オブジェクトで Execute メソッドを使用すると、指定した接続上で、CommandText 引数に指定したクエリが実行されます。CommandText 引数に、行を返すクエリが指定されている場合、クエリの実行結果はすべて新規 Recordset オブジェクトに保存されます。行を返すクエリ以外のコマンドの場合は、プロバイダは閉じた Recordset オブジェクトを返します。

とあります。

SQLがUPDATE文なので、"閉じたRecordset"が返ってきてるのではないでしょうか。
※mysqlのupdateは変更の件数が返ってくるもので、recordsetは取得できないのかなと想像してます

SQLをSELECT文に変更して、recordsetのupdateと値取得をするように修正するのではダメですか?
または、UPDATE文とSELECT文を、わけて実行してみてはどうでしょう。

投稿2017/08/21 10:28

momon-ga

総合スコア4820

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

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

m_s

2017/08/26 16:37

返答が遅れて申し訳ないですやってみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問