
いつもお世話になっております。
ACCESS初心者です。行き詰ったため質問いたします。
どうか、ご教授お願いします。
アクセスのInsertクエリ実行時に変数を持たせたいです。
VBAコードにて、配列で格納している社員IDを1件ずつループして
SyainCDにいれます。そこでSyainCDに値が入るたび、
SyainCDをWhere条件として、InsertSQLを実行したいです。
■CODE■
SyainCD = SyainId(i)
※コード上ではSyainCDにきちんと値が
入ってきていることは確認済です。
また、SagyoYMD()というユーザ関数を用いて
作業日を取得する関数は正常に取得できます。
関数ではなく、コードの中の変数をSQLに組み込むことは
不可能なのでしょうか??
実行するとエラーではなく、ダイアログでSyainCD を入力要求
が表示されてしまいます。。。。
■実行クエリ
INSERT INTO wrk_マスタテーブル
SELECT *
FROM
[SELECT
qry_ユニオンリンクテーブル.社員CD,
qry_ユニオンリンクテーブル.作業日,
Q_部署テーブル.部署名
FROM
(Q_部署テーブル
INNER JOIN ユニオンリンクテーブル
ON Q_部署テーブル.社員CD = qry_ユニオンリンクテーブル.社員CD)
]. AS マスタテーブル
WHERE
マスタテーブル.社員CD = SyainCD AND
マスタテーブル.作業日 = SagyoYMD();
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>なるほど、変数を取得する関数をつくってしまえばよいのですね。
はい、そういう事ですね。
>というようにして実装しました。
2)の後半部分がよく分かりませんでした。(^^;
しかし、問題が解決したのであれば、それで良いと思います。
答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。
問題を解決するための参考になれば、それで良いのです。
実際の実装は、ご自由に行って頂ければ良いと思います。
>2)の後半部分がよく分かりませんでした。(^^;
すみません・・・見返してみて、
自身でもかなりわかりにくいと感じました・・・
>答えは1つではありませんので、私の回答は単なる1例と捉えて下さい。
>問題を解決するための参考になれば、それで良いのです。
とても参考になりました!
理解しながら先に進めていきます。
またなにかございましたらよろしくお願いします。
No.3
- 回答日時:
[イミディエイト]
? CnnExecute("INSERT INTO tab1 (ID, Fld_1) VALUES (4, 'DDD');")
True
と、CnnExecute 関数は、SQL文を実行する関数です。
Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & CnnErrors.Description & Chr$(13) & _
"・Err.Number=" & CnnErrors.Number & Chr$(13) & _
"・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
"・SQL Text=" & strSQL, _
vbExclamation, " ADO関数エラーメッセージ"
End Sub
Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
Dim isOK As Boolean
Dim cnn As ADODB.Connection
isOK = True
Set cnn = CurrentProject.Connection
With cnn
.Errors.Clear
.BeginTrans
.Execute strSQL
.CommitTrans
End With
Exit_CnnExecute:
On Error Resume Next
cnn.Close
Set cnn = Nothing
CnnExecute = isOK
Exit Function
Err_CnnExecute:
isOK = False
If cnn.Errors.Count > 0 Then
ErrMessage cnn.Errors(0), strSQL
cnn.RollbackTrans
Else
MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
vbExclamation, " 関数エラーメッセージ"
End If
Resume Exit_CnnExecute
End Function
>実際は、INSERTする項目が多い為・・・
GetSQL関数の類を用意すれば、既存のクエリのSQL文を取得できます。
既存のクエリの一部を[%xxxxx%] としておけば簡単に置換して CNNExecute関数で実行できます。
[イミディエイト]
? GetSQL("tab1 クエリ")
SELECT tab1.ID, tab1.fld_1
FROM tab1;
Public Function GetSQL(ByVal QueryName As String) As String
Dim MyQuery As DAO.QueryDef
Set MyQuery = CurrentDb.QueryDefs(QueryName)
GetSQL = MyQuery.SQL
End Function
やり方は、それぞれの好み、趣味の問題で・・・。
ありがとうございます。
今回は、クエリのSQLで実装してみます。
この先また、同様の箇所があると思いますので
その際に様子をみて、CnnExecute 関数を利用してみたいと
思います。
ご親切なご回答ありがとうございました。
No.2
- 回答日時:
>関数ではなく、コードの中の変数をSQLに組み込むことは
>不可能なのでしょうか??
確かに、関数は認識されますが、変数は認識されません。
SyainCDをパブリック変数として宣言し、
SyainCDを返す関数を作れば、解決するのでは?
Public SyainCD As Variant
Public Function getSyainCD() As Variant
getSyainCD = SyainCD
End Function
>マスタテーブル.社員CD = SyainCD AND
マスタテーブル.社員CD = getSyainCD() AND
-----------------------------------------------------------
クエリは使わず、VBA内で、SQL文を作り、実行する方法もあります。
その場合、変数は文字列として、SQL文内に埋め込みます。
Dim strSQL As String
strSQL = "INSERT INTO wrk_マスタテーブル" & _
"SELECT *" & _
中略
"WHERE" & _
"マスタテーブル.社員CD = " & SyainCD & " AND" & _
"マスタテーブル.作業日 = SagyoYMD();"
CurrentDb.Execute strSQL
この回答への補足
上記の方法で解決しました!
以下、もし見解違いでしたらご指摘いただければ幸いです。
なるほど、変数を取得する関数をつくってしまえばよいのですね。
1)パブリック変数宣言、パブリック関数をつくる
2)SyainId(i)の処理()の中で、SyainId(i)をパブリック変数宣言にわたして、Call パブリック関数を行う
3)パブリック関数をSqlへわたす。
というようにして実装しました。
No.1
- 回答日時:
tab1:
ID__fld_1
1___AAA
2___BBB
3___CCC
次は、tab1に上記の3つのレコードをインサートするサンプルコードです。
Private Sub コマンド0_Click()
Dim I As Integer
Dim strFld_1(3) As String
strFld_1(1) = "AAA"
strFld_1(2) = "BBB"
strFld_1(3) = "CCC"
For I = 1 To 3
CnnExecute "INSERT INTO tab1 (ID, Fld_1) VALUES (" & I & ",'" & strFld_1(I) & "');"
Next I
End Sub
一番簡単なのは、CnnExecute関数の類を用いて INSERT文を実行することです。
もちろん、クエリのSQL文の変数部にVBAで値を設定することも可能。
しかし、そうまでしてクエリを用いるのかどうかは疑問。
そこで、後者のやり方は割愛します。
なお、CNNExecute関数方式でOKであれば、関数も紹介します。
この回答への補足
すみません・・・
CnnExecute関数、調べましたがよくわかりませんでした。
教えてください。
上記のようにコードの中に、SQLを組み込むことも考慮したのですが
実際は、INSERTする項目が多い為、
DoCmd.OpenQuery "実行クエリ"という形で取りたいと思っています。
なるべく一番簡単なものを希望しています。
お手数おかけしますが、今一度、ご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データがあれば○○なければのSQL
-
DAOでSQLServerに接続し、LeftJ...
-
SQLServer→Access インポート
-
ACCESSのクエリ、SQLに変数を使...
-
抽出条件でデータ型が一致しま...
-
sql文で削除クエリを書く
-
アクセスで定数を利用したい。
-
ACCESSで購入回数を表示する方...
-
DataGridViewで複数条件の抽出...
-
ACCESS VBAでテーブル内の特定...
-
重複した複数のレコードを1レ...
-
VBでExecuteが通らない
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
UMLでの例外処理
-
VBAでCOPYを繰り返すと、処理が...
-
エクセルVBAで、MsgBox やInput...
-
Excelシート上のマクロを登録し...
-
ボタンクリックイベント 重複...
-
VBAでループ内で使う変数名を可...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS DCOUNTの抽出条件について
-
アクセスで定数を利用したい。
-
データがあれば○○なければのSQL
-
Access vbaで重複レコードの削...
-
【access】複数のフィールドの...
-
sql文で削除クエリを書く
-
VBAでテーブル名とカラム名を動...
-
【PHP/MySQL】コード上で生成...
-
DAOでSQLServerに接続し、LeftJ...
-
Accessリンクするテーブルが見...
-
ACCESSで購入回数を表示する方...
-
ACCESS VBAでテーブル内の特定...
-
CMD.Executeの結果をメッセージ...
-
アクセスのテーブルのフィール...
-
BBSのレスを表示させるためのSQ...
-
SQL EXCEL VBA 接続
-
重複した複数のレコードを1レ...
-
社員名簿から検索する関数
-
Access から Excelのシートをイ...
-
Accessについて
おすすめ情報