お世話になっております。
業務上Access2000を使ってDBの構築をすることになりましたが、ひとつわからないことが出てきましたのでよろしくお願いいたします。
それは、フォームからデータを入力する際に「更新」ボタンを押して初めてテーブルに落とすようにしたいのですが、その方法がわからず困っております。
Accessの「ボタン」でレコード操作で変更を保存ボタンを設置させて試しても「保存」ボタンを押す前からデータがテーブルに落ちてしまっているようです。
これを、「保存」ボタンを押して初めてテーブルにデータが落ちるVBAでのロジックの組み方をどなたかよろしくお願いいたしす。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

FORMのモジュールレベル変数にDAO.Workspaceを宣言します。


Dim mws As DAO.Workspace

FORMのオープン時に、
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set mws = DBEngine.CreateWorkspace("", "admin", "", dbUseJet)
Set db = mws.OpenDatabase(CurrentDb.Name)
Set rs = db.OpenRecordset("table_name", dbOpenDynaset)
Set Me.Recordset = rs
mws.BeginTrans

保存ボタンで、
mws.CommitTrans

大体は、こんなかんじでいいのでは?
    • good
    • 0

Accessで入力画面を作成するのであれば、ワークテーブルを利用するのが


いいと思います。

mdbファイルを3つ作成し、
(1)プログラム用
(2)データベース用
(3)ワークテーブル用
とし、(1)のMDBファイルに、(2)と(3)のテーブルをリンクする形式にします。
(1)にフォームを新規作成し、(3)のテーブルを連結させます。
ただし、キー項目は、非連結にします。
(3)のテーブルと(2)のテーブルは同じ内容にして、
更新ボタンを押下したら、
ワークテーブルの内容をそのままデータベース用のテーブルに追加クエリー
のSQLを実行するのはどうでしょう。

キー項目を非連結にするのは、もし、既に入力しているデータがある場合に
キー項目の番号かIDを入力した時点で、内容を画面表示して、変更という
形式をとる為です。
この場合は、入力された番号かIDを検索して、データが存在しなければ
新規入力、データが存在すれば、訂正入力となると思います。

訂正入力の場合は、

dim SQL as string
Rem テーブルAはデータテーブル
Rem WテーブルAはワークテーブルとします。
sql = ""
sql = sql & "insert into "
sql = sql & "テーブルA "
sql = sql & "select * from WテーブルA;"
docmd.setwarnings false
docmd.runsql sql
docmd.setwarnings true
の追加クエリーを実行する前に
既に存在するデータを削除するSQL
sql = ""
sql = sql & "delete * from テーブルA "
sql = sql & "Where(キー=" & me![キー] & ")"
sql = sql & ";"
docmd.setwarnings false
docmd.runsql sql
docmd.setwarnings true
を実行する必要があります。
(キーが重複する為)
参考にしていただけるのであれば、
詳細のサンプルでもおくります。
ゴミならすみません!
    • good
    • 0

たぶんですけど・・・


テーブルのフィールドにA、B、Cとあったとします。
ウィザードを使用しないでフォームを作成してテキストボックスA、B、C
を作ります。
ABCとも関連付け無しですから更新の際にABCを変数に代入して、Recordsetで
テーブルに値を返すのかな?
※後で検索・修正出来るようにユニークなキーを必ず持たせるようにします。

実は入力系を作るときに私は、この方法を取っております。
ただし、私は専門家でもない一般人で初心者です。当然これが良い方法なのか
は、わかりません。
ただし、注意する点として入力フォームには、新規入力・同文入力・修正入力
等など・・・大きく分けても処理を3つ作成しなければなりません。
入力量が多ければ多いほど上記の方法は重くなると思います。
>ではでは
    • good
    • 0

単票型フォームの場合は、フォーム自体を非連結にしてフォーム上のコントロールの値をそれぞれテーブルに書き込んでいます。

OpenRecordsetでテーブルを直接編集しています。


