ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Microsoft Office AccessコミュのACCESSでのフォーム作成についての質問

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ACCESSでのフォーム作成についてお聞きしたいことがあります。

ACCESS初心者なので、おかしな事を言っている所があるかもしれませんが、間違いがありましたらご指摘お願いします。

フォーム(フォームAとします)を開く際に特定のレコードを表示させたいのですが、「DoCmd.OpenForm stDocName, , , 」後のwhere句の表記方法がわかりません。(stDocNameにはフォーム名を先で代入しております)

データの体系としては・・・
テーブル :ID(Integer)、日付(date)、他数項目
(同IDで日付違いのレコードがいくつかあります)
フォームA:上記テーブルの全項目を表示
フォームB:ID(Integer)
(既にテーブルに存在する値(ID)をコンボボックスより選んでもらう)
クエリ  :ID(Integer)、日付(date)
(テーブルよりIDごとに最新日付のものを抽出し、IDのみ表示する。フォームBのコンボボックスに使用)

フォームの仕様は・・・
フォームBで値(ID)を選ぶと、既に抽出されたクエリによりIDごとの最新日付がわかっているので、そのIDと最新日付によりテーブルから同じレコードを検索し、フォームAに表示させたいと思っています。

where句に指定するのは「コンボボックスより指定されたクエリのID・日付=テーブルのID・日付」だと思うのですが、表記方法がわかる方いましたら教えてください。
ちなみに、フォームBでのID検索実行時に「DoCmd.OpenForm stDocName, , , (Me!ID = テーブル名.ID) And (Me!日付 = テーブル名.日付)」と指定したのですが、「オブジェクトが必要です」というエラーになってしまいました。

考え方が間違っていたり、もっと良い別の方法がありましたらご指摘ください。

よろしくお願いします。

コメント(13)

フォームBで開かせるときの必要レコードを抽出するクエリを作り、フォームAのレコードソースをそのクエリにする、っていうのはどうでしょう?

クエリにはフォームBで検索する条件を組み込むものになりますが…
早速の返答ありがとうございます。
実はこの後続処理で、上記によって表示されたレコードで良いかどうか返答を求め、Yesであればその表示されたレコードを複製するという処理をしています。
複製したレコードをフォームAに表示させ、修正し、修正したレコードをどんどんテーブルに保存して履歴を残すということを最終的にやりたいと思っています。
ですので、できればテーブルをフォームAに表示させたいのです。
クエリをフォームAに表示させて、レコード複製・修正をテーブルに反映させるのであれば良いと思うのですが、それが可能であっても私にはそれは難しすぎるのではないかと・・・
ですので、何とかフォームBで選択したIDと同レコードにある日付の2つの値を元にしてテーブルよりそのレコードをフォームAに表示させる方法がないかと探しています。
色々本を読んだところ、SQLのWHERE句を「DoCmd.OpenForm stDocName, , ,」の後に指定するとあったので、下記のようにして実行してみましたが、「OpenFormアクションの実行はキャンセルされました」というエラーになってしまいました。
何が違うのか更にわからなくなってきてしまいました・・・

IDfill = Me!ID検索コンボ
datefill = Me!日付の最後
DoCmd.Close ’フォームBを閉じる
stDocName = "テーブル名"
DoCmd.OpenForm stDocName, , , "(テーブル名.ID = " & IDfill & ") And (テーブル名.日付 = " & datefill & ")"

(IDfill=コンボボックスで選択したID 、datefill=IDfillと同レコードの日付:クエリにより抽出された最新日付)
「DoCmd.OpenForm stDocName, , ,」っていうのは、いわゆる、イベントプロシージャですよね?であれば、VBAかと思うのですが…もちろんそのなかにSQL文を書くこともできますが、文章で書くほうが得意なのであればいいのですが、そうでなければクエリとマクロで組み合わせてできるのではないかなと思います

わたしの認識が間違っていたらごめんなさい

抽出するテーブルが1つなのであれば、抽出条件をクエリにしてしまって、そのクエリを元に、一旦修正用?のテーブルを作成させてしまって、それを開くようにし、修正したら、そのレコードを元のテーブルに足すクエリとマクロでいけるのではないかな〜と思ったのですが、うまくわたしがぴょんさんのやりたいことをくみとっていませんでしたらごめんなさい…
ちょっと出先で確認できないのですが、、
 
まずは、日付は日付型なので
") And (テーブル名.日付 = #" & datefill & "#)"
としては如何でしょう。
 
それとDoCmd.Closeで処理が止まってしまうでしょう。
それが原因かどうかは分かりませんが、確認のためにDoCmd.Closeを一旦コメントアウトしておくのは如何でしょう?
それでちゃんと動いたら、WHERE区はあっているということですね。
 
私が同じような処理をしたときは、フォームA側で処理が終わったところにフォームBを閉じるように記述していました。
皆さんありがとうございます!!
上記を参考にしたら何だか少し形に出来そうな気がしてきました。
明日挑戦してみます!!
上記を参考にして実行してみました。
DoCmd.Close処理をフォームA処理終了後に移動させ、抽出条件をクエリにし、そのクエリでテーブルを作成するようにし、それをフォームAで開くようにしました。。。が、クエリの抽出条件の指定がおかしいらしく、うまく抽出してくれません。フォームBのコンボボックスから選んだ値(ID)をクエリで使うことはできないのでしょうか?
ここさえ出来れば、とりあえずは一応動くものが出来るのですが・・・ずっとこの特定レコードのフォーム表示でつまづいてます・・・
現在の抽出条件は↓こうなってます。

[Forms]![フォームB]![ID検索用コンボ]
(クエリでは、IDごとの最新日付レコードを抽出し、更にコンボボックスに選択されたIDとイコールのものを抽出しようとしています)
ん?意味を捉え間違えていたかも。。
ソースが見たいですね。。

> DoCmd.Close処理をフォームA処理終了後に移動させ、
> 抽出条件をクエリにし、そのクエリでテーブルを作成する
> ようにし、それをフォームAで開くようにしました。。。

えと、テーブルを作成?行を追加ではなくて??
フォームが開く前に、テーブル・ビュー作成済んでいないとうまく表示されないです。
すみません、上記は、「DoCmd.OpenForm stDocName, , ,」で行き詰まってしまったので、3でアドバイスをいただいたようにクエリを作成して一旦テーブルに抽出させて・・・というようにしようとこころみてみていました。
が、結局行き詰まり、色々な方に聞いていましたところ、他の方からもうひとつアドバイスをいただいていたのでそちらを検討中です。
現在は下記のようなソースになっています。
--------------------------------------------------------
stWhere = "ID=" & Me!ID検索用コンボ.Column(0)
stWhere = stWhere & " AND 日付=#" & Me!ID検索用コンボ.Column(1) & "#"
stDocName = "フォームA"
DoCmd.OpenForm stDocName, , , stWhere
--------------------------------------------------------
Column(0):コンボボックスにより選択されたID
Column(1):コンボボックスにより選択された日付

これが出来るようであれば、フォームの仕様は最初の仕様と同じにしようと思っています。
が、今実行すると「OpenFormアクションの実行はキャンセルされました」というエラーになり、何がいけないのか検討中です。
なんとか出来ました!
皆さんアドバイス本当にありがとうございました!!
これからもっとACCESS勉強します!
はじめてかきこみます。
Access をつかいはじめて2ヶ月くらいなので、Visual Basic はまったくわかりません。どうにかマクロとクエリで乗り切っている状態です。イギリスに引っ越すまでAccessなんて聴いたこともなかったので、てこずっています。
日本語版のAccessを見たことがないので、うまく説明できないかもしれないんですけど、行き詰っているので、助けてください。
顧客との接触暦を4種類に分けて、リポートをつくりました。

フォームに Option button で選択肢が4つあります。
その枠の中に Command を2つおいて、Preview と Print outのマクロをつけました。
その際4つうちのひとつの Option Button を選んで Preview の Command button をクリックすると選択したリポートがみれるという風にしたいんですけど、できません。
各 Option Button はそれぞれ Value 1,2,3,4としました。
Conditional Macro を使ってやってみましたけど、だめでした。
皆さんはどうしていますか?
皆さんの質問を読んでいると私の質問はとても簡単なものに思えます。どうしてできないのでしょう?
こんにちは^^
Mieさんその後うまくできましたか?
Conditional の部分はなんと記述しているのでしょうか。

条件の列に
[Forms]![F_test]![オプショングループ名]=1

アクションの列に
レポートを開く

とすれば1が選択されている時にレポートが開くと思いますが。
ももちさん、
なるほど条件の列にオプショングループ名を使うんですね。
私はいきなりオプションボタン名を入れていました。
早速やってみます。
アドバイスありがとうございます!
ももちさん!
いかのように、グループ名をConditionに入れたところ、機能するようになりました!
Condition                   Macro   
[Forms]![Report choice]![Frame66]=1 OpenReport-preview
[Forms]![Report choice]![Frame66]=2 OpenReport-preview
[Forms]![Report choice]![Frame66]=3 OpenReport-preview
[Forms]![Report choice]![Frame66]=4 OpenReport-preview

ありがとうございます。
これからも、このような初歩的な質問をすると思いますが、よろししくお願いいたします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Microsoft Office Access 更新情報

Microsoft Office Accessのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング