• ベストアンサー

VBA ACCESS 更新 追加 find ADO テーブル

いつもお世話になっております。 ACCESSのフォームに作成したコマンドボタンを実行すると 元テーブルから対象テーブルへIDを元に値を更新するようなプログラムを 作りたいと思います。 また、注意点として元テーブルでは「ID」、対象テーブルでは「管理番号」の異なる名称によりデータの管理を行っております。 アドバイスお願いします。 VBAの中でADO関数やFind関数を使ったら出来ると考えております。

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

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

関係ないかもしれませんが、前の質問は解決していますか? 自分がした質問をちゃんとファローしておかないと、まともに回答してくれる人が減りますよ。  http://oshiete1.goo.ne.jp/qa4804510.html さて、ご質問の件ですが、これは追加クエリで行うことができます。  クエリというのはSQL処理ですのでADOから、発行することもできます。 クエリを使わないでやる場合は、 1.元テーブルを開きレコードを一件ずつ参照し、 2.そのIDのレコードが、対象テーブルにあるかどうか調べ、 3.ない場合は新規レコードを作成する。 ということになります。 前回のコードを改造すると(未検証ですが)、 Dim CN As New ADODB.Connection Dim rsA As New ADODB.Recordset Dim rsB As New ADODB.Recordset Set CN = CurrentProject.Connection rsA.Open "元テーブル", CN, adOpenKeyset, adLockOptimistic rsB.Open "対象テーブル", CN, adOpenKeyset, adLockOptimistic Do Until rsA.EOF rsB.Filter = " 管理番号 = '" & rsA!ID & "'" if rsB.EOF then rsB.addnew rsB!管理番号 = rsA!ID rsB!名前 = rsA!名前 rsB!価格 = rsA!価格 rsB.Update End if rsA.MoveNext Loop rsB.Close: Set rsB = Nothing rsA.Close: Set rsA = Nothing CN.Close: Set CN = Nothing のような感じになると思います。 これが、クエリ(SQL)で処理すると、 Dim CN As New ADODB.Connection Set CN = CurrentProject.Connection CN.EXECUTE "INSERT INTO 対象テーブル(管理番号,名前,価格) SELECT 元テーブル.ID, 元テーブル.名前, 元テーブル.価格 FROM 元テーブル LEFT JOIN 対象テーブル ON 元テーブル.ID = 対象テーブル.管理番号 WHERE 対象テーブル.管理番号 Is Null" CN.CLOSE: SET CN = NOTHING になります。(これまた、未検証です。) レコード数が多くなってくるとパフォーマンスに大きな差が出てきます。(クエリのほうが有利です。)

関連するQ&A

  • Accessのテーブルの値を更新したい

    お世話になります。 Access2000のVBAで、教えて頂ければと思います。 下記の「テーブルA」がある状態で、 「ID=1」の「フィールド:名前」の値を「名称なし」に更新したいのですが、 どのようにVBAで記載したらよいでしょうか? ------テーブルA------- ID  名前 1 やまだ ----------------------- お手数ですが何卒宜しくお願いします。

  • ACCESSのFindコマンドが遅い

    ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。 そこでADOでFINDコマンドを使用しているのですが、かなり遅く困っています。 どのようにすれば、早くロック付きの更新ができますでしょうか? Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset cn.BeginTrans rs.Open "テーブル名", cn, addopenkeyset, adLockOptimistic rs.MoveFirst strKey = "ankKey = 'aaa'" rs.Find strKey rs.ankA = "あ" rs.Update cn2.CommitTrans キィを変えてLOOPさせ更新させていると 複数ステップのOLE DBの操作でエラーが発生しました。各OLE DBの状態の値を確認してください。作業は終了しませんでした。 のエラーになります。 1行1行みてみると異常にFINDが遅いものがあり、これが原因でないかと思うのですが、 どのようにロック付きの更新を変更すればいいのかがわかりません。 どのように変更すればいいのでしょうか?

  • アクセスで同一テーブル内へのデータの追加

    こんにちは。Access2000を使用しています。 「顧客テーブル」には「お買上げ年度」と「顧客名」フィールド があります。 「お買上げ年度」= "2007"の顧客を、「お買上げ年度」 = "2008" として「顧客テーブル」内に追加したいのですが、一度仮テーブル やCSVファイルにデータを退避することなく、クエリやVBA(ADO)で 対応することは可能でしょうか?(=同一テーブル内への追加クエリ を実行したい。)よろしくお願いいたします。

  • Find系メソッド、Findメソッドに相当するワークシート関数または、VBA関数は?

    Excelのワークシート関数または、VBA関数で、DAOのFind系メソッドやADOのFindメソッドに相当する機能はありますか? (Forループで回せば似たようなことはできるのですが、非効率なので・・・) # 表計算とRDBは別物ってツッコミはなしということで。(^^;

  • accessのVBAでテーブル更新するには・・・?

    [input]フォームより「登録」ボタンを押すことで [data]テーブルの[氏名][住所][電話番号][年齢][性別][コメント]フィールドを更新する動作をVBAだけでさせたいです。 このボタンだけで新規登録と更新登録ように既存データの氏名と住所を参照して入力されたデータが既存なのかを確認するようにしたいです。 dim dbs as database をつかってSQLを書き込んでいけばいけるような気がするのですが どうもうまくいきません。 よろしくお願いします。

  • 非連結のフォームからテーブルにデータを追加する

    アクセスにおいて フォームの非連結のテキストボックスから テーブルにデータを追加するには VBAのADOを学ぶしかないのでしょうか? ADOを使わなくても 追加クエリ等を使えば、対応できますか? よろしくお願い致します。

  • あるテーブルの内容を基準にして違うテーブルを更新するSQL文

    教えて下さい。 あるテーブルに下記の内容があります。 ID│名称 ─┼─── 1│花 2│木 3│水 もうひとつのテーブルには、 ID│名称 ─┼─── 1│海 3│水 4│空 となっています。 最初のテーブルの全レコードを対象に、最初のテーブルのIDと同じ値がもうひとつの テーブルにある場合、もうひとつのテーブルをUPDATEし、存在しなければINSERTしたい です。 結果を ID│名称 ─┼─── 1|花 2│木 3│水 4│空 を期待しています。 このようにするSQL文を教えていただけませんでしょうか。 よろしくお願いします。

  • アクセス VBAでレコードが追加できない

    お世話になります。 フォームのボタン(コマンド1)をクリックして テーブルにレコードを追加したいのですが、うまくいきません。 SQLの引数value('intNumber')を実数(例えば'3')とかにすると うまく1レコード追加されるのですが、新規レコードとして 連番で追加させたいので困っています。 宜しくお願いします。 Private Sub コマンド1_Click() Dim dbDao As DAO.Database Dim stSql As String Dim intNumber As Integer intNumber = DMax("[管理ID]", "[テーブル名]") + 1 Set dbDao = CurrentDb stSql = "insert into テーブル名 (管理ID,管理2,管理3) values ('intNumber','99999','99999');" dbDao.Execute stSql dbDao.Close: Set dbDao = Nothing End Sub

  • Access2003 VBAからの値の代入時に更新イベントを実行できない??

    access2003+WinXP_Pro環境です。 値の代入について質問させて頂きます。 フォーム上の値を同時に、開いている他のフォームから値を代入したのですが、 元フォーム上で更新時イベントに記述している値の代入が動作しません。 他のフォームのVBAから値の更新をした場合、どのように更新時イベントを設定すればよいのでしょうか?

  • ACCESS VBAで画面からの更新

    ACCESS VBAの画面からの更新をしようとしています。 レコードソースで直接クエリを参照させている項目は表示された値を修正すれば そのままテーブルの値も修正できます。 しかし、コントロールソースにDLookUpを使って表示した項目を修正しても テーブルの内容が更新されません。 即時更新されるようにするにはどうのようにすればよいのでしょうか?