帳票型フォームの場合は、tarankoさんと同じく、入力用のワークテーブルを使用して更新ボタンを押した時に、初めてホンモノのテーブルに書き込むという方法です。修正の場合はちょっと厄介ですけどね。修正前のデータを修正用のデータとは別に持っておいて、そのデータを元に削除、修正用のデータ(入力用のフォームに連結しているテーブル)で編集後、ホンモノに書き込みします。この場合は同じデザインのテーブルが3つ(ホンモノ、入力用、退避用)必要です。
    • good
    • 0

保存したいテーブル(Aとします)と全く同じテーブル(Bとします)


をもう一つ作ってください。
フォームから入力するとBのテーブルにデータが入力され、
更新ボタンを押すとAのテーブルに更新クエリーでデータを
更新するという方法ではいかがでしょうか。
Aのテーブルにデータを更新した後はBのテーブルの中身を
削除クエリーで削除する必要があります。

私はこの方法を取っています。

この回答への補足

早速のご回答ありがとうございます。
テーブルを2つに増やしてする方法もあるのですね(^^
教えていただいた方法で試してみますが、なんせDBのテーブル数が多いもので・・・
できましたらテーブルの数を増やさないでする方法はないのでしょうか?
わがまま言って申し訳ございませんm(_ _)m
よろしくお願いいたします

補足日時:2001/12/14 11:41
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QAccess フォームからの入力結果をテーブルにすることはできない?

Access フォームからの入力結果をテーブルにすることはできない?

使用しているのはWindows XP、Access 2003です。

とある調査結果をデータベース化する仕事を与えられています。
データ1件あたりの構成要素を一目で見れるようにするために「こういうレイアウトのフォームを作って」と上司からリクエストが出ています。

まず、今手元に集まっているデータについては、

Excelで一覧表作成 → Accessにインポートしてテーブル作成 → オートフォームでフォーム作成し、デザインビューでレイアウト変更

というふうにして、上司から言われたフォームは作りました。

今後、データは増えていくので、作ったフォームから新たにデータの追加をしていくことになるのですが・・・。

フォームからデータを追加しても、元となったテーブルにはリンクしませんよね?
とすると、データを追加した結果をテーブルにしたい場合はどうしたらいいのでしょうか?

今度は、そこからクエリを組む必要も出てくるため、テーブルにしたいのですが・・・。

Accessについては、以前勤めていた会社の研修で習っただけで詳しい使い方をずいぶん忘れてしまっています。今回、自分なりにいろいろ調べてはみたのですが、よくわかりませんでした。

もしかしたら、Accessの使い方を基本的に間違っているでしょうか・・・

よろしくお願いします。

Access フォームからの入力結果をテーブルにすることはできない?

使用しているのはWindows XP、Access 2003です。

とある調査結果をデータベース化する仕事を与えられています。
データ1件あたりの構成要素を一目で見れるようにするために「こういうレイアウトのフォームを作って」と上司からリクエストが出ています。

まず、今手元に集まっているデータについては、

Excelで一覧表作成 → Accessにインポートしてテーブル作成 → オートフォームでフォーム作成し、デザインビューでレイアウト変更

とい...続きを読む

Aベストアンサー

フォームを使って入力したデータは自動的にテーブル(一番下の行)に反映されます。

クエリはその都度、新しい情報にてデータの検索・並べ替えが行われますので
こちらも、自動的に反映されるといえます。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSのフォームからデータの追加ができない

現在Accessの基本を勉強中です。
テーブルを元にフォームを作成し、フォームから新しく名前や会社名などを直接入力し、追加できるようにしたいです。
ところがフォームから入力を行うと、内容が追加されず一番最初に登録した人の名前が書き換わるだけになります。
どのように新しくデータを追加できるようになるのでしょうか?
まったくの初心者なので、どの機能を使えばよいか戸惑ってます。
どうかよいご意見をお願い致しますm(__)m

Aベストアンサー

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォーム自体を入力専用にする
 (フォームのプロパティシートの『データ』タブで『データ入力用』を「はい」に設定:
  既存のレコードは表示されなくなります)
 ・レコード移動用のコマンドボタンを設置する
 (フォームをデザインビューで開き、ツールボックス(矢印や、新規のテキストボックス等を
  設置する際に使用するツールバー)の左から二番目にあるウィザードボタンが押された
  状態にして、新規コマンドボタンを設置すると、簡単に作れると思います)
といった方法があります。

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォー...続きを読む

Qクエリのデータをテーブルに入れたい

アクセス2000での話なんですけど、
クエリではじき出したデータをテーブルに保存したいんですけど、具体的にはどうすればよいのでしょう?
当方、超・超・超初心者なので詳しくお願いします。
わがままで、すみません。

Aベストアンサー

>クエリではじき出した

ということは、その「選択クエリー」(まぁ、普通のクエリーですね)をご自分で作られたわけですよね。
とすると話は簡単で、
その「選択クエリー」をデザインモードで開いて、そのときの画面上方のメニューに[クエリ]がありますから、そこから
(1)既存のテーブルに追加保存したい場合は「追加」を
(2)新規にテーブルを作って保存したい場合は「テーブル作成」を選択します。

各々、選択したときに保存対象とするテーブル名を訊いてきますので(1)なら既存のテーブル名、(2)なら新規に作成したいテーブル名を入力します。

こうすることで「選択クエリー」は「追加クエリー」または「テーブル作成クエリー」に変換されます。

大まかにはこういうことなんですが、その他の詳しいことはイルカ君に訊いてみてください。キーワードは「アクション クエリ」です。

QAccessでフォームからテーブルへ書き込む

Access2000 (初心者)
フォームからテーブルへ入力したいのですが、レコードソースが違う為入力出来ません。
DLookup("AA", "BB")で違うレコードから抽出出来る様に、違うレコードへ簡単に入力出来ないでしょうか?

Me.CC = DLookup("AA", "BB")
DLookup("AA", "BB") = Me.CC みたいに・・・

Aベストアンサー

出来るのは出来ますが・・・。
Access のヘルプを参照すれば、そこにヒントがあります。

UPDATE ステートメント

Sub UpdateX()
  Dim dbs As Database

  Set dbs = OpenDatabase("Northwind.mdb")
  dbs.Execute "UPDATE Employees " _
    & "SET ReportsTo = 5 " _
    & "WHERE ReportsTo = 2;"
  dbs.Close
End Sub

tab1:

ID__fld1
_1__AAA
_2__BBB

で、ヒントに基づいて、[tab1]の[ID]=1のレコードの[fld1]を'CCC'に更新してみましょう。

[イミディエイト]
? DbUpdate("tab1", "fld1", "'ccc'", "ID=1")
True

tab1:

ID__fld1
_1__ccc
_2__BBB

確かに[tab1]の[fld1]が更新されています。

DbUpdate(テーブル名, 列名, 値, 条件)

ですから Dlookup()と同じ感覚です。
で、この DbUpdate() はAccess の上記ヘルプのサンプルを単に関数にしただけ。
で、結局は、<違うレコードへ簡単に入力>は<一連の手続きの自動化>しかないということ。
で、<一連の手続きの自動化>は関数の役目ということです。

Public Function DbUpdate(ByVal tblName As String, _
             ByVal fldName As String, _
             ByVal strValue As String, _
             ByVal strWhere As String) As Boolean
On Error GoTo Err_DbUpdate
  Dim isOK As Boolean
  Dim dbs As DAO.Database

  Set dbs = OpenDatabase(CurrentDb.Name)
  dbs.Execute "UPDATE " & tblName & _
        " SET " & fldName & " = " & strValue & _
        " WHERE " & strWhere
  dbs.Close
  isOK = True
Exit_DbUpdate:
  DbUpdate = isOK
  Exit Function
Err_DbUpdate:
  MsgBox Err.Description & "(DbUpdate)"
  Resume Exit_DbUpdate
End Function

Microsoft DAO 3.6 Object Library を参照させる必要があります。

出来るのは出来ますが・・・。
Access のヘルプを参照すれば、そこにヒントがあります。

UPDATE ステートメント

Sub UpdateX()
  Dim dbs As Database

  Set dbs = OpenDatabase("Northwind.mdb")
  dbs.Execute "UPDATE Employees " _
    & "SET ReportsTo = 5 " _
    & "WHERE ReportsTo = 2;"
  dbs.Close
End Sub

tab1:

ID__fld1
_1__AAA
_2__BBB

で、ヒントに基づいて、[tab1]の[ID]=1のレコードの[fld1]を'CCC'に更新してみましょう。

[イミディエイト]
?...続きを読む

QACCESS フォームからサブフォームのデータを更新・入力したい

ACCESS フォームからサブフォームのデータを更新・入力したい

tbl_プロジェクトというテーブルにIDとプロジェクトコード、プロジェクトの基本情報を持たせ、f_プロジェクトフォームからプロジェクトコード、件名、契約日等のデータ及び、f_テーマサブフォームにテーマを入力できるようなフォームを作成しています。フォームで入力したものをそれぞれのテーブルに保存したいのですがうまくいかない部分があります。

フォームから入力すると、tbl_プロジェクトに所属する情報は更新されます。そのtbl_プロジェクトに所属するプロジェクトコードをサブフォームのtbl_テーマのプロジェクトコードにも反映したいのですがどのようにしたらよいでしょうか?
そういったことは可能でしょうか?分かりにくい説明で申し訳ないですが教えていただけると助かります。よろしくお願いします!



DBの構成
【テーブル】
tbl_プロジェクト (1件1件のIDとプロジェクトコードを持つ)
(フィールド:P_ID、プロジェクトコード、件名、契約日など)
tbl_テーマ(プロジェクト毎に関連のあるキーワードを持つ)
(フィールド:P_ID、プロジェクトコード、テーマ)←これのプロジェクトコードにtbl_プロジェクトのデータが入るようにしたい。
tbl_顧客(プロジェクトを依頼した顧客情報を持つ)
【クエリ】
q_テーマ(プロジェクト、テーマ、顧客を抽出するクエリ)
【フォーム】
f_プロジェクト (プロジェクトを1件ずつ表示・参照・新規作成するフォーム)
f_テーマサブフォーム (f_プロジェクトフォームのプロジェクトコードにづきテーマを
        表示・入力するサブフォーム)

リレーションはP_IDをキーに一対多で作成しています。

ACCESS フォームからサブフォームのデータを更新・入力したい

tbl_プロジェクトというテーブルにIDとプロジェクトコード、プロジェクトの基本情報を持たせ、f_プロジェクトフォームからプロジェクトコード、件名、契約日等のデータ及び、f_テーマサブフォームにテーマを入力できるようなフォームを作成しています。フォームで入力したものをそれぞれのテーブルに保存したいのですがうまくいかない部分があります。

フォームから入力すると、tbl_プロジェクトに所属する情報は更新されます。そのtbl_プロジェク...続きを読む

Aベストアンサー

No.4です。

前回の回答は、「レコードの新規登録」のみを想定していました(汗)
大変失礼致しました。


【「メインフォーム」-「サブフォームの新規レコード」間の不一致について】
(=No.4の補足での、2個目の「◆」の件)

メインフォーム側の「レコード移動時」イベントで、『プロジェクトコード』の
更新後イベントと同様の処理を行えば、解消すると思います。
(先頭1行が「Private Sub Form_Current()」となる他は、前回のVBAと全く
 同じなので、今回は省略します)


【既存レコードでの『プロジェクトコード』の空白について】
(=No.4の補足での、1個目の「◆」の件)

対処法としては、
 a)更新クエリを使用して、tbl_テーマの『プロジェクトコード』を一括更新
  (→tbl_テーマに入力済みの『P_ID』の再確認が不要な場合)
 b)「メインフォーム上のプロジェクトコードを、サブフォームの全レコードに
  一括代入」するためのコマンドボタンを、メインフォームに追加
  (→tbl_テーマの『P_ID』が正しいかを目視確認してから代入する場合)
