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

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

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

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

Q&A

2回答

3840閲覧

accessのvbaでSQLを実行するがうまく動かない。

kapa

総合スコア6

VBA

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

0グッド

0クリップ

投稿2020/06/01 20:54

前提・実現したいこと`````

accessのクエリーをSQLに変更しているのですが、rs.open mySQL3はうまく動くのですが、
rs2.open mySQL5 がスルーしてしまします。
SQLの書き方に問題があるのでしょうか。

エラーメッセージ 表示なし スルーして終了 ### 該当のソースコード access vba Sub Sample1() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Dim mySQL As String Dim mySQL2 As String Dim mySQL3 As String Dim mySQL4 As String Dim mySQL5 As String Dim mySQL6 As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset Set rs2 = New ADODB.Recordset mySQL = "SELECT T_stock.発注No FROM T_stock GROUP BY T_stock.発注No;" mySQL2 = "SELECT '400000' AS 発注会社コード, '400000' AS 発注担当者コード, [T_stock]!発注No AS 伝票番号, '0' AS 配送区分, [T_stock]!納期日 AS 希望納期, '1' AS 納期区分, '1' AS [AM/PM区分], '' AS 納地コード, [T_stock]!送付先郵便番号 AS 納入先郵便番号, [T_stock]!送付先住所 AS 納地住所1, '' AS 納地住所2, [T_stock]!送付先事業所 AS 納入先名称, [T_stock]!連絡先電話番号 AS 電話番号, '' AS FAX番号, '' AS 携帯電話番号, [T_stock]!工事コード AS 工事番号, [T_stock]!工事名 AS 工事名称, [T_stock]![荷受人名] AS 納入先責任者名, '' AS 協力会社名称1, '' AS 協力会社名称2, '' AS 全体備考, Count([T_stock]!行) AS 明細レコード数 FROM T_stock Group BY '400014', [T_stock]!発注No, '0', [T_stock]!納期日, '1', [T_stock]!送付先郵便番号, [T_stock]!送付先住所, [T_stock]!送付先事業所, [T_stock]!連絡先電話番号, [T_stock]!工事コード, [T_stock]!工事名, [T_stock]![荷受人名], '', '400014', '1', '', '', '', '', '', '' " mySQL3 = mySQL2 & "like (([T_stock]!発注No)='mySQL');" mySQL4 = "SELECT T_stock.発注No FROM T_stock GROUP BY T_stock.発注No;" mySQL5 = "SELECT T_stock.発注No, T_stock.商品コード, '' AS 商品名称, Format([T_stock]!発注数量,'.00') AS 注文数量, '' AS ab長, '' AS 注文単価, '' AS 注文単位, '' AS 注文時明細行, '' AS 備考 FROM T_stock where (([T_stock]!発注No)='mySQL');" rs.Open mySQL3, cn, adOpenKeyset, adLockOptimistic Do Until rs.EOF Debug.Print rs!伝票番号 & "," & rs!納入先名称 rs2.Open mySQL5, cn, adOpenKeyset, adLockOptimistic Do Until rs2.EOF Debug.Print rs2!希望納期 & "," & rs2!納入先郵便番号 rs2.MoveNext Loop rs2.Close rs.MoveNext Loop rs.Close End Sub

試したこと

mySQL5のmySQLを実値にすると動きます。

補足情報(FW/ツールのバージョンなど)

os:win10 Access2013

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

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

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

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

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

guest

回答2

0

mySQL5のmySQLを実値にすると動きます。

下記の部分ですね。

sql

1mySQL5 = "SELECT ・・・ where (([T_stock]!発注No)='mySQL');"

これは、発注No が "mySQL"というテキストのレコードを抽出することになりますが、やりたいことはそういうことではないでよすね。当然、"mySQL"というレコードがなければ何も出力されません。

sql

1mySQL = "SELECT T_stock.発注No FROM T_stock GROUP BY T_stock.発注No;"

このSQLの結果をmySQL5 の抽出条件にしたいということでしょうか。
だとしたら、下記のようなサブクエリにする必要があります。

sql

1mySQL = "SELECT T_stock.発注No FROM T_stock GROUP BY T_stock.発注No" 2 3mySQL5 = "SELECT ・・・ where (([T_stock]!発注No) In (" & mySQL & ");"

しかし、これも無意味な処理ですね。mySQLの処理は T_stock の発注Noをすべて出力するということになります。それを mySQL5 の抽出条件にしたら全レコードを出力するとこになりますので、抽出条件の意味がありません。

ざっとみて、他にも矛盾しているところがあります。
何をしたいのかもう一度整理して、ロジックを組みなおした方がいいと思います。

投稿2020/06/02 00:43

hatena19

総合スコア34075

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

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

0

生成されたSQL文字列をクエリーデザインに張り付けて実行してみてください。

そのクエリーで動作確認されたもののSQLをコードにリバースして下さい。

※SQLの内容は意味不明で理解できません。

追記

多分以下の様な事がしたいのだと思います。

VBA

1Sub Sample1() 2 3Dim cn As New ADODB.Connection 4Dim rs As New ADODB.Recordset 5Dim rs2 As New ADODB.Recordset 6Dim mySQL As String 7Dim mySQL2 As String 8 9Set cn = CurrentProject.Connection 10Set rs = New ADODB.Recordset 11Set rs2 = New ADODB.Recordset 12 13mySQL = "SELECT 発注No, Count(行) AS 明細レコード数 FROM T_stock Group BY 発注No" 14rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic 15Do Until rs.EOF 16 Debug.Print rs!発注No 17 mySQL2 = "SELECT * FROM T_stock where 発注No='" & rs!発注No & "'" 18 rs2.Open mySQL2, cn, adOpenKeyset, adLockOptimistic 19 Do Until rs2.EOF 20 Debug.Print rs2!納期日 & "," & rs2!送付先郵便番号 21 rs2.MoveNext 22 Loop 23 rs2.Close 24 rs.MoveNext 25Loop 26rs.Close 27End Sub

ただ、2重ループだと発注No毎にSQLを発行する事になるので、ループ内で発注Noでキーブレイクするようにすれば、SQLの発行自体は1回で済みます。

VBA

1Sub Sample1() 2 3Dim cn As New ADODB.Connection 4Dim rs As New ADODB.Recordset 5Dim mySQL As String 6Dim myKey As String 7 8Set cn = CurrentProject.Connection 9Set rs = New ADODB.Recordset 10 11mySQL = "SELECT *, (select count(*) from T_stock where 発注No=stk.発注No) as 明細件数 FROM T_stock As stk" 12rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic 13 14myKey = "" 15Do Until rs.EOF 16 17 If myKey! <> rs!発注No Then 18 myKey! = rs!発注No 19 '以下発注No毎の処理 20 Debug.Print rs!発注No & "," & rs!納入先名称 21 End If 22 '以下明細毎の処理 23 Debug.Print rs!納期日 & "," & rs!納入先郵便番号 24 25 rs.MoveNext 26 27Loop 28 29rs.Close 30 31End Sub

ループ内で何をしたいかによっては、ループせずに単にクエリーの実行だけで済む場合もあります。

投稿2020/06/02 01:35

編集2020/06/02 02:21
sazi

総合スコア25327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問