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

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

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

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

Access

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

Q&A

解決済

2回答

518閲覧

access2021 見積書 サブフォームのコピーができない

syuu07

総合スコア15

VBA

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

Access

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

0グッド

0クリップ

投稿2024/05/09 05:01

編集2024/05/09 08:31

実現したいこと

Accessにて見積書を作成しています。
ボタンを押すことで入力した内容をコピーし、新規レコードにて登録するコードを作成しました。
メインフォームの内容はコピーされたのですが、サブフォームの内容がコピーできません。
どのように変更すればサブフォームの内容もコピーできるでしょうか?

発生している問題・分からないこと

下記のコードを実行することでメインフォームの内容はコピーをすることができ新規のフォームにて登録されていました。
しかし、登録されていたのはメインフォームのみでサブフォームに記載されていた内容は登録されていませんでした。

※下記のようにコピーしてもサブフォームに何も表示されない
イメージ説明
イメージ説明

該当のソースコード

・記入したコード・ Dim MaxNumber Dim MaxNumber2 If MsgBox("この見積をコピーしますか?", vbYesNo) = vbNo Then Exit Sub 'セーブ On Error Resume Next DoCmd.RunCommand acCmdSaveRecord On Error GoTo 0 '新規の番号を取得 MaxNumber = Nz(DMax("見積番号", "見積"), 0) + 1 'メインフォームをコピー CurrentDb.Execute _ "INSERT INTO 見積 (見積番号,製品要求事項確認書No,得意先コード,品名ID,作成日,作成者,見積提出日,見積提出者,営業利益率,販売価格,備考)" _ & " SELECT " & MaxNumber & " AS NewID,製品要求事項確認書No,得意先コード,品名ID,作成日,作成者,見積提出日,見積提出者,営業利益率,販売価格,備考" _ & " FROM 見積" _ & " WHERE 見積番号=" & 見積番号 '新規の見積加工IDの番号を取得 MaxNumber2 = Nz(DMax("見積加工ID", "見積加工"), 0) + 1 'サブフォームをコピー CurrentDb.Execute _ "INSERT INTO 見積加工 (見積加工ID,見積番号,工程コード,工数,分類名,順番)" _ & " SELECT " & MaxNumber2 & " AS NewID2," & MaxNumber & " AS NewID,工程コード,工数,分類名,順番" _ & " FROM 見積加工" _ & " WHERE 見積番号=" & 見積番号 'フォームに反映 Me.Requery DoCmd.SearchForRecord , , , "見積番号=" & MaxNumber

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14263689889

コードは上記のサイトを参考に作成しました。
WHEREの部分が怪しいと思いコードを変えてみました。

CurrentDb.Execute _
"INSERT INTO 見積加工 (見積加工ID,見積番号,工程コード,工数,分類名,順番)" _
& " SELECT " & MaxNumber2 & " AS NewID2," & MaxNumber & " AS NewID,工程コード,工数,分類名,順番" _
& " FROM 見積加工" _
& " WHERE 見積加工ID=" & 見積加工ID

この場合、

コンパイルエラー:
変数が定義されていません 

と表示されました。

メインフォームである「見積」の内容はコピーされていたのでサブフォームがコピーされていない。
実行自体はできるのでサブフォームをコピーする機能が動いていないと思うのですがどのように変更すればいいのかがわかりません。

補足

メインフォームの見積書
レコード内容:見積番号(主キー オートナンバー型 見積書作成時に自動作成),製品要求事項確認書No,得意先コード,品名ID,作成日,作成者,見積提出日,見積提出者,営業利益率,販売価格,備考

サブフォームの見積加工
レコード内容:見積加工ID(主キー オートナンバー型 加工作成時に自動作成),見積番号,工程コード,工数,分類名,順番

Microsoft Access 2021(.accdb)
データはSQL Serverにてリンク
SQL Serverで作成したテーブルを使っています。

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

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

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

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

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

sk.exe

2024/05/09 06:53 編集

テーブル[見積加工]の主キーはどのフィールドなのでしょうか。 仮に[見積加工ID]がそうであるとして、そのフィールドのデータ型は何でしょうか。 テーブル[見積]とテーブル[見積加工]が互いの[見積番号]を結合キーとして1対多の関係にあり、テーブル[見積]に1件の新規レコードを追加(既存の1件のレコードを元に複写)すると共に、テーブル[見積加工]に複数件の新規レコードを追加(従属する全てのレコードを元に複写)しようとしているのであれば、少なくとも後者の全てのレコードの[見積加工ID]の値を(複写されるレコードが1件のみでない限りは)同一にしてはならないはずです。
syuu07

2024/05/09 07:04

コメントありがとうございます。 テーブル[見積加工]の主キーはどのフィールドなのでしょうか。 →テーブル[見積加工]の主キーは見積加工IDです。 仮に[見積加工ID]がそうであるとして、そのフィールドのデータ型は何でしょうか。 →オートナンバー型です。 後者については、 CurrentDb.Execute _ "INSERT INTO 見積加工 (見積加工ID,見積番号,工程コード,工数,分類名,順番)" _ & " SELECT " & MaxNumber2 & " AS NewID2," & MaxNumber & " AS NewID,工程コード,工数,分類名,順番" _ & " FROM 見積加工" _ & " WHERE 見積加工ID=" & 見積加工ID 複数件の新規レコードを追加する場合、こちらのコードは根本的に違うという認識で間違いないでしょうか?
guest

回答2

0

ベストアンサー

メインフォームの見積書
レコード内容:見積番号(主キー オートナンバー型 見積書作成時に自動作成)

サブフォームの見積加工
レコード内容:見積加工ID(主キー オートナンバー型 加工作成時に自動作成)

とりあえず、メインフォームのフォームヘッダーセクション上に[複写コマンド]という名前のコマンドボタンが配置されていると仮定した場合。

vba

1Private Sub 複写コマンド_Click() 2On Error GoTo Err_複写コマンド_Click 3 4 Dim strErrTitle As String 5 Dim strErrMsg As String 6 7 If Me.NewRecord = True Then 8 strErrTitle = "レコード参照エラー" 9 If Me.Dirty = True Then 10 strErrMsg = "新規レコードの編集中です。" 11 Else 12 strErrMsg = "まだ編集が開始されていない新規レコードです。" 13 End If 14 MsgBox strErrMsg, _ 15 vbExclamation, _ 16 strErrTitle 17 Exit Sub 18 End If 19 20 If MsgBox("この見積をコピーしますか?", _ 21 vbYesNo + vbQuestion + vbDefaultButton2) = vbNo Then 22 Exit Sub 23 End If 24 25 If Me.Dirty = True Then 26 DoCmd.RunCommand acCmdSaveRecord 27 End If 28 29 Dim ws As DAO.Workspace 30 Dim db As DAO.Database 31 32 Set ws = DBEngine.Workspaces(0) 33 Set db = CurrentDb 34 35 Dim rsSource As DAO.Recordset 36 Dim rsDestination As DAO.Recordset 37 Dim strSQL As String 38 Dim lngSourceEstimateId As Long 39 Dim lngNewEstimateId As Long 40 41 lngSourceEstimateId = Me.見積番号 42 43 '主テーブルのレコードの複写 44 45 strSQL = "SELECT * FROM [見積] WHERE [見積番号] = " & lngSourceEstimateId & ";" 46 Debug.Print strSQL 47 Set rsSource = db.OpenRecordset(strSQL, dbOpenSnapshot) 48 49 strSQL = "SELECT * FROM [見積] WHERE False;" 50 Debug.Print strSQL 51 Set rsDestination = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) 52 53 'トランザクション処理の開始 54 ws.BeginTrans 55 '以降のコードにおいて何らかの実行時エラーが発生した場合はロールバック処理とエラー時処理を実行するようにする 56 On Error GoTo RollBack_複写コマンド_Click 57 58 With rsDestination 59 '新規レコードの挿入 60 .AddNew 61 ![製品要求事項確認書No] = rsSource![製品要求事項確認書No] 62 ![得意先コード] = rsSource![得意先コード] 63 ![品名ID] = rsSource![品名ID] 64 ![作成日] = rsSource![作成日] 65 ![作成者] = rsSource![作成者] 66 ![見積提出日] = rsSource![見積提出日] 67 ![見積提出者] = rsSource![見積提出者] 68 ![営業利益率] = rsSource![営業利益率] 69 ![販売価格] = rsSource![販売価格] 70 ![備考] = rsSource![備考] 71 'レコードの保存 72 .Update 73 .MoveFirst 74 '追加されたレコードのIDを取得 75 lngNewEstimateId = ![見積番号] 76 End With 77 78 '従属テーブルのレコードの複写 79 80 'テーブル[見積加工]にレコードを追加する SQL 文 81 strSQL = "INSERT INTO [見積加工] ([見積番号], [工程コード], [工数], [分類名], [順番])" & _ 82 " SELECT " & lngNewEstimateId & " AS [新規見積番号], [工程コード], [工数], [分類名], [順番]" & _ 83 " FROM [見積加工]" & _ 84 " WHERE [見積番号] = " & lngSourceEstimateId & _ 85 " ORDER BY [見積加工ID];" 86 87 Debug.Print strSQL 88 db.Execute strSQL, dbFailOnError 89 90 'テーブル[見積部材]にレコードを追加する SQL 文 91 strSQL = "INSERT INTO [見積部材] ([見積番号], [品名ID], [品群名], [数量])" & _ 92 " SELECT " & lngNewEstimateId & " AS [新規見積番号], [品名ID], [品群名], [数量]" & _ 93 " FROM [見積部材]" & _ 94 " WHERE [見積番号] = " & lngSourceEstimateId & _ 95 " ORDER BY [見積部材ID];" 96 97 Debug.Print strSQL 98 db.Execute strSQL, dbFailOnError 99 100 'コミット(ws.BeginTrans メソッドの呼び出し後以降に行われた全てのデータの変更を反映させ、トランザクション処理を終了する) 101 ws.CommitTrans 102 '以降のコードにおいて何らかの実行時エラーが発生した場合はエラー時処理を実行するようにする 103 On Error GoTo Err_複写コマンド_Click 104 105 Me.Requery 106 DoCmd.SearchForRecord acDataForm, Me.Name, , "[見積番号]=" & lngNewEstimateId 107 108'終了処理 109Exit_複写コマンド_Click: 110On Error Resume Next 111 112 Set rsSource = Nothing 113 Set rsDestination = Nothing 114 Set db = Nothing 115 Set ws = Nothing 116 117 Exit Sub 118 119RollBack_複写コマンド_Click: 120 'ロールバック(変更された全てのデータを ws.BeginTrans メソッドの呼び出し前の状態に戻し、トランザクション処理を終了する) 121 ws.Rollback 122 123'エラー時処理 124Err_複写コマンド_Click: 125 126 strErrTitle = "実行時エラー (" & Me.Name & ".複写コマンド_Click)" 127 strErrMsg = Err.Number & ": " & Err.Description 128 129 Debug.Print strErrTitle 130 Debug.Print strErrMsg 131 132 MsgBox strErrMsg, vbCritical, strErrTitle 133 134 Resume Exit_複写コマンド_Click 135End Sub

投稿2024/05/09 09:09

編集2024/05/10 01:28
sk.exe

総合スコア1095

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

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

syuu07

2024/05/10 01:03 編集

丁寧なご回答ありがとうございます。 無事にサブフォームのコピーができました。 制作にあたりサブフォームが増えたので下記のコードをもともと記入されていた '従属テーブルのレコードの複写 の下に記入し実行したのですがエラーが発生してしまいました。 また、複写したレコードを行の最後に入れることでエラーなく実行自体はできましたがコピーがされていませんでした。 どのように変更すればコピーできるでしょうか? '従属テーブルのレコードの複写 strSQL = "INSERT INTO [見積部材] ([見積番号], [品名ID], [品群名], [数量])" & _ " SELECT " & lngNewEstimateId & " AS [新規見積番号], [品名ID], [品群名], [数量]" & _ " FROM [見積部材]" & _ " WHERE [見積番号] = " & lngSourceEstimateId & _ " ORDER BY [見積部材ID];" Debug.Print strSQL db.Execute strSQL, dbFailOnError 'コミット ws.CommitTrans On Error GoTo Err_複写コマンド_Click Me.Requery DoCmd.SearchForRecord acDataForm, Me.Name, , "[見積番号]=" & lngNewEstimateId 実行エラー 3034: コミットまたはロールバックを実施するには、 BeginTransメソッドを使用して下さい 新しいサブフォームの見積滅菌 レコード内容:見積部材ID(主キー オートナンバー型 部材作成時に自動作成),見積番号,品名ID,品群名,数量
sk.exe

2024/05/10 01:36

ws.CommitTrans メソッド以降のコードまでコピーする必要はありません。 今回のように複数のテーブルの複数のレコードを編集(追加/更新/削除)し、それらのデータの整合性を保つ必要がある処理においては、適宜トランザクション処理を行なうようにして下さい。
syuu07

2024/05/10 07:21

ご回答ありがとうございます。 丁寧なご説明のおかげで無事複数のサブフォームをコピーすることができました。 教えてくださったことは今後の勉強の参考にさせていただきます。 ここまでご回答ありがとうございました。
guest

0

ひとまず実行したSQL文が意図した通りになっているか
確認するのが良いかと思いました。
Debug.Print を使えばイミディエイトウィンドウ(Ctrl+G)に文字列が出力されます。

vba

1Debug.Print "INSERT INTO 見積加工 (見積加工ID,見積番号,工程コード,工数,分類名,順番)" _ 2& " SELECT " & MaxNumber2 & " AS NewID2," & MaxNumber & " AS NewID,工程コード,工数,分類名,順番" _ 3& " FROM 見積加工" _ 4& " WHERE 見積番号=" & 見積番号

投稿2024/05/09 07:49

odataiki

総合スコア989

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

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

syuu07

2024/05/09 08:20 編集

コメントありがとうございます。 https://tasukete-access.com/2021/12/09/vba_immediate/ Debug.Print とイミディエイトウィンドウ(Ctrl+G)は初めて使いましたので上記のサイトを参考にコードを作成し実行しました。すると、以下のエラーが発生しました。 どのように改善すればよいでしょうか? Private Sub 確認() Debug.Print "INSERT INTO 見積加工 (見積加工ID,見積番号,工程コード,工数,分類名,順番)" _ & " SELECT " & MaxNumber2 & " AS NewID2," & MaxNumber & " AS NewID,工程コード,工数,分類名,順番" _ & " FROM 見積加工" _ & " WHERE 見積番号=" & 見積番号 End Sub イミディエイトウィンドウの実行コード call 確認 実行結果 コンパイルエラー: SubまたはFunctionが定義されていません 
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問