の、2つの考え方があります。

「a」については添付画像をご覧いただくとして、ここでは「b」について説明
します。

メインフォームに『コード転記』コマンドボタンを作成したら、そのクリック時
イベントに以下のコードを記載して下さい:

Private Sub コード転記_Click()

  If MsgBox("サブフォームにプロジェクトコードを追記します", vbOKCancel, "確認") = vbCancel Then Exit Sub

  'サブフォームの全レコードを上書き更新
  With Me![サブフォームのコントロール名].Form.RecordsetClone
    Do Until .EOF
      .Edit
      !プロジェクトコード = Me!プロジェクトコード
      .Update
    Loop
  End With

  '更新を反映
  Me![サブフォームのコントロール名].Form.Refresh

  MsgBox "追記しました", , "確認"

End Sub


なお、「a/b」のどちらを採った場合でも、サブフォームの『P_ID』の上書き
編集に合わせて『プロジェクトコード』も連動して更新させるには、別途、
以下のような『P_ID』の更新後イベントでの対応が必要です:

Private Sub P_ID_AfterUpdate()
'メインではなくサブフォームの『P_ID』テキストボックスの更新後イベント

  If IsNull(Me!P_ID) Then
    Me!プロジェクトコード = Null
  Else
    Me!プロジェクトコード = DLookup("[プロジェクトコード]", "tbl_プロジェクト", "[P_ID]=" & Me!P_ID)
    '『P_ID』がテキスト型の場合は上記ではなく以下のコード
    'Me!プロジェクトコード = DLookup("[プロジェクトコード]", "tbl_プロジェクト", "[P_ID]='" & Me!P_ID & "'")
  End If

