• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESSのサブフォームコピーについて)

ACCESSのサブフォームコピーについて

このQ&Aのポイント
  • ACCESSのサブフォームコピーについて
  • メインフォームのボタンをクリックすることでメインフォームとサブフォームを同時にコピーしたい。
  • 現在のコードではメインフォームのコピーのみ行っているため、サブフォームもコピーする方法を知りたい。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.17

No.16です。 > 念のためテストデータで検証後に本データに反映させますので、 > 数日のタイムラグはありますので大丈夫です(^^) とりあえず、それを聞いて安心しました。 ・・・さて、以下の件ですが、 > フォーカスはサブフォームのレコードを貼り付けたところで止まっています。 前回回答した「フォーカス移動の対応」を入れる前にはエラーが なかったことから考えても、改修部分での発生と思います。 とりあえず、思いつくパターンをこちらのサンプルで確認したところ  a)「Me!」の直後の部分(IDやサブフォーム名)を、実際にはない   「ID1」などにした場合:   「2465」の当該フィールドがないとのエラー  b)「Me.」の直後の部分(GotoPage)に、実際にはない「GotoPageA」   などを指定した場合:   コマンドボタンを押した直後にコンパイルエラー  c)「Me!」の後に続いて、「.」で始まる「SetFocus」や「SourceObject」   を、それぞれ「SetFocus1」や「SourceObject1」にした場合:   「438」のサポートしていないとのエラー という結果になりましたので、「c」の部分のスペルミスの可能性が 高いように思います。 ・・・IDやサブフォームがコントロールであることをわかりやすくする 意味で、先頭に「Me!」をつけたのですが、実際には「Me!」はなくても 正しく動作します。 ですので、両者(IDとサブフォーム名)の「Me!」を削除(Deleteキーで 消去)した上で、コード表示画面のメニューから、「デバッグ(D)→ ○○のコンパイル(L)」をクリックしてみてください。 「コンパイルエラー」のメッセージを『OK』をクリックして閉じると、 間違いがあった部分が反転表示されますので、そこが修正が必要な箇所 ということになります。 (「.SetFocus」「.SourceObject」の部分を削除後、IDやサブフォーム名  の後ろに半角ピリオド「.」を入力すると、指定できるパラメータの候補  が表示されるので、そこから選ぶのが一番確実です:  予め「Me!」を削除しておかないと、この機能は働かないのでご注意を) ・・・もしも上記とは別のところでエラーが発生していた場合は、 そこに対して、同様の手順を試してみてください。 また、上の方法でコンパイルエラーが発生しなかった場合は、 コード冒頭の「On Error Goto エラー処理」の先頭に「'」を追加 して、独自のエラー処理を無効化してから、再度コピー処理を 実行してみてください。 (エラーメッセージに『デバッグ』というボタンが表示されるので、  それをクリックすると、エラー箇所が黄色表示されます) ※メニューから「実行(R)→リセット(R)」を選択するか、ツール  バーのリセットボタン(青い四角形)を押して黄色表示を解除  した後、その行を改修します。 なお、もしもVBAに表示制限用のパスワードを設定している 場合は、予めパスワードを通しておかないと、エラーメッセージ の『デバッグ』ボタンは押せないので、ご注意下さい。 (パスワードは、メニューで「ツール(T)→○○のプロパティ(E)」  をクリックして表示されるダイアログの『保護』タブで設定と  解除ができます: 一応、参考まで。)

du-sama
質問者

お礼

できました!!! 感動です(T▽T) ありがとうございます! エラーの原因は画像で頂いた、メインフォームのIDの名前が違いました。 変更した記憶もなく・・・。 数年前から積み重ねてきたファイルだったので、何かの時に編集したままになっていたのでしょう(汗 ともかく、思った通りの動作になりまして大変満足しております。 説明も分かりやすく、とても感謝してます。 ありがとうございました。

その他の回答 (16)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.16

No.14です。 > コピー後にメインフォームの一番左上に画面を移動したい > のですが、可能でしょうか? 可能です。 ・・・可能なんですが、その動作の検証のためにサンプルを 動かしてみたところ、動作に重大な欠陥が発生することが わかりました(汗) 具体的には、2回目以降のコピーでエラーが発生し、画面上 はコピーされているように見えるのに、その状態でフォームを 閉じてから再度開くと、2回目のサブフォーム分のレコードが なくなっている、という恐ろしいものです(汗) 大変申し訳ありません。 ただ、対処方法は既にわかっていて、またコードの改変幅は 小さいので、今回ご希望の動作と併せても、数行の改修で 済みますので、その点はご安心下さい(汗) No.7のコードからの改修箇所と、改修後のコードは以下の 通りです(サブフォームのIDの書換部分): 【改修前】    Me!サブテーブル.Form.Refresh    '但し、前回回答により、以下に差し替え済みのはず    'Me!(サブフォーム名).Form.Refresh 【改修後】 '※上記1行を削除し、以下のコードに差し替えます:    Me!ID.SetFocus    Me!(サブフォーム名).SourceObject = Me!(サブフォーム名).SourceObject    Me.GotoPage 1, 0, 0 ・・・以上です。 『改ページ』を入れていない限り、表示中のフォームの 領域が(何レコード目であるかには関係なく)1ページ目、 という数え方をされるので、「Me.GotoPage」の第1引数に 「1」を指定し、その左上隅の座標である「0, 0」を第2及び 第3引数に指定しています。 (『改ページ』は、フォームのデザインビューで、フォーム  デザイン用のツールバーの中(『コマンドボタン』のボタン  の隣)にあります:  意図的に追加していない限り、気にしなくてOKです(汗)) なお、差し替え後の2行目のコードの右辺については、サブ フォームの表示用フォーム(→今度はコントロールではなく、 「ソースオブジェクト」に指定しているフォームの名前の方)を 直接指定してもOKです: 【改修後・パターン2】    Me!ID.SetFocus    Me!(サブフォーム名).SourceObject = "SF_サブ"    '右辺はダブルクォート(")で括る必要があります。    Me.GotoPage 1, 0, 0 ・・・以上です。 前回のコードで既に本番データの入力作業を実行されて いないことを祈ります(汗) 重ねてお詫び致します。 (内容が内容だけに、本当にしゃれになりません・・・)

du-sama
質問者

補足

回答ありがとうございます。 サブレコードが消える件は、幸いまだWebを見ていませんでした。 念のためテストデータで検証後に本データに反映させますので、数日のタイムラグはありますので大丈夫です(^^) 「438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 というエラーメッセージが出ました。 フォーカスはサブフォームのレコードを貼り付けたところで止まっています。 Me!ID.SetFocus Me!サブフォームの表示コントロール名.SourceObject = Me!サブフォームの表示コントロール名.SourceObject Me.GotoPage 1, 0, 0 ということですよね? 念のため【改修後・パターン2】も試してみましたが、同じエラーが出てしまいました。 ダブルクォートの中はサブフォーム名にしましたが。(ソースオブジェクトの方)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.15

>最初のメッセージボックスで「キャンセル」 >を押してもコピーが実行されるようです。 忘れていました。訂正しました。それから コピーの順序を変えました。コードが複雑に なるのであっさりと。 >あ、あと今気付いたのですが、メインレコードの >最後のレコードを削除してしまうと(IDに欠番が >出たすぐ後)サブレコードがコピーされないようです。 >これは、メインレコードの最後のID+1(つまりメイン >レコードのコピー後のID)の値をいつも代入する、 >のような感じですることは出来ますでしょうか。 これはメインテーブルのIDがオートナンバーだから と思いますが。データの削除を伴う場合がるときは 一般的には主キーこの場合はIDですが、を連続番号 を発行するようにして対応します。 しかし、いずれにしてもメインレコードだけを 削除するのではなく、メインレコードに紐付け られたサブフォームのレコードも同時に削除 しないと幽霊レコードがサブテーブルに残る ことになります。 >「i」とはどういった意味なんでしょうか。 コードの最初に Dim i As Long と宣言して いるように、数値型(長整数型)の変数でこれに 数値を代入していろいろします。 それでは以下、訂正したコードです。 Private Sub コピー開始() Dim db As Database Dim rsm As Recordset Dim rs As Recordset Dim rst As Recordset Dim i As Long On Error GoTo Er_ha Set db = CurrentDb Set rs = db.OpenRecordset("サブテーブル", dbOpenDynaset) Set rsm = db.OpenRecordset("メインテーブル", dbOpenDynaset) Set rst = Me!サブフォーム表示コントロール名.Form.RecordsetClone If MsgBox("◆内容のコピーを作成しますか?◆", vbOKCancel) = vbCancel Then GoTo Er_ha Else rsm.MoveLast i = rsm!ID 'サブフォームのデータのコピー If rst.RecordCount > 0 Then With rst rst.MoveFirst Do Until .EOF rs.AddNew 'IDは必要ないと思われるのでコメントアウトしておきます。 '必要なら先頭の'をはずしてください。 rs![ID] = i + 1 rs![ライセンス数] = rst![ライセンス数] rs![開始日] = rst![開始日] '以下、他に項目があるならその他の項目を置き換えてください。 '必要なときは先頭の'をはずしてください '同様にして他の項目を追加してください。 'rs![その他の項目] = rst![その他の項目] rs.Update rst.MoveNext Loop End With Else End If 'メインフォームのコピー DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 MsgBox ("コピー終了しました") DoCmd.RunCommand acCmdSaveRecord End If 'エラー処理 Er_ha: If Err.Number <> 0 Then MsgBox (Err.Number & vbCrLf & Err.Description) End If rs.Close Set rs = Nothing rst.Close Set rst = Nothing rsm.Close Set rsm = Nothing db.Close Set db = Nothing End Sub なお、レコードの削除と連続番号の発行方法については 必要なら提案します。その場合はテーブルのIDフィールドの データ型の変更、コードの追加と変更が必要になります。

du-sama
質問者

お礼

何回もとても親切に教えて頂いてありがとうございました。 結果、別の方法で解決しましたが、piroin654様には大変お世話になりました。 ありがとうございました。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.14

No.11です。 > どこかにサブフォームの表示コントロールに置き換える場所が > ありましたらお教え下さい。 あ~・・・そういうことですか(汗) 「サブテーブル」という名前に引っ掛かりを感じてはいたんですが、 それはつまり、「サブフォームのレコードソースにしているテーブル」 ということだったんですね。 てっきり、サブフォームの表示コントロールの名前が「サブテーブル」 なのだと思っていました(汗) すみませんが、No.7の回答で「サブテーブル」になっているところは 全て、サブフォームの表示コントロールの名前に置き換えてください。 【例】(コントロールの名前が「ライセンス情報」だった場合)  <修正前>  RecCnt = Me!サブテーブル.Form.RecordsetClone.RecordCount  <修正後>  RecCnt = Me!ライセンス情報.Form.RecordsetClone.RecordCount いちいち更新するのは面倒だと思いますので、置き換えるコードの どこか適当なところにカーソルを置いた状態でCtrl+Hキーを同時に 押して置換ダイアログを呼び出し、検索文字列と置換文字列を指定 の上、『対象』に「カレント プロシージャ(P)」を指定して、置換ボタン をクリックして下さい。 (検索条件などを間違えた場合は、置換ダイアログを閉じた上で、  Ctrl+Zキーの同時押しで元に戻せます) ・・・それと、No9の方への補足への横レスになりますが(汗)、 そこでサブフォーム側のIDが1だけ小さくなっているのは、メイン側 のレコードが、貼り付けただけで保存されていないのが原因です。 ですので、対処方法としては、単純に代入値を+1するのではなく、 メイン側の貼り付け後に「レコード保存」を追加するのが、根本的な 解決策となります。 (私がしたNo.7の回答で、メイン・サブそれぞれの複製のところで  「RunCommand acCmdSaveRecord」を入れているのもそのため) ※DoMenuItemでの「レコードの保存」の引数がいくつになるかは、   (RunCommandでやるのが正統ということもあり)調べていません。 そうしないと、もしもメイン側とサブ側のそれぞれのIDにリレーション シップが組まれていて、参照整合性を設定していた場合(→今回の 事例は本来そうされているべき事案かと)、恐らくエラーが発生する はずです。 (「テーブル'メイン'にリレーションシップが設定されたレコードが  必要なので、レコードの追加や変更を行うことはできません」と  いった感じで) 【参考まで】 リレーションシップ・参照整合性について: http://www.relief.jp/itnote/archives/000497.php リレーションシップの設定方法: http://www.officepro.jp/access/relation/index3.html

du-sama
質問者

補足

回答ありがとうございます! 出来ました!!!! すごくうれしいです!!ありがとうございます(T▽T) この方法でしたら欠番も大丈夫ですね。 あとひとつだけ良いでしょうか。 コピー後にメインフォームの一番左上に画面を移動したいのですが、可能でしょうか? メインフォームには縦横にスクロールバーが出ていて、微妙に1画面に収まりきりません。 コピー後にサブフォーム(メインフォームの右下にあります)にフォーカスがあるので、 画面が右下に寄っていて、その都度左上までマウスで移動してメインを入力する感じになります。 左上が本当はいいのですが、難しければフォーカスの移動でもいいです。 メインフォームの"ID"に移動など。 宜しくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.13

サブフォームのデータコピーのところです。 うまくいきますように。

du-sama
質問者

補足

度々すみません、最初のメッセージボックスで「キャンセル」を押してもコピーが実行されるようです。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.12

>メインフォームのコピー後のIDより1つだけ小さい >IDでサブフォームがコピーされています。 プログラムの中ほどの >rs![ID] = i を rs![ID] = i + 1 としてください。

du-sama
質問者

補足

できました!ありがとうございます! ちなみに >rs![ID] = i の「i」とはどういった意味なんでしょうか。今後の為に覚えておきたいです。 あと、コピー後の画面にて、サブフォームにはコピー前のIDのレコードが表示されてしまいます。 メインのレコードを移動して戻ってくるとちゃんとコピー後のIDのレコードが表示されます。 サブレコードの再読み込み?のようなことをすればコピー後にすぐ表示されるような気がするのですが、やりようはありますでしょうか。 このままだと、コピー後すぐにサブレコードを編集してしまうと前のIDのものを編集してしまい、間違いのもとになりそうです。 あ、あと今気付いたのですが、メインレコードの最後のレコードを削除してしまうと(IDに欠番が出たすぐ後)サブレコードがコピーされないようです。 これは、メインレコードの最後のID+1(つまりメインレコードのコピー後のID)の値をいつも代入する、のような感じですることは出来ますでしょうか。 それか他に解決方法がありますでしょうか。 何回も度々恐れ入りますが宜しくお願いいたします。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.11

No.7です。 > 「サブテーブル」の部分を本物のサブテーブルの名前にする > だけだと思うのですが、それで合っていますでしょうか。 それで問題ないはずです。 (敢えて挙げるなら「ID」もですが、これは既にそちらと同名のはず) こちらのサンプルで、一旦サブフォームの名前を変えて実行したところ、 同じ「Err.Number=2465」のエラーが発生しましたので、「サブテーブル」 という名前が、実際にフォームで使われているものと合っていない、 ということで間違いないものと思います。 なお、ここで使用する名前は、サブフォームのプロパティシートの 『その他』タブにある『名前』欄に表示されるものの方になります。 『データ』タブの『ソースオブジェクト』欄に表示される方ではない ので、ご注意下さい。 (双方が同じ場合は、問題ありません) また、具体的にどの行がエラーを起こしているのかを確認したい 場合は、前回提示したコードの先頭の「On Error~」の頭に「'」を 追加して独自のエラー処理を無効にして、再度処理を実行して みてください。 (エラーメッセージ内に表示される、『デバッグ』ボタンをクリックする  ことで、該当行を黄色表示させることができます:  VBAに表示用のパスワードが掛かっている場合は、先に認証を  通しておかないと、同ボタンは使用できないのでご注意下さい) ※今回はメッセージ内で「サブテーブル」という名前が表示されている  ので、そこまでする必要はないかと思いますが、今後の参考まで。 > 旧バージョンとはACCESSのことでしょうか。。 はい、Accessのことです。 Access2003のDoMenuItemのヘルプには、以下の説明があります: > メモ Access 97 で、DoMenuItem メソッドは RunCommand メソッド > に置き換えられました。DoMenuItem メソッドは、以前のバージョンの > Access との互換性を保つためにのみ、このバージョンに含まれています。 Access97はAccess2000の前ですから、Access2000でも推奨されるのは RunCommandメソッドになりますので、置き換えました。 組み込み定数については、以下のようなサイトもありますので参考まで: http://www.accessclub.jp/runcommand/ > サブフォームはデータシートでなければだめでしょうか。。 失礼、言葉が足りていませんでした(汗) 「もしテーブルを直接使用していたなら、フォームで同様の見た目をした ものもあります(=データシート型)」という意味です。 元からフォームを使用されているのでしたら、それで問題ありません。 ・・・長くなりましたが(汗)、以上です。

du-sama
質問者

補足

回答ありがとうございます。 >なお、ここで使用する名前は、サブフォームのプロパティシートの >『その他』タブにある『名前』欄に表示されるものの方になります。 >『データ』タブの『ソースオブジェクト』欄に表示される方ではない >ので、ご注意下さい。 こちらですが、サブフォームの表示コントロールのことでしょか? 教えて頂いた式の中にサブフォームの表示コントロールを記載するところがありましたでしょうか? どこかにサブフォームの表示コントロールに置き換える場所がありましたらお教え下さい。 宜しくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

たぶん、データはコピーと表示ができると思いますが、 フィールドが100あると聞いてあわててしまい ました。必要なものも抜かしていたかもしれ ません。長々とした回答で申し訳ないです。 まだ、油断はできないのですが、何かあれば メッセージを送ってください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

訂正しました。どうですか。 Private Sub mcdコピー開始_Click() Dim db As Database Dim rsm As Recordset Dim rs As Recordset Dim rst As Recordset Dim i As Long On Error GoTo Er_ha Set db = CurrentDb Set rs = db.OpenRecordset("サブテーブル", dbOpenDynaset) Set rsm = db.OpenRecordset("メインテーブル", dbOpenDynaset) Set rst = Me!サブフォーム表示コントロール名.Form.RecordsetClone 'MsgBoxで引数たとえばvbOKCancelなどを設定するときは()でかこいません MsgBox "◆内容のコピーを作成しますか?◆", vbOKCancel If vbOK Then 'メインフォームのデータのコピー DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 rsm.MoveLast i = rsm!ID 'サブフォームのデータのコピー If rst.RecordCount > 0 Then With rst rst.MoveFirst Do Until .EOF rs.AddNew 'IDは必要ないと思われるのでコメントアウトしておきます。 '必要なら先頭の'をはずしてください。 rs![ID] = i rs![ライセンス数] = rst![ライセンス数] rs![開始日] = rst![開始日] '以下、他に項目があるならその他の項目を置き換えてくださ い。 '必要なときは先頭の'をはずしてください '同様にして他の項目を追加してください。 'rs![その他の項目] = rst![その他の項目] rs.Update rst.MoveNext Loop 'MsgBox ("サブフォームのコピー終了") End With Else ' MsgBox ("サブフォームにレコードがありません。") End If MsgBox ("コピー終了しました") End If 'エラー処理 Er_ha: If Err.Number <> 0 Then MsgBox (Err.Number & vbCrLf & Err.Description) End If rs.Close Set rs = Nothing rst.Close Set rst = Nothing rsm.Close Set rsm = Nothing db.Close Set db = Nothing End Sub

du-sama
質問者

補足

回答ありがとうございます。 非常におしいです! メインフォームのコピー後のIDより1つだけ小さいIDでサブフォームがコピーされています。 コピー前メインID=サブID=12659 コピー後メインID=16989、サブID=16988 おしいです! これの解決方法ありますでしょうか。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

最初の回答の"この回答への補足"で、 [サブフォームの表示コントロール]の名前を サブフォームと同じにした、ということですが このようにすると何かと混乱のもとになるので 例えば、サブフォームの名前が サブフォーム1ならば、コントロールの 名前は違う名前、たとえばサブフォーム1sub あるいはobjサブフォーム1のように変えてください。 ときにはコードが動きません。サブフォームの データが取れないのもそのあたりにあります。 提示したコードでは Set rst = Me!サブフォーム表示コントロール名.Form.RecordsetClone の部分も変更します。 それから、 >メインテーブルのフィールドが100を超える為、 >教えて頂いたように行数を足していくのは >現実的ではありません。 このようなことは最初に情報をくださいませ。 では、du-samaさんが最初に提示したコードを そのまま利用して、以下のようにします。 Private Sub mcdコピー開始_Click() Dim db As Database Dim rsm As Recordset Dim rs As Recordset Dim rst As Recordset Dim i As Integer On Error GoTo Er_ha Set db = CurrentDb Set rs = db.OpenRecordset("サブテーブル", dbOpenDynaset) 'サブフォーム表示コントロール名は変更してください。 Set rst = Me!サブフォーム表示コントロール名.Form.RecordsetClone 'MsgBoxで引数たとえばvbOKCancelなどを設定するときは()でかこいません MsgBox "◆内容のコピーを作成しますか?◆", vbOKCancel If vbOK Then 'メインフォームのデータのコピー DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'サブフォームのデータのコピー If rst.RecordCount > 0 Then With rst rst.MoveFirst Do Until .EOF rs.AddNew 'IDは必要ないと思われるのでコメントアウトしておきます。 '必要なら先頭の'をはずしてください。 'rs![ID] = rst![ID] rs![ライセンス数] = rst![ライセンス数] rs![開始日] = rst![開始日] '以下、他に項目があるならその他の項目を置き換えてください。 '必要なときは先頭の'をはずしてください '同様にして他の項目を追加してください。 'rs![その他の項目] = rst![その他の項目] rs.Update rst.MoveNext Loop End With Else End If MsgBox ("コピー終了しました") End If 'エラー処理 Er_ha: If Err.Number <> 0 Then MsgBox (Err.Number & vbCrLf & Err.Description) End If rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub

du-sama
質問者

補足

メインフォームとサブフォームがコピーされましたが、'サブフォームのデータのコピー のところでIDをコピーしないようにすると、サブレコード自体はコピーされているようですが、IDが空白の為、コピー後のメインフォームに埋め込まれたサブフォームに表示されません。 IDをコピーするように’を外したところ、やはりコピー前のIDと同じになってしまいました。 メインコピー後のIDを代入する必要がありそうですが・・・。頂いた式で普通は出来るんですよね。。困りました。 今更ですが、ACCESS2000です。何か関係あるでしょうか。。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.7

No.1での補足で、すぐに解決するかと思っていたのですが・・・(汗) 以下のような動作がご希望と推測します: <コピー元> 【メイン】  ID=1、登録名=氏名1、・・・ 【サブ】  SubID=1、ID=1、・・・  SubID=2、ID=1、・・・ <複製結果> 【メイン】  ID=8、登録名=氏名1、・・・ 【サブ】  SubID=15、ID=8、・・・  SubID=16、ID=8、・・・ 以下、この前提での対応策です: Private Sub 内容のコピーを作成_Click() On Error GoTo Err_内容のコピーを作成_Click   Dim strMsg As String, NewID As Long, RecCnt As Long, myBkmk As String   'キャンセル選択時は即終了   strMsg = srchXls & vbCrLf & "◆内容のコピーを作成しますか?◆"   If MsgBox(strMsg, vbOKCancel) = vbCancel Then GoTo 終了処理   '現在位置の記録&サブ側の有無確認   myBkmk = Me.Bookmark   RecCnt = Me!サブテーブル.Form.RecordsetClone.RecordCount   'メイン側の複製(DoMenuItemは旧バージョン用のためRunCommandに置換)   '※「acCmdPasteAppend」を使用すると追加貼付は1行で済みますが、以降、   '  諸々の不具合を生じるため、「移動・選択・貼付」に分割   DoCmd.SetWarnings False   '確認メッセージの非表示化   RunCommand acCmdSelectRecord   RunCommand acCmdCopy   DoCmd.GoToRecord acDataForm, Me.Name, acNewRec   RunCommand acCmdSelectRecord   RunCommand acCmdPaste   RunCommand acCmdSaveRecord   'サブ側の複製(レコード存在時のみ)   If RecCnt Then     '元のレコードに戻ってサブ側をコピー     Me.Bookmark = myBkmk     Me!サブテーブル.SetFocus     RunCommand acCmdSelectAllRecords     RunCommand acCmdCopy          'メイン側の複製レコード(=末尾)に移動して貼付     DoCmd.GoToRecord acDataForm, Me.Name, acLast     Me!サブテーブル!ID.SetFocus     DoCmd.GoToRecord , , acNewRec  'サブでは第1・2引数は指定不可     RunCommand acCmdSelectRecord     RunCommand acCmdPaste     RunCommand acCmdSaveRecord     'IDの書換     NewID = Me!ID  '新規IDを記録     With Me!サブテーブル.Form.RecordsetClone       .MoveFirst       Do Until .EOF         .Edit         !ID = NewID         .Update         .MoveNext       Loop       .MoveFirst     End With     Me!サブテーブル.Form.Refresh   End If   '終了時に元のレコードを表示させたい場合は以下の1行を有効化   'Me.Bookmark = myBkmk   'メッセージを表示   Call MsgBox(srchXls & vbCrLf & "◆コピーを作成しました◆") 終了処理:   '確認メッセージの設定を元に戻す   DoCmd.SetWarnings True   'Subを抜ける(入れ忘れるとエラー処理が無限ループ化)   Exit Sub Err_内容のコピーを作成_Click:   MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 内容のコピーを作成_Click"   Resume 終了処理 End Sub ・・・以上です。 ※字数制限に引っ掛かったため、コメント等は最小限に留めました(汗)

du-sama
質問者

補足

回答ありがとうございます。 「2465:指定した式で参照されている'サブテーブル'フィールドが見つかりません。」 というエラーが出て、メインフォームもサブフォームもコピーされません。 私が希望する動作は<コピー元><複製結果>で示して頂いた動作で合っています。 教えて頂いた式で私が編集しなければならない個所は「サブテーブル」の部分を本物のサブテーブルの名前にするだけだと思うのですが、それで合っていますでしょうか。 'メイン側の複製(DoMenuItemは旧バージョン用のためRunCommandに置換) とはどういう意味ですか?今更ですが、ACCESSは2000です。2007にしたら動かないマクロが出てしまい、他に諸事情もあり当面2000で使用しています。(ファイルも2000で作成しました) 旧バージョンとはACCESSのことでしょうか。。 サブ側でIDを編集することが稀にあります。 サブフォームはデータシートでなければだめでしょうか。。帳票フォームにしていました。見栄えの問題です。

関連するQ&A

専門家に質問してみよう