Accessでレコードの複製する方法

このQ&Aのポイント
  • Access2010を使用して入力フォームを作成し、メインフォームとサブフォームに顧客情報を表示させています。
  • 「複製」ボタンを押すと、メインフォームとサブフォームのレコードがコピーされますが、リンクされたテーブルでは複製ができません。
  • VBAコードを使用してレコードを複製する方法もありますが、複製時にエラーが発生する場合があります。
回答を見る
  • ベストアンサー

Accessでレコードの複製

Access2010を使用して入力フォームを作成しています。 メインフォームとサブフォームにそれぞれ顧客情報を表示させていて、 「複製」ボタンを押すと、 メインフォーム、サブフォームのレコードがコピーされるようにしています。 メインフォームの元テーブルはJIK サブフォームの元テーブルはREN です。 JIKおよびRENテーブルはほかからリンクさせているのですが、 これで「複製」ボタンを押すと、 "実行時エラー '3022': インデックス、主キー、またはリレーションシップで重複する値が生成されるためテーブルに要求した変更でした成功しました。フィールドまたは重複データが含まれている、インデックスを削除するフィールド内のデータを変更または重複するエントリを許可して、やり直してのインデックスを再定義します。このエラーは、レポートやレポートの生成に変更を保存するときに発生します。 が出てしまいます。 テーブルをインポートすると正常に動作します。 テーブルをリンクさせる場合、レコードの複製は不可能なのでしょうか? VBAは以下のように記述してみました。 Private Sub コマンド10_Click() On Error GoTo Err_コマンド10_Click Dim Result As Integer Result = MsgBox("このデータを複製しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "データの複製確認") If Result = vbYes Then Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!SREN.Requery ' 追加したレコードに移動 DoCmd.GoToRecord , , acLast Me.リスト31.Value = Me.リスト31.ItemData(0) MsgBox ("データを複製しました") Exit_コマンド10_Click: Exit Sub Err_コマンド10_Click: MsgBox Err.Description Resume Exit_コマンド10_Click Else MsgBox "データの複製をキャンセルしました" End If End Sub 追加クエリは以下のように作成してみました。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

【つづき】 Me.Dirty 部分は、編集中なら保存してみて、まだ編集中なら何かあったんでしょう。 処理せずに抜けます。 オートナンバの「事件ID」が Null なら新規レコードなんでしょう。 コピーするものはないので抜けます。 フォームの表示を抑止してから 現在の「事件ID」を覚えておいてコピー処理に突入   With Me.Recordset     ・・・・・   End With 部分がメインフォームに表示しているレコードのコピー処理になります。 Me.RecordsetClone を、現在表示しているレコードに同調させます。     For i = 0 To .Fields.Count - 1       Select Case .Fields(i).Name         Case "事件ID"         Case Else           .Fields(i) = rs(i)       End Select     Next 部分で各フィールドの値を設定(コピー)していきますが、 「事件ID」はオートナンバなので値を設定しない様にします。 Me.Recordset に追加したので、メインフォームでは追加したものがカレントになってます。 ということは、オートナンバ「事件ID」は新しく採番された値となります。   Set rs = CurrentDb.OpenRecordset("SELECT * FROM REN WHERE 事件ID=" & iSave)   ・・・・・   Set rs = Nothing 部分がサブフォームの元になっているテーブル「REN」への追加になります。 テーブル「REN」の「事件ID」が、元の「事件ID」と一致するものを抽出します。 一致するものがなければ何もしません。 何かしらあったら、レコードセットの複製( Clone )を作ります。 これにより、フィールドの順が同じものが作られることになります。 フィールド順が同じという事は、フィールド何番目を何番目に代入・・・・ この、何番目が一緒になることを意味します。 抽出条件に一致するものがあったら、何件かわかりませんが複製元を最後に移動します。 前に向かって、抽出されたレコード数分フィールドの値を同じに(代入)していきます。       For i = 0 To rs.Fields.Count - 1         Select Case rs(i).Name           Case "連絡先ID"           Case "事件ID"             rsC(i) = Me.事件ID           Case Else             rsC(i) = rs(i)         End Select       Next ここでもメインと同様に、オートナンバ「連絡先ID」なら値を設定しない様に。 また、「事件ID」は新しく採番された「Me.事件ID」を設定する様に・・・・ (「Me.事件ID」は前述したように追加した後のものになっているので・・・) で、サブフォーム元のテーブルに追加した後、リンク親/子フィールドが設定されていたとすると、   Me.Recalc で、フォーム内(メイン/サブとも)の表示が変わったと思います。変わらなければ > ' サブフォーム再クエリ > Me!SREN.Requery でも・・・ 最後に、フォームの表示抑止を解除します。 専用の記述にすると、上記の様になるかと思います。 その処理専用のクエリを作成して・・・・でも良いと思いますが、 最低限のフィールド名(除外するもの/値を更新するもの)がわかっていれば、 少ない記述でできるものと思います。 ただ、注意する事があって、 Clone したものに追加すると、Clone 元の最後に追加された事になるので、 Clone 元での rs.EOF 判別は、出現しない事になります。 (単に MoveNext していたのでは ・・・ ということは、無限ループに陥ることに) 何レコードを複写(コピー)するとした場合、初期レコード数分 For で MoveNext するか、 最後にいってから、前に( MovePrevious )前にで先頭を越すか( While (Not rs.BOF) ) のどちらかになると思います。 今回は、前に前に・・・の方法を提示してみました。 (抽出されるのは1件だけ・・・・であれば、MoveLast / MovePrevious 等は不要ですけど) ※ この方法での利点を挙げるとすれば、  仕様変更等により、各テーブルのフィールド数に増減があったとしても修正しなくても良い  (除外・更新する部分に変更あれば、修正は必要ですが・・・) 参考にする/しない等々含め、自己責任でお願いします。 蛇足1) > DoEvents ' (必要に応じて) このようなコメントは不要と思います。 読んでわかるレベルのものならば、コメントはない方が良いかも コメントは、読んでもわからない理由を記述しておくものと思います。 例えば、 DoEvents ' そのまま実行すると次行で 2046 エラーになるため、一息入れる とか? 蛇足2) No77233.サブフォームのレコードのコピーができない http://www.accessclub.jp/bbs/0240/beginers77233.html にある CopyRec は、 オートナンバはない & 抽出は1件を条件に、使い回しできるように・・・でした

masunona
質問者

お礼

早速ありがとうございます! >仕様変更等により、各テーブルのフィールド数に増減があったとしても修正しなくても良い 非常に魅力的です!! ちょっと時間がかかりそうですがやってみたいと思います。 取り急ぎお礼までです。 またご報告させていただきます。

masunona
質問者

補足

ご連絡が遅くなってしまい申し訳ありません。 大変時間がかかってしまいましたが無事に動いてます。 感動です!! 長々とおつきあいいただきありがとうございました!!

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

では、当時に用意していた回答でしたが・・・・参考になれば 今回手を入れてません。(2つに分かれます) (既に対処されている部分はあるかと思います) 本回答は、後述の > 以下余談)VBAで違う書き方してみたら・・・・ということで のところがメインです >【追加クエリ】 > INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) > SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ > FROM REN > WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID])); この追加クエリは正しく動く事を前提とします。とすると、 > [Forms]![MAIN]![txtCopy事件ID] 部分は、元の値 > [Forms]![MAIN]![事件ID] 部分は、新しい値 これは、メインを複製(コピー)した後に動かすものと推測できます。 (同じ「事件ID」でコピーなら、わざわざフォーム参照の記述にはしませんよね) そこで、複製する前に行うと、同じ「事件ID」のものが追加されるだけです。 「事件ID」に主キーが設定されているのであれば、#4さんの説明通りと思います。 #4さんの例を使わせていただくと、本来やりたい事は 4 2 C りんご 青森   ↓ 4 4 C りんご 青森 と解釈しちゃいましたけど であれば、#3さんのお礼に記述してある処理順を入れ替えてみてどうなりますか? なお、「コピーレコードの追加貼り付け」した後は保存した方が良さそう。 保存して、確定した「事件ID」を使った方が確かかと・・・ 以下余談)VBAで違う書き方してみたら・・・・ということで (追加クエリとかで、フィールド全部書くのが面倒・・・とか思ったら) 「JIK」テーブルの「事件ID」、および 「REN」テーブルの「連絡先ID」はオートナンバと仮定します。 以下は、コマンドボタン「btn1」がクリックされたら・・・の処理になります。 また、サブフォームコントロールのリンク親/子フィールドに「事件ID」が設定されていると仮定します。 > DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 > DoCmd.RunCommand acCmdCopy '選択レコードのコピー > DoCmd.GoToRecord , , acNewRec '新規レコードに移動 > DoEvents ' (必要に応じて) > DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け 部分も別の書き方にしています。 説明は後で、まずは記述を Private Sub btn1_Click()   Dim rs As DAO.Recordset, rsC As DAO.Recordset   Dim iSave As Long   Dim i As Long   If (Me.Dirty) Then Me.Dirty = False   If (Me.Dirty) Then Exit Sub   If (IsNull(Me.事件ID)) Then Exit Sub   Me.Painting = False   iSave = Me.事件ID   With Me.Recordset     Set rs = Me.RecordsetClone     rs.Bookmark = .Bookmark     .AddNew     For i = 0 To .Fields.Count - 1       Select Case .Fields(i).Name         Case "事件ID"         Case Else           .Fields(i) = rs(i)       End Select     Next     .Update     Set rs = Nothing   End With   Set rs = CurrentDb.OpenRecordset("SELECT * FROM REN WHERE 事件ID=" & iSave)   If (Not rs.EOF) Then     Set rsC = rs.Clone     rs.MoveLast     While (Not rs.BOF)       rsC.AddNew       For i = 0 To rs.Fields.Count - 1         Select Case rs(i).Name           Case "連絡先ID"           Case "事件ID"             rsC(i) = Me.事件ID           Case Else             rsC(i) = rs(i)         End Select       Next       rsC.Update       rs.MovePrevious     Wend     rsC.Close     Set rsC = Nothing   End If   rs.Close   Set rs = Nothing   Me.Recalc   Me.Painting = True End Sub 【つづく】

masunona
質問者

お礼

長くお時間いただいてしまいました。 お礼が大変遅くなってしまって申し訳ありません。 いただいたコードを参考に作成してみたところ 四苦八苦しながらも無事動きました~! 早速こちらを使っていきます! 長い長い書き込みいただきありがとうございました!!

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

過去のご質問 メインフォームとサブフォームのレコードを複製 http://okwave.jp/qa/q8229154.html 時点のフィールドの型等は同じでしょうか? オートナンバ部分とか 当時、回答しようとして用意したものがありますが、日の目を見る事はなかったです。 それを記述すると、文字数制限に引っ掛かるようなので、どうしようか迷っています。 数回にわたって良いのなら投稿しますが、お礼率を気にされているようでしたらやめます。 ※ 本質的な部分についてはわかりません

masunona
質問者

お礼

ありがとうございます!! 以前の質問もご覧いただいていたとは恐縮です! 前回はテーブルインポートなのでうまくいったのですが、 リンクさせたらうまくいかなくなってしまったことに最近気づきました。 フィールド型等は、前回の質問と変更ないです。 ぜひ回答いただきたいです! お手数おかけしますが、よろしくお願いいたします!

関連するQ&A

  • メインフォームとサブフォームのレコードを複製

    (昨日同じ質問をあげましたがカテゴリが間違っていたのでこちらにあげなおしました) メインフォーム「MAIN」にサブフォーム「REN」を埋め込んでいます。 【メインフォームMAIN】 テーブル名:JIK ID:事件ID 【サブフォームREN】 テーブル名:REN ID:連絡先ID(・事件ID) ボタンをクリックすると、メインフォームで表示させているレコードを複製させたいです。 以下を参考に、そのとおり(のつもり)に作ってみたのですが (メインフォーム「MAIN」に「txtCopy事件ID」という名前のテキストボックスも作成しました) 「コマンドまたはアクション”追加貼り付け”は無効です。」 とエラーメッセージが出てしまいます。 どのように修正すればよいでしょうか? http://www.accessclub.jp/bbs3/0103/superbeg36719 … ちなみに追加クエリだけを実行すると 表示させているメインフォーム「MAIN」のレコードに、 サブフォーム「REN」のレコードが追加され、 サブフォーム「REN」のレコードが2倍になりました。 以下追加クエリとコードです。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID])); 【VBA】 Private Sub 明細コピー_Click() On Error GoTo Err_明細コピー_Click Me!txtCopy事件ID = Me!事件ID DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append Dim stDocName As String DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!REN.Requery Exit_明細コピー_Click: Exit Sub Err_明細コピー_Click: MsgBox Err.Description Resume Exit_明細コピー_Click End Sub よろしくお願いいたします!

  • Accessでレコードの複製

    Accessで、ボタンをクリックすると 表示させているレコードをコピーして複製したいです。 以下のようにコードを書いてみたのですが、 「コマンドまたはアクション”追加貼り付け”は無効です」 となってしまいます。 DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdPasteAppend '追加貼り付けを実行 ちなみに DoCmd.RunCommand acCmdPasteAppend を DoCmd.RunCommand acCmdPaste に修正しても 「コマンドまたはアクション”貼り付け”は無効です」 となって、エラーになってしまいます。 そこで、以下のようにコードを省略して DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord ここで、手動で、ctrl+Vをすると、レコードのコピーができます。 コードの書き方が間違っているのでしょうか? ご教授よろしくお願いいたします!

  • Access2007 サブフォームの新規レコードをすぐにフォームに表示させる方法

    サブフォーム上で適当なレコード(IDと商品名)を選択して、そのレコードにある入力ボタンを押すと、フォームのコンボボックス上にその商品名が出るようなフォームがあります。 すでに入力済みのIDと商品名は表示されます。 ところが、サブフォーム上でIDと商品名を新規入力して入力ボタンを押すと、フォームのコンボボックスは空白となり、商品データが表示されません。 しかし、一旦フォームを閉じて開くと、データは表示されています。 IDと商品名を新規入力して、そのままフォームのコンボボックスに反映させたいと思います。 入力ボタンはこのようにやってみました。 Private Sub 入力_Click() DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 Forms!フォーム!ID = Me.ID End Sub または、 Private Sub 入力_Click() DoCmd.RunCommand acCmdSaveRecord Forms!フォーム!ID = Me.ID End Sub ご教授いただければ幸いです。よろしくお願いいたします。

  • accessでのテーブルの複製について

    フォームでコマンドボタン(複製)をクリックして、レコードの複製を作成し、同じテーブルに追加しているのですが、例えば項目の連絡事項がnullの時、複製すると、「実行時エラー94:nullの使い方が不正です」と表示されます。 値が入っているときは問題はないのですが。複製元がnullであっても、そのままnullのまま問題なく複製するには、下記の記述をどうすればいいのでしょうか? Private Sub 複製_Click() Dim bikou As String Dim renraku As String 'カレントレコードの値を取得 bikou = Me!備考.Value renraku=Me!連絡事項.value '新規レコードに移動 DoCmd.GoToRecord , , acNewRec '各コントロールに値を代入 Me!備考.Value = bikou Me!連絡事項.Value =renraku End Sub

  • Access2003にて、メインフォーム上に設置した「コピー」ボタンを

    Access2003にて、メインフォーム上に設置した「コピー」ボタンをクリックすると、メインフォームとサブフォーム9個のレコードを一括で新規レコードにコピーするVBAを作成しています。 ですが、ボタンをクリックすると、 「3164  フィールドを更新できません」 とメッセージが表示されて、メインとサブ1だけがコピーされ、サブ2~9はコピーされません。 テーブルの構成は以下のようになっています。 メイン(テーブル名:00メイン)  ・計画書番号(オートナンバー型)※主キー  ・コピーフラグ(数値型)  ・コピー実行日(日付型)  ・作成フラグ(数値型)  ・作成日(日付型)  ※この他40程フィールドがあります。 サブ1~9(テーブル名:01~09サブ)  ・計画書番号(長整数型)※インデックスは「はい(重複なし)」  ・レコード作成用番号(長整数型)  ※この他各サブテーブルごとに、20~40程のフィールドがあります。 サブ1~9の計画書番号はメインの計画書番号とリレーションシップしています。 サブフォームに計画書番号を表示するようにしてみると、コピーボタンをクリックしたときサブ2だけがメインで取得した新しい計画書番号が表示されていて、サブ2~9はコピー元の計画書番号が表示されています。 以下にコピーボタンをクリックした時のコードとBeforeUpdate時のコードを記載します。 また、「Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No」の箇所はメインの新規作成時にサブ1~9にレコードを作成するようにしています。 (メイン作成と同時にサブにもレコードを作成したかったので・・・) サブ2~9までのコピーができるようにするにはどうしたらよいのでしょうか? よろしくお願いいたします。 Private Sub cmdコピー_click() DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!コピーフラグ = 1 Me!コピー実行日 = Date Me!サブ1.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!サブ2のサブフォーム.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend ※以下サブ3~9までサブ2と同じコードを記述しています。 MsgBox "レコードのコピーが完了しました。" End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) Dim dlgret As Integer dlgret = MsgBox("編集内容を保存しましすか?", vbQuestion + vbOKCancel, "保存確認") If dlgret = vbCancel Then Cancel = True Else '新規作成の場合、作成日フラグは既定値0のため1に変更 If Me!作成フラグ = 0 Then Me!作成フラグ = 1 Me!作成日 = Date If Me!コピーフラグ = 1 Then Forms!メイン!サブ1.Form.Requery Forms!メイン!サブ2.Form.Requery ※サブ3~9も同様にRequeryを行ないます。 Else MsgBox "コピーフラグは" & Forms!メイン!コピーフラグ & "です。" & Chr(13) & _ "新規作成を実行します。""" Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No Forms!メイン!サブ2.Form.レコード作成用番号 = Me.txt計画書No ※サブ3~9も同様に処理します。 End If Else End If End Sub

  • Access VBAでのフィルタ処理

    アクセス2003を使用しています。 今VBAを使用して、フォームのテキストボックスに記入された文字列を検索条件に、 クエリからデータ抽出したいのですが、 うまくいきません。 解決したい事は、 「abc*」といったように、前方が一致している文字列データを すべて抽出するといった処理です。 今は下記のようなプログラムを組んでいます。 Private Sub コマンド1_Click() On Error GoTo Err_コマンド1_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "クエリ1" DoCmd.OpenQuery stDocName, acNormal, acEdit If IsNull(テキストボックス) Then Else stLinkCriteria = "[クエリデータ]=" & "'" & Me![テキストボックス] & "'" End If DoCmd.ApplyFilter stDocName, stLinkCriteria Exit_コマンド1_Click: Exit Sub Err_コマンド1_Click: MsgBox Err.Description Resume Exit_コマンド1_Click End Sub これだと完全に一致しなければ抽出してくれません。 どの様に変更すればよいでしょうか? よろしくお願いします。

  • accessで、フォームの検索をしたいのです。

    今ACCESSで、データ管理をしているのですが、どうしてもうまくいかなくて、困っています。 毎日の出来事を記述するテーブル用のフォームを作って、記述していて、そのデータがたまってきています。 他のフォームに、検索用のテキストボックスとコマンドボックスを作って検索したいのです。 コントロールウィザードを使うと、完全一致のデータしかでてこないのですが、部分一致のレコードを表示させるにはどうすればいいのですか? 教えていただけるとうれしいです。 コントロールウィザードを使うと以下のようになります。多分少しどこかを変えるといいのではないかと思うのです。どうか、よろしくお願いします。 Private Sub コマンド144_Click() On Error GoTo Err_コマンド144_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = ChrW(21839) & ChrW(12356) & ChrW(21512) & ChrW(12431) & ChrW(12379) & ChrW(12513) & ChrW(12514) stLinkCriteria = "[内容]=" & "'" & Me![テキスト105] & "'" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_コマンド144_Click: Exit Sub Err_コマンド144_Click: MsgBox Err.Description Resume Exit_コマンド144_Click End Sub もしかして。。と思い、以下の部分、 stLinkCriteria = "[内容]=" & "'" & Me![テキスト105] & "'" を次のように変えてみたけれど、やっぱりうまくいきませんでした。 stLinkCriteria = "[内容]=" & "'" & "*" & Me![テキスト105] & "*" & "'" よろしくお願いします。

  • access レコードソースを選択し、DoCmd.OpenFormする方法

    Select Caseのフレームで、レコードソース(クエリ)を選択し、 そのソースを基にDoCmd.OpenFormする方法がわかりません。 よろしくお願いします。 ---------------------------------------------------- Dim strSource As String Dim Q1, Q2 As String Dim stDocName As String Dim フォーム1 As Form stDocName = "フォーム1" Q1 = "クエリ1" Q2 = "クエリ2" Select Case フレーム1 Case 1 strSource = Q1 Case 2 strSource = Q2 End Select 'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか? DoCmd.OpenForm stDocName, acFormDS ---------------------------------------------------- クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。 ですのでフォーム1には、対応するテキストボックスは用意してあります。

  • ACCESS レコードセット

    非連結フォーム(frm_B)のOPEN時にADOレコードセットでデータを表示させ、更新ボタンを押すと、追加クエリでそのフォーム上で表示されたデータをテーブル(tbl_B)に新規登録させ、さらにその非連結フォームには別のフォームの内容を表示させるVBAを書きましたが、最後に別のフォームの内容で非連結フォームにデータをセットしたとき?にテーブルのデータも更新されてしまいます。最初にテーブルに追加したデータとは切り離したいのですがどうすればうまくいくのでしょうか。 ・フォームfrm_BをOPEN 'DAOレコードセット Dim dbDAO As DAO.Database Dim rsDAO As DAO.Recordset Dim stSQL As String stSQL = "SELECT No.,規格No.,改訂No. FROM tbl_B " _ & "WHERE 規格No. ='" & Forms![frm_A].[規格No.] & "'" _ & "AND 改訂No. =" & Forms![frm_A].[改訂No.] & "" 'DAOレコードセット Set dbDAO = CurrentDb Set rsDAO = dbDAO.OpenRecordset(stSQL) Set Me.Recordset = rsDAO Me![No.].ControlSource = "No." Me![規格No.].ControlSource = "規格No." Me![改訂No.].ControlSource = "改訂No." 'DAOレコードセットクローズ Set rsDAO = Nothing Set dbDAO = Nothing ・更新ボタンクリック Private Sub cb_kaitei_Click() Dim stDocName As String   '追加クエリ stDocName = "q_B" DoCmd.OpenQuery stDocName, acNormal, acEdit Forms![frm_B].SetFocus Me![No.] = Forms![frm_A].[No.] Me![規格No.] = Forms![frm_A].[規格No.] Me![改訂No.] = Forms![frm_A].[改訂No.] ・ このときにレコードセットで追加したレコードのほうも更新されてしまいます。これを別のレコードと判断させたいのです。よろしくお願いします。

  • Access2000 ADOを使ってフォーム上のデータをテーブルに書き込む

    質問させていただきます。 帳票形式フォームの反復しているレコードをコマンドボタンのクリックでテーブルに書き込みたいので今朝からいろいろ試しているのですが、以下のコードを書いてみました(一部省略)。 DoCmd.RunCommand acCmdRecordsGoToFirst Do Until Me.NewRecord DoCmd.RunCommand acCmdRecordsGoToNext With RST RST.AddNew RST!日付 = Me![日付] RST!原料コード = Me![原料コード] RST!入庫数 = Me![発注数] RST!単価 = Me![単価] RST!金額 = Me![金額] RST!消費税 = Me![消費税] .Update End With Loop 結果は・・・テーブルには2行目から書き込まれる。「コマンドまたはアクション’次のレコードへ’は無効です」が出る。 どうすればエラーも出ず、フォーム上のすべてのデータが書き込めるでしょうか?

専門家に質問してみよう