解決済みの質問
【大至急!!】【AccessVBAのレコード更新処理について・・・】【コイン500枚!...
jacktabeさん
【大至急!!】【AccessVBAのレコード更新処理について・・・】【コイン500枚!!】
AccessVBAのレコード更新処理ついて質問です。
レコードの更新処理方法が全く分かりません。(^^;)
今は、検索フォームで検索して、選択したレコードを更新するために更新用のフォームを作成しました。
そこで、更新フォームを開いた時(読み込んだ時)に各項目に連結はせずに、検索してきたデータが各項目に入っているように設定したのですが・・・・ちなみに「検索結果クエリ」には、検索画面で選択したNoのレコードが入るようになってます。(Forms]![検索フォーム]![選択No])
Dim mDB As Database
Dim mRST
Set mDB = CurrentDb
Set mRST = mDB.OpenRecordset("検索結果クエリ")
※ Me.テキストボックス名.SetFocus
Me.テキストボックス名.Text = mRST![項目名]※
※項目の数だけ同じ処理※
となっていますがこの時点で、実行時エラー'3061'パラメータが少なすぎます。1を指定ください。とでます。
その時点でまず分かりません(;;)このエラーのために検索結果クエリにもなぜかデータが入りません。
そしてこの後、実際にフォーム上で入力して変更などをした後、更新ボタンを押して更新がかかるようにしたいのですが・・・
一応、全体の流れとして
① 検索画面で選択したNoのレコードを更新フォームに表示
この時、検索結果クエリに代入されている値を更新フォームの各項目に代入
② 更新フォームで変更した後、更新ボタンを押す。
この時、更新フォームの内容が元であるテーブルに更新される という事を考えております。。。
非常に分かりずらい説明で申し訳ないですが、どうかよろしくお願いします。。
あと、私が今取り組んでいる更新方法よりも良い処理がありましたらそちらを説明していただいても構いません。
とりあえず、どうか、よろしくお願いします。。。
- 補足
- 早速のご回答、本当にありがとうございます。。。
後、大変申し訳ないのですが、この後の更新処理方法について、もしよければよろしくお願いします。
この質問は、活躍中のチエリアンに回答をリクエストしました。
-
- 質問日時:
- 2010/6/1 15:38:08
-
- 解決日時:
- 2010/6/2 17:29:04
-
- 回答数:
- 1
-
- お礼:
- 知恵コイン
- 500枚
-
- 閲覧数:
- 564
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
> 実行時エラー'3061'パラメータが少なすぎます。1を指定ください。とでます。
そのエラーが出たときに、[デバッグ]ボタンをクリックすると、VBエディタが表示され、コードのどこかが反転表示されると思いますが、それは
Set mRST = mDB.OpenRecordset("検索結果クエリ")
の部分ではありませんか?
VBA内で、DAOを使ってクエリを開く場合、パラメータクエリは使用できません。
パラメータクエリを開こうとすると、そのようなエラーが発生します。
(それ以外にも、クエリの元になるテーブルに存在するフィールド以外のものが、フィールドを記述するところに書かれていても、同じエラーが出ます。)
仮に、検索結果クエリが、テーブル1のレコードを抽出するもので、フィールド1という数値型フィールドの値が、フォーム上の選択№というテキストボックスの値に等しいレコードを抽出するのだとします。
その場合のコードは
Dim mDB As Database
Dim mRST
Dim SQL_Txt As String
SQL_Txt = "SELECT * FROM テーブル1 WHERE フィールド1=" & Forms!選択フォーム!選択№
Set mDB = CurrentDb
Set mRST = mDB.OpenRecordset(SQL_Txt)
のようになります。
パラメータクエリを使用できないので、VBA中でSQLを組み立てなければならないことに注意してください。
なお、選択№があるのと、同じフォーム中のイベントプロシージャに記述するのであれば
SQL_Txt = "SELECT * FROM テーブル1 WHERE フィールド1=" & Forms!選択フォーム!選択№
の部分は
SQL_Txt = "SELECT * FROM テーブル1 WHERE フィールド1=" & Me!選択№
と書くこともできます。
このように書いておけば、後でフォームの名前を変更したときに、コードを書きなおす必要がありません。
*追記*
> この後の更新処理方法について、もしよければよろしくお願いします。
特に問題なさそうですが、何かエラーが出ていますか?
Me.テキストボックス名.SetFocus
Me.テキストボックス名.Text = mRST![項目名]
と書かれているところのテキストボックスが、テーブルのフィールドをレコードソースにしていれば、これだけで(あとは、レコードを移動するなりフォームを閉じるなりすれば)、テーブルの内容が更新されると思います。
そうではなくて、もし、これらのテキストボックスは非連結で、フィールドをコントロールソースにしたテキストボックスが他にあるのなら、更新ボタンのクリック時イベントに
Private Sub 更新ボタン_Click()
Me.フィールドに連結したテキストボックス名 = Me.非連結のテキストボックス名
(テキストボックスの数だけ記述します。)
End Sub
で、値を代入すればいいと思います。このやり方だと、更新ボタンをクリックするまでは、テーブルの内容は更新されません。
蛇足ながら、この方法を採る場合は、フィールドに連結したテキストボックスは[可視]プロパティを「いいえ」にするなどしておきます。そちらに直接入力されるのを防ぐためです。
あと
Me.テキストボックス名.SetFocus
Me.テキストボックス名.Text = mRST![項目名]
の部分は
Me.テキストボックス名 = mRST![項目名]
でどうでしょう。
最初の書き方でも動作するのは確認しましたが、あえてフォーカスを移す必要はないと思いますし、代入先に Text プロパティを使用すると、入力できる文字数が少なくなる(2048文字しか入れられなくなる)という話もあるようですので、入力先がメモ型であるなら、要注意です。
- 違反報告
- 編集日時:2010/6/1 21:38:42
- 回答日時:2010/6/1 18:32:27
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。


質問した人からのコメント
もし、よろしければ別で質問を設けてありますので、そちらをお手数ですがよろしくお願いします。。