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

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

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

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

Access

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

Q&A

解決済

3回答

13398閲覧

【ACCESS】DoCmd.RunSQLの結果がエラーになる。

tera_taro

総合スコア46

VBA

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

Access

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

0グッド

0クリップ

投稿2018/05/16 06:06

編集2018/05/17 01:16

前提・実現したいこと

テーブルにSQL実行の結果を保存したい。

チェックボックスを追加する前はエラーにはならなかった。
(CHK_ZEI 非課税選択)

発生している問題・エラーメッセージ

イメージ説明

該当のフォーム

frm_derail_trntbl_kobai
イメージ説明
クエリ(サブフォームである明細情報のデータシートのレコードソース)
sub_trntbl_meisai
イメージ説明
a.WORKTBL_KOBAI_MEISAI
b.MSTTBL_KOBAIHIN

該当のテーブル

TRNTBL_KOBAI_MEISAI(登録用)
イメージ説明
WORKTBL_KOBAI_MEISAI(入力用)
イメージ説明
MSTTBL_KOBAIHIN(仕様書番号から品名を取得する為使用)
イメージ説明

該当のソースコード

VBA

1'標準モジュール 2'■購買明細 3Public Type TRNTBL_KOBAI_MEISAI 4 KANRI_NO As String ' 管理番号 5 EDA As Long ' 枝番 6 SHIYO_NO As String ' 仕様書番号 7 HINMEI As String ' 品名 8 TANKA As Long ' 単価 9 SURYO As Long ' 数量 10 TANI As String ' 単位 11 KINGAKU As Long ' 金額 12 NOHIN_DATE As String ' 納品日 13 BIKO As String ' 備考 14 CHK_ZEI As Boolean ' 非課税選択 15End Type 16 17'以下サブフォーム Form_sub_trntbl_meisai内の処理 18 19' フォーム:更新前処理 20Private Sub Form_BeforeUpdate(Cancel As Integer) 21On Error GoTo Err_Proc 22 23 ' 枝番設定 24 If (Me.NewRecord) Then 25 Me.txt_EDA = Me.CurrentRecord 26 End If 27 28Exit_Proc: 29 30 Exit Sub 31 32Err_Proc: 33 MsgBox (Err.Number & ", " & Err.Description) 34 Resume Exit_Proc 35End Sub 36 37' 新規登録処理 38Public Function InsertData_Meisai(ByVal i_kanri_no As String) As Boolean 39On Error GoTo Err_Proc 40 41 Dim type_KOBAI_MEISAI As TRNTBL_KOBAI_MEISAI 42 Dim strSQL As String 43 44 With Me.Recordset 45 46 If Me.Recordset.RecordCount = 0 Then 47 MsgBox "「明細情報」が未入力です。", vbExclamation, "必須項目未入力エラー" 48 InsertData_Meisai = False 49 GoTo Exit_Proc 50 End If 51 52 ' 先頭レコードへ 53 .MoveFirst 54 55 Do Until Me.Form.Recordset.EOF 56 ' 初期化処理 57 strSQL = "" 58 59 type_KOBAI_MEISAI.SHIYO_NO = "" 60 type_KOBAI_MEISAI.HINMEI = "" 61 type_KOBAI_MEISAI.TANKA = 0 62 type_KOBAI_MEISAI.SURYO = 0 63 type_KOBAI_MEISAI.TANI = "" 64 type_KOBAI_MEISAI.KINGAKU = 0 65 type_KOBAI_MEISAI.NOHIN_DATE = "" 66 type_KOBAI_MEISAI.BIKO = "" 67 type_KOBAI_MEISAI.CHK_ZEI = 0 68 69 '=============================================== 70 ' 保存値設定 71 '=============================================== 72 type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, "") 73 type_KOBAI_MEISAI.HINMEI = Nz(!HINMEI, "") 74 type_KOBAI_MEISAI.TANKA = Nz(!TANKA, 0) 75 type_KOBAI_MEISAI.SURYO = Nz(!SURYO, 0) 76 type_KOBAI_MEISAI.TANI = Nz(!TANI, "") 77 type_KOBAI_MEISAI.KINGAKU = Nz(!KINGAKU, 0) 78 type_KOBAI_MEISAI.NOHIN_DATE = Nz(!NOHIN_DATE, "") 79 type_KOBAI_MEISAI.BIKO = Nz(!BIKO, "") 80 type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, 0) 81 82 '=============================================== 83 ' SQL文字列生成 84 '=============================================== 85 strSQL = "INSERT INTO TRNTBL_KOBAI_MEISAI (" 86 strSQL = strSQL & " KANRI_NO," 87 strSQL = strSQL & " EDA," 88 strSQL = strSQL & " SHIYO_NO," 89 strSQL = strSQL & " HINMEI," 90 strSQL = strSQL & " TANKA," 91 strSQL = strSQL & " SURYO," 92 strSQL = strSQL & " TANI," 93 strSQL = strSQL & " KINGAKU," 94 strSQL = strSQL & " NOHIN_DATE," 95 strSQL = strSQL & " BIKO," 96 strSQL = strSQL & " CHK_ZEI" 97 strSQL = strSQL & " )" 98 strSQL = strSQL & " VALUES (" 99 strSQL = strSQL & "'" & i_kanri_no & "'," 100 strSQL = strSQL & Me.CurrentRecord & "," 101 strSQL = strSQL & "'" & type_KOBAI_MEISAI.SHIYO_NO & "'," 102 strSQL = strSQL & "'" & type_KOBAI_MEISAI.HINMEI & "'," 103 strSQL = strSQL & type_KOBAI_MEISAI.TANKA & "," 104 strSQL = strSQL & type_KOBAI_MEISAI.SURYO & "," 105 strSQL = strSQL & "'" & type_KOBAI_MEISAI.TANI & "'," 106 strSQL = strSQL & type_KOBAI_MEISAI.KINGAKU & "," 107 strSQL = strSQL & "'" & type_KOBAI_MEISAI.NOHIN_DATE & "'," 108 strSQL = strSQL & "'" & type_KOBAI_MEISAI.BIKO & "'," 109 strSQL = strSQL & type_KOBAI_MEISAI.CHK_ZEI & "" 110 strSQL = strSQL & ")" 111 112 'SQL実行 113 DoCmd.RunSQL strSQL 114 115 ' 次レコードへ 116 .MoveNext 117 Loop 118 119 End With 120 121 InsertData_Meisai = True 122 123Exit_Proc: 124 Exit Function 125Err_Proc: 126 MsgBox (Err.Number & ", " & Err.Description) 127 Resume Exit_Proc 128End Function 129 130'以下フォーム Form_detail_trntbl_kobai内の処理(上の処理を呼び出す呼び出し元) 131 132'////////////////////////////////////////////////////////// 133' 134' データ追加処理 135' 136'////////////////////////////////////////////////////////// 137Private Function InsertData() As Boolean 138On Error GoTo Err_Proc 139 140 Dim type_KOBAI As TRNTBL_KOBAI 141 Dim strSQL As String 142 143 '=============================================== 144 ' 保存値セット 145 '=============================================== 146 Call SetEntryData(type_KOBAI) 147 148 '=============================================== 149 ' SQL文字列生成 150 '=============================================== 151 strSQL = "INSERT INTO TRNTBL_KOBAI (" 152 strSQL = strSQL & " KANRI_NO," 153 strSQL = strSQL & " BUSHO_CD," 154  '文字制限の為省略 155 strSQL = strSQL & " HATYU_DATE" 156 strSQL = strSQL & " )" 157 strSQL = strSQL & " VALUES (" 158 strSQL = strSQL & "'" & type_KOBAI.KANRI_NO & "'," 159 strSQL = strSQL & "'" & type_KOBAI.BUSHO_CD & "'," 160 '文字制限の為省略 161 strSQL = strSQL & "'" & type_KOBAI.HATYU_DATE & "'" 162 strSQL = strSQL & ")" 163 164 '=============================================== 165 ' 明細登録 166 '=============================================== 167 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 168 ' 1)編集明細登録 169 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 170 If (Me.sub_trntbl_meisai.Form.InsertData_Meisai(type_KOBAI.KANRI_NO) = False) Then 171 InsertData = False 172 GoTo Exit_Proc 173 End If 174 175 '=============================================== 176 ' 更新処理実行 177 '=============================================== 178 'SQL実行 179 DoCmd.RunSQL strSQL 180 181 '戻り値セット 182 InsertData = True 183 184Exit_Proc: 185 Exit Function 186 187Err_Proc: 188 MsgBox (Err.Description & ", " & Err.Number) 189 InsertData = False 190 Resume Exit_Proc 191End Function 192 193'//////////////////////////////////////////////////////////////////////////////// 194' 195' データ更新処理 196' 197'//////////////////////////////////////////////////////////////////////////////// 198Private Function UpdateData(ByVal i_kanri_no As String) As Boolean 199 200On Error GoTo Err_Proc 201 202 Dim type_KANRI As TRNTBL_KOBAI 203 Dim strSQL As String 204 205 '=============================================== 206 ' 保存値セット 207 '=============================================== 208 Call SetEntryData(type_KANRI) 209 210 '================================================ 211 ' 212 ' SQL生成 213 ' 214 '================================================ 215 strSQL = "UPDATE TRNTBL_KOBAI" 216 strSQL = strSQL & " SET BUSHO_CD = '" & type_KANRI.BUSHO_CD & "'," 217 '文字制限の為省略 218 strSQL = strSQL & " HATYU_DATE = '" & type_KANRI.HATYU_DATE & "'" 219 strSQL = strSQL & " WHERE KANRI_NO = '" & i_kanri_no & "'" 220 221 '================================================ 222 ' 223 'SQL実行セクション 224 ' 225 '================================================ 226 'SQL実行 227 DoCmd.RunSQL strSQL 228 229 '=============================================== 230 ' 明細登録 231 '=============================================== 232 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 233 ' 1)既登録明細削除 234 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 235 Dim strWhere As String 236 237 ' 抽出条件設定 238 strWhere = " WHERE KANRI_NO = '" & m_kanri_no & "'" 239 240 ' 削除処理 241 If (DeleteData("TRNTBL_KOBAI_MEISAI", strWhere) = False) Then 242 MsgBox "削除処理(経費仕様計画書の明細)でエラーが発生しました。", vbCritical, "更新処理" 243 UpdateData = False 244 GoTo Exit_Proc 245 End If 246 247 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 248 ' 2)編集明細登録 249 ' ■■■■■■■■■■■■■■■■■■■■■■■■ 250 If (Me.sub_trntbl_meisai.Form.InsertData_Meisai(m_kanri_no) = False) Then 251 UpdateData = False 252 GoTo Exit_Proc 253 End If 254 255 '戻り値セット 256 UpdateData = True 257 258Exit_Proc: 259 Exit Function 260 261Err_Proc: 262 MsgBox (Err.Description & ", " & Err.Number) 263 UpdateData = False 264 Resume Exit_Proc 265 266End Function 267

試したこと

新規登録処理にてSQLの構文に抜かりはないか、
,が正しく使われているか、データ型が正しく使われているか
ブレークポイントを使い試しましたが、どこが間違っているか
分かりませんでした。
イメージ説明

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

Windows10 ACCESS2016

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

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

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

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

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

guest

回答3

0

ベストアンサー

EDAの値が取得できていないのでは?
CurrentRecord はデータの値ではありません。
Form.CurrentRecord プロパティ (Access)

このプロパティの値は、フォームの左下のレコード番号ボックスに表示される値に対応します。

VBA

1 strSQL = strSQL & Me.CurrentRecord & "," 2'↑参照方法が誤ってませんか? ↓こっちでは? 3 strSQL = strSQL & Me.Recordset!EDA & ","

以下のようにしておくと、エラー発生時のSQLの内容がイミディエイトウインドウで確認できます。

VBA

1 Debug.Print strSQL 2 'SQL実行 3 DoCmd.RunSQL strSQL

投稿2018/05/16 08:09

編集2018/05/17 00:59
sazi

総合スコア25173

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

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

tera_taro

2018/05/17 00:30

>EDAの値が取得できていないのでは? 同じエラーが出ます。 >以下のようにしておくと、エラー発生時のSQLの内容がイミディエイトウインドウで確認できます。 参考になりました。ありがとうございます。
sazi

2018/05/17 00:42

>同じエラーが出ます。 InsertData_Meisai()はどのような場合に呼び出されていますか? 既に登録済みの場合は、削除して追加もしくは更新とする必要がありますが、行っていますか?
sazi

2018/05/17 00:52

CurrentRecordの値は、表示されている順番での連番です。 データの値ではありません。 ※試しにEDAの降順で画面が表示されるようにしてみれば分かると思います。
tera_taro

2018/05/17 00:59

InsertData_Meisai()は新規登録、更新登録の時呼び出しています。 既に登録済みの場合はおっしゃる通り、削除して登録しています。 該当のソースコードに追加しておきます。
sazi

2018/05/17 01:02

更新登録時はupdateでなければなりませんから、更新時にinsertすればキー重複になりますけど。
tera_taro

2018/05/17 01:30

一旦バックアップを取り、エラーを無視して「はい」を実行したら 連番も取れていて動くようになりました。
sazi

2018/05/17 02:27

結局修正はしていないってことですか?
tera_taro

2018/05/17 03:13

修正と言っていいか分かりませんが、 strSQL = strSQL & Me.Recordset!EDA & "," と修正してエラーを無視して「はい」以降 新規登録、更新登録を数回試しましたがエラーが出ることなく、 思った結果で登録されているのでこれで大丈夫なのだと思っています。
sazi

2018/05/17 04:39 編集

削除して追加なので、同じループ内でEDAとして同じ値が追加されていたということでしょうから、結果からはループ内でのMe.CurrentRecordでは意図した値が取得できていなかったということになりますね。
guest

0

エラーは、キー違反と出てるので、
SQLの内容を見て、登録用のテーブルに既存の複合キーが無いか
確認するのが先決ですね。

あと、気になった点を少しばかり。

1.下記のように各値をクリアしてる下記の箇所ですが、
type_KOBAI_MEISAI.HINMEI = ""
type_KOBAI_MEISAI.TANKA = 0

↓のようにクリアすることができます。
Dim type_Empty As TRNTBL_KOBAI_MEISAI
type_KOBAI_MEISAI = type_Empty ’type_Emptyは触らない前提

2.Nz の処理で、
type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, "")
としてますが、
type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, type_KOBAI_MEISAI.SHIYO_NO)
とした方が、間違いにくいのでは、と思います。

3.Type では、CHK_ZEI As Boolean ' 非課税選択
と定義されてますが、コード上では、
type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, 0)
等と、Boolean型を、数値として処理されてます。
現時点がテスト段階なのでしょうけども、
処理として不自然さがあります。

以上、ご参考まで。

投稿2018/05/17 01:58

ExcelVBAer

総合スコア1175

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

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

tera_taro

2018/05/17 02:18

1.2.で言われていること勉強になりました。 3.で言われている事なのですが、CHK_ZEIはテーブルではYes/No型で データ型として書くならどう書けばいいのか悩んだ結果Boolean型に なりました。 その際に数値として判定されるのか文字型として判定されるのか 分からず、文字型だと認識されなかったので数値にした結果、動作確認 できたのでそのままにしているのですが何が不自然なのでしょうか? type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, False) のような感じにした方が自然ということなのでしょうか?
ExcelVBAer

2018/05/17 03:49

そうですね。Boolean型の変数には、True/Falseで処置すべきですよね。 ただ、テーブルの値が実際にはどうなっているか知らないので、Variant型の変数に格納してみると、実際に保持されている型が分かるかもしれません。 テーブル内でも、True/Falseで保持されているなら検証不要でしょうし、そうでなくても、Boolean型で処理可能であれば、そう扱う方が可読性があがりますよね。
guest

0

エラーメッセージを調べましたか?
表示されているエラーは構文エラーではありません。データを追加すると
主キー重複やインデックス一意を違反してしまうのできませんという内容です。

投稿2018/05/16 06:15

sousuke

総合スコア3828

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

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

tera_taro

2018/05/16 06:53

エラーメッセージが出ている通りに主キーやデータ型が違反している というエラーメッセージは、主キーでもないチェックボックスを追加してから出始めたエラーなので、その辺りに原因があると考えSQLが 誤っていないか調べていました。 そこで、チェックボックスを追加する前のデータを試した所、そこでも同じエラーが出るようになりなぜこのエラーが出るのかが分からないのです。 張ってあるVBA自体は問題ない感じで良いのでしょうか?
sousuke

2018/05/16 15:45

エラーメッセージが必ず正しいのでとは言いませんが、まずはエラーメッセージの意味を理解するのが先決だと思います。 VBAが間違いないかどうかはわかりません、間違っているからエラーが出ると言えますし間違っていないからインデックスのエラーが出るとも言えます。 そもそもロジック的にEDAをCurrentRecordで取得するというロジックは削除を行うと容易に重複してしまうのでその辺りから大丈夫なのか気になります。 「チェックボックスを追加してから出始めたエラー」に見えても「チェックボックスを追加した」ことと 「その後にエラーが起きた」ことに関連性はあるのでしょうか? 偶然そのタイミングで起きただけという可能性もあるかと思います。 sazi氏のおっしゃる通り、strSQLの中身が思った内容かどうかを確認されては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問