End Sub

また、この対応を組み込んで戴けば、

> テーマを修正するとフォーム上では10001が入力される。
> tbl_テーマには反映されない。

の件も解消すると思います。
(但し、別のレコードに移動したり、メニューから「レコード(R)→レコードの
 保存(O)」を選択する等して、レコードが保存してからでないと、テーブル
 には反映されないので、確認の際はご注意下さい)


・・・以上です。

No.4です。

前回の回答は、「レコードの新規登録」のみを想定していました(汗)
大変失礼致しました。


【「メインフォーム」-「サブフォームの新規レコード」間の不一致について】
(=No.4の補足での、2個目の「◆」の件)

メインフォーム側の「レコード移動時」イベントで、『プロジェクトコード』の
更新後イベントと同様の処理を行えば、解消すると思います。
(先頭1行が「Private Sub Form_Current()」となる他は、前回のVBAと全く
 同じなので、今回は省略します)


【既存レコードでの『プロジェクトコー...続きを読む

Qアクセスのフォームで入力日を自動で入力するには?

アクセスで商品管理を行いたいと思いますが、フォームで商品リストから選んだ商品を必要数量(別途個別入力)だけ発注処理を行う際に、入力を行った日付を各カードに自動的に入力する方法はないでしょうか? 教えてください。
todayのように開く度に変更がかかってしまうのは困ります。
よろしくお願いします。

Aベストアンサー

フォームデザインで日付テキストボックスのプロパティ → 規定値に =date() と入力しておく。

上記の方法では、ダメですか?

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess 同じデータをたくさんのレコード(同一列)に一度に入力するには

いつもお世話になっています。
Accessの基本的な入力に関して教えてください。
同じデータをたくさんのレコード(同一フィールド)に一度に入力するには、どうすればよいか教えてください。

Excelの列方向へのコピーと同じような感覚でできないのでしょうか?

よろしくお願いします。

Aベストアンサー

質問の回答にならないかも知れませんが・・・

1.EXCELでコピーするための元データを作成します
  ※仮にレコードが1000件ある場合はEXCELで1000行作ります。

2.Excelのデータをコピーします。

3.Accessのテーブルを開きます。

4.先頭レコードの貼り付けをしたい項目にカーソルを合わせます。(カーソルは白の十字)

5.下方向へドラッグし、項目を選択します。

6.貼り付けをします。

※貼り付けに失敗した場合、元に戻せませんので必ず元ファイルのコピーを取ってから行ってください

よろしければ、お試し下さい


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング