• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メインフォームとサブフォームのレコードを複製)

メインフォームとサブフォームのレコードを複製する方法

このQ&Aのポイント
  • メインフォームとサブフォームのレコードを簡単に複製する方法について解説します。
  • メインフォームにサブフォームを埋め込み、ボタンをクリックすることでレコードを複製します。
  • 複製する際に発生するエラーメッセージの解決方法と、追加クエリとVBAのコードも紹介します。

質問者が選んだベストアンサー

  • ベストアンサー
  • oka_me
  • ベストアンサー率86% (26/30)
回答No.4

メインフォーム側の方は解決しました様で良かったです。 サブフォーム側のキー違反に関してですが、リンク先のURLの内容によると メインフォーム→見積明細フォーム  見積明細ID→オートナンバー型(主キー)  見積品名→テキスト型  ・・・ サブフォーム→工程明細フォーム  工程明細ID→オートナンバー型(主キー)  見積明細ID→数値型  工程コード→テキスト型  ・・・ とあります。これをそっくりそのまま質問者様の仕様に置き換えると メインフォーム→MAIN  事件ID→オートナンバー型(主キー)  ・・・ サブフォーム→REN  連絡先ID→オートナンバー型(主キー)  事件ID→数値型  ・・・ となるかと思います(一つ前の回答にも同じような事を書きましたが) 考えられるキー違反の原因としては、サブフォーム側で「事件ID」が主キー設定されていませんか? リンク先のURLのイメージですと、例えば 【メインフォーム】 1 A みかん 2 C りんご 3 D ぶどう 項目名は左からID1(オートナンバー)、コード、品名とします。主キーは「ID1」 【サブフォーム】 1 1 A みかん 愛媛 2 2 C りんご 青森 3 3 D ぶどう 山梨 項目名は左からID2(オートナンバー)、ID1(数値)、コード、品名、産地とします。主キーは「ID2」 というレコードが各フォームにあるとして、メインフォームで2のりんごの項目を表示させてボタンを押すと 【メインフォーム】 1 A みかん 2 C りんご 3 D ぶどう 4 C りんご 【サブフォーム】 1 1 A みかん 愛媛 2 2 C りんご 青森 3 3 D ぶどう 山梨 4 2 C りんご 青森 という感じの動作になるかと思うのですが(間違っていたらお恥ずかしい限りですが。。。^^;) この時サブフォームの「ID1」(=事件ID)は同じ値が複製されるので、主キーが設定されているとキー違反になってしまうかと思われます。 もしサブフォーム側の「事件ID」に主キーが設定されていたら、そちらは主キーを外して「連絡先ID」の方に主キー設定して下さい。 (勿論、メインフォーム側の「事件ID」は主キーでOKです) 他の原因だったらすみませんm(_ _)m

masunona
質問者

お礼

またまたありがとうございます! サブフォームの主キーは連絡先IDです。 主キーに関するお話を色々いただいたので、ふと気づいて確認したところ サブフォームに連絡先IDフィールドを表示させていなかったことに気付き 追加してしばらく色々触っていたら (クエリを加工してみたり元に戻してみたり・・・) なぜか正常に動きました! 何週間も悩んでやっと出来上がって、本当にうれしいです! 主キーに注目する点を教えていただけなかったら 絶対に完成できませんでした。 大変感謝しています! 長々とお付き合いいただきまことにありがとうございました!

その他の回答 (3)

  • oka_me
  • ベストアンサー率86% (26/30)
回答No.3

補足有り難うございます。 また勘違いしていたようですみません。 貼っていただいた参照先のリンクが私のPCでは最初開けず読むことができなかったので てっきりIDもそのまま複製したいものであると思っていました^^; 今回は無事開くことができました。 リンク先読ませていただきましたが、 リンク先の「見積明細ID」→質問者様の仰る「事件ID」(メイン・サブフォーム) リンク先の「工程明細ID」→質問者様の仰る「連絡先ID」(サブフォーム) ・・・という認識でよろしいでしょうか?(また違っていたらすみません) それでよろしいのであれば テーブル「JIK」 「事件ID」→オートナンバー型(主キー) テーブル「REN」 「連絡先ID」→オートナンバー型(主キー)/「事件ID」→数値型 また当方環境下あるいは細かい設定の違いの問題かもしれませんが、 そのままではサブフォームの「事件ID」が上手く複製されなかったので DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append の3行を、「サブフォーム再クエリ」の記述の前に移動したら上手く複製できました。 それでも動かないようであれば補足願いますm(_ _)m

masunona
質問者

お礼

何度もありがとうございます! >リンク先の「見積明細ID」→質問者様の仰る「事件ID」(メイン・サブフォーム) >リンク先の「工程明細ID」→質問者様の仰る「連絡先ID」(サブフォーム) まさに上記のとおりです! いただいた方法試してみました。 メインフォームのレコードの複製の構文を サブフォームコントロールの再クエリの前にもってきてみました。 Private Sub 明細コピー_Click() On Error GoTo Err_明細コピー_Click Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' メインフォームレコードの複製 DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け ' サブフォーム再クエリ Me!SREN.Requery Exit_明細コピー_Click: Exit Sub Err_明細コピー_Click: MsgBox Err.Description Resume Exit_明細コピー_Click End Sub 教えていただいたやり方はこんなふうでよかったでしょうか? なお、メインフォームレコードの複製のコードが DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append から DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け に変更になっているのは、 この時点でのエラーを修正するためです。 こうしたおかげで「コマンドまたはアクション”追加貼り付け”は無効です。」 とはでなくなったのですが、 サブフォームのレコードはやはりコピーできませんでした。 追加クエリだけ実行してみようとすると 「○件のレコードでキー違反」 と出てしまいました・・・。 また何かお気づきの点ありましたら教えてください! よろしくお願いいたします!

  • oka_me
  • ベストアンサー率86% (26/30)
回答No.2

質問の意味を一部理解しきれていなかったようで申し訳ありません。 つまりは例えばメインフォームに「1 みかん」と表示されていたら ボタンをクリックの際にメインフォームで「1 みかん」のレコードをメインフォーム内で複製、 同時にサブフォームでIDが1のレコードをサブフォーム内で複製・・・のような感じでよろしいですか? 「コマンドまたはアクション”追加貼り付け”は無効です。」のエラーメッセージの件は とりあえず主キー設定無しでこちらでも試してみたところ、再現できず普通に動作したのですが この件に関してはもう大丈夫でしょうか? 主キーに関してですが 同一テーブル内では重複はできないので、レコード全体をそっくり複製するのは難しいと思います。 代替案としては、別に主キー(事件ID)と詳細フィールド(氏名、フリガナ・・・)を設定したテーブルを用意して MAIN、RENテーブルはそれぞれフィールドをIDのみにし(こちらは主キーは外して下さい) クエリで結合させてそれぞれメイン、サブフォームに表示させる、とかでは如何でしょうか。。。 見当違いな回答でしたらすみませんm(_ _)m

masunona
質問者

お礼

こちらこそ説明が下手で申し訳ありません。 またご回答いただきありがとうございます! >メインフォームに「1 みかん」と表示されていたら >ボタンをクリックの際にメインフォームで「1 みかん」のレコードをメインフォーム内で複製、 >同時にサブフォームでIDが1のレコードをサブフォーム内で複製 目指すものは上記のとおりです! 主キー(事件ID)だけは複製せず新しい番号を自動でふって、 それ以外は複製、ということはできないでしょうか・・・? 私が参考にしたサイトでは、 (http://www.accessclub.jp/bbs3/0103/superbeg36719.html) IDが重複しないように構造上工夫されているようなのですが そっくりそのまま作ったつもりなのに先述したエラーが出てしまいうまくいきません。 下記参考サイトの抜粋です。 >ちなみに、今回のようにメインフォームのID番号フィールドがオートナンバー型の場合、 >新規レコードのID番号フィールドが何番になるか予測することは難しい(というか無理?) >です。なぜかというと、途中でレコードの削除をしたとき、あるいは何らかの理由で >レコードが正常に保存されなかったときなど、簡単に欠番になってしまいますので。 >そのため、ちょっとした工夫が要ります。 >今回考えた方法としてはコピー対象レコードの[見積明細ID]の値を一時的に格納する >ためのテキストボックスを作り、追加クエリの中で条件としてそれを参照させることに >しました。 あまりテーブルを増やしたりすることは上司がいやがるもので・・・ 申し訳ありませんが、お時間ありましたらまた教えてください! お願いいたします!

  • oka_me
  • ベストアンサー率86% (26/30)
回答No.1

単に表示されているレコードを別テーブルに追加するだけでしたら以下のコードのみで可能です。 Private Sub 明細コピー_Click() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "REN", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs!連絡先ID = Me.事件ID rs!氏名 = Me.氏名 rs!フリガナ = Me.フリガナ '(・・・以下必要に応じて項目を増やして下さい) rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing Me!REN.Requery End Sub もし「ユーザー定義型は~」のようなエラーが出た場合は、「ADO 参照設定」等のキーワードで検索してVBEの設定を変更して下さい。

masunona
質問者

お礼

別テーブルではなく、 メインフォーム、サブフォームそれぞれ同じテーブルに複製したいです! 質問に挙げた方法でやってみたところ、 今日はサブフォームのレコードが追加されません。 追加クエリを見てみると、 「Forms]![MAIN]![事件ID] AS 式1」 が文字化けしてしまっていました。 引き続きよろしくお願いいたします!

masunona
質問者

補足

たびたびすみません。 文字化けについては、フィールドのパラメータを指定することで解決できました。 (「事件ID」のパラメータを「整数型」にしました) しかし次は、 追加クエリですべてのレコードを追加できません ×件のレコードでキー違反 となってしまいました。 「事件ID」を主キーに設定してしまっているせいなのかなと思いますが 「事件ID」を主キーにしないわけにはいきません。 どのように対処したらいいでしょうか? 引き続きよろしくお願いいたします!

関連するQ&A