ちょっと変わったマニアな作品が集結

よろしくお願いします。

Access2010を使っています。
メインフォームにあるテキストボックス2つに条件を入力し、
抽出したデータをサブフォームで表示させたいと思います。

●メインフォーム名「フォーム1」
テキストボックス2つ「tex1」「tex2」

●データ元クエリ「q1」
フィールド名「ID1」「ID2」「Name」

●サブフォームSQL
SELECT q1.Name
FROM q1
WHERE (((q1.ID1) = Forms![フォーム1]!tex1) And
((q1.ID2) = Forms![フォーム1]!tex2)));


フォームを開き、tex1とtex2に入力してもサブフォーム表示が変わりません。
サブフォームをデータシートで別に開くと、データ抽出できていることは確認できました。

サブフォームのコントロールソースへSQLを入力するだけでは、
メインフォーム内でのデータは反映されないんでしょうか??

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

A 回答 (1件)

>サブフォームをデータシートで別に開くと、


>データ抽出できていることは確認できました。

の部分がよくわかりませんが。


普通は、たとえば、
メインフォームにボタンを一つ
設定し、そのボタンのクリックイベントで、

Private Sub コマンド0_Click()
Me!埋め込み0.Requery
End Sub

のように設定します。
ここで、「埋め込み0」というのはメインフォームの
デザインビューでサブフォームを表示するために
設定するコントロールのことで、サブフォーム
そのもではありません。初期値は「埋め込み0」
のような名前になっています。サブフォームと
同じ名前に設定しているならば、「埋め込み0」
のところをサブフォームと同じ名前に置き換えても
かまいません。


そのほかには、「tex2」の更新後処理に同様に、

Private Sub tex2_AfterUpdate()
Me!埋め込み0.Requery
End Sub

のように設定してもいいのですが、この場合には
「tex2」に入力後、一旦フォーカスを移動させる
必要があります。たとえば「tx1」にマウスを
移動させてクリックするとか。それによって
「tex2」の更新後処理が起動されます。
    • good
    • 0
この回答へのお礼

複数の処理方法を教えていただきありがとうございます。

いずれも方法でもサブフォームが更新されることを確認しました。
どうもありがとうございました!

お礼日時:2013/06/12 21:34

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

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

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

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

このQ&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 2003でサブフォームが更新されません。

リストボックスの値を変更すると、サブフォームが更新されるようにしたいのです。
サブフォームのレコードソースはクエリから引用しています。

Dim db As Database
Dim qry As QueryDef
Set db = CurrentDb
Set qry = db.QueryDefs("計画クエリ")
qry.SQL = newSQL
qry.OpenRecordset
qry.Close
db.Close
Set db = Nothing

Me!計画クエリのサブフォーム.Form.Requery

という形で、更新しようとしても更新されません。詳しい方教えてください。

Aベストアンサー

確認したところ、クエリのSQL文の更新は、その前に開かれていた
フォームに対しては反映されないようです。
(レコードソースにクエリが指定されている場合、クエリそのものを
 使用しているというより、そこに記述されたSQL文が使用されて
 いる、ということかもしれません)

解決策としては、レコードソース(RecordSource)の再設定、という
ことになるかと思います。
とりあえず、運用上「計画クエリ」のSQL文が、現在のサブフォームのSQL分と
整合性を求めるかどうかで、2通りの対処が考えられます。

【解決策1:「計画クエリ」のSQL文を連動させる必要がある場合】
計画クエリのSQL文を差し替えた後に、レコードソースに同クエリを
再設定します。

Dim db As DAO.Database, qry As DAO.QueryDef

Set db = CurrentDb
Set qry = db.QueryDefs("計画クエリ")
qry.SQL = newSQL
'ここではレコードセットを開く必要はないので、そのまま閉じます
qry.Close
'CurrentDbの場合、Closeは不要(無効)かと思います(多分(汗))
Set db = Nothing

Me!計画クエリのサブフォーム.Form.RecordSource = "計画クエリ"


【解決策2:「計画クエリ」のSQL文を連動させなくてもよい場合】
フォーム・サブフォームのレコードソースには、テーブルやクエリだけでなく、
SQL文も指定可能なので、計画クエリのSQL文は変更せずに、
レコードソースを直接編集します。
こちらの場合、切替に要するコードは1行だけです。

Me!計画クエリのサブフォーム.Form.RecordSource = newSQL


・・・以上です。

確認したところ、クエリのSQL文の更新は、その前に開かれていた
フォームに対しては反映されないようです。
(レコードソースにクエリが指定されている場合、クエリそのものを
 使用しているというより、そこに記述されたSQL文が使用されて
 いる、ということかもしれません)

解決策としては、レコードソース(RecordSource)の再設定、という
ことになるかと思います。
とりあえず、運用上「計画クエリ」のSQL文が、現在のサブフォームのSQL分と
整合性を求めるかどうかで、2通りの対処が考えられます。...続きを読む

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と全く
 同じなので、今回は省略します)


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

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

Q親フォームからサブフォームのレコードソースを設定

親フォームからサブフォームのレコードソースを設定するには?
フォーム1にテーブル1をドロップアンドドラッグして、「テーブル1のサブフォーム」を作成しました。

フォーム1にあるコマンドボタンから「テーブル1のサブフォーム」のRecordSourceを設定する方法を教えてください。

「テーブル1のサブフォーム」からなら
Private Sub Form_Load()
Me.RecordSource = ""
End Sub

とできるのですが、
やりたいことはフォーム1からのイベントなので
「テーブル1のサブフォーム」からのイベントは使えません。

だからってフォーム1の
Private Sub コマンド2_Click()
Me.テーブル1のサブフォーム.RecordSource = "テーブル1のサブフォーム"
End Sub

とするとコンパイルエラーになります。

良い方法があれば教えてください。アドバイスよろしくお願いします。

Aベストアンサー

No2です。説明もれがあったので追加しておきます。
No2のところで、

>このとき、「テーブル1のサブフォーム」
>のフィールドには「#Name?」のような表示がされていると
>思います。すなわちこときはサブフォームにはレコードソースが
>設定されていないからです。

としていますが、「#Name?」と表示される理由はフィールドの
コントロールソースが設定されているために、「#Name?」のような
表示が出てきます。


ここからは蛇足ではありますが、コントロールソースが設定されていなければ
こうした表示はでませんが、もしコントロールソースも取り除いて
いるならば、コマンド1でもコマンド2のクリックイベントでもどちらでも
かまいませんが、たとえば「テーブル1のサブフォーム」の
フィールドのコントロールソースをすべて取り除いておいて、
コマンド2のクリックイベントで設定するとすれば、一応
「テーブル1のサブフォーム」のフィールドの名前をID、名前、住所として
テーブル1のフィールド名を同じくID、名前、住所とするならば、

Private Sub コマンド2_Click()
Me.テーブル1のサブフォーム.Form.RecordSource = "テーブル1"
Me.テーブル1のサブフォーム.Form.Controls("ID").ControlSource = "ID"
Me.テーブル1のサブフォーム.Form.Controls("名前").ControlSource = "名前"
Me.テーブル1のサブフォーム.Form.Controls("住所").ControlSource = "住所"
End Sub

として、レコードソース、コントロールソースを設定します。

No2です。説明もれがあったので追加しておきます。
No2のところで、

>このとき、「テーブル1のサブフォーム」
>のフィールドには「#Name?」のような表示がされていると
>思います。すなわちこときはサブフォームにはレコードソースが
>設定されていないからです。

としていますが、「#Name?」と表示される理由はフィールドの
コントロールソースが設定されているために、「#Name?」のような
表示が出てきます。


ここからは蛇足ではありますが、コントロールソースが設定されていなければ
こうした表示はで...続きを読む

QAccess 別フォームへの再クエリ(更新)がしたい。

宜しくお願いします。

仕様環境:WinVISTA Access2007

別フォームから別フォームへの再クエリの仕方を教えてください。

画像を貼らせて頂きます。
まず、後ろのメインフォームから新規作成ボタンを押して、
別のフォーム(作成画面)を開きます。
そこに新しいデータを入力して、閉じますと、
そのままではメインフォームには反映しません。
(テーブルには反映していますが)

別フォーム(新規の作成画面)に再クエリをかけても
そのフォームが更新させるだけで、メインフォームに変化はありません。

ちなみにメインフォームに作った更新ボタン(中身は再クエリ)を押すと反映されます。

どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか?


やりたいことは別フォームのOKボタン(画像参照)を押すと
別フォームが閉じると同時にメインフォームが再クエリ(更新)されるとベストです。
(今のところOKボタンの中身は”閉じる”のマクロだけです)

構造は簡単で恐縮ですが、
テーブル:Tメイン
フォーム:メインフォーム
     作成画面フォームetc..

です。
クエリはメインフォーム自体にクエリビルダを使っていますが、
特別な施しなどはしていません、うまく動作しないところがあって、
いろいろ調べていてそうすると改善すると書いてあったので。。

ちなみにテーブルには「日付」の後順で並び替えをかけています。

当方、VBAに弱いのでマクロで操作できるのでしたらお願いします。
マクロで出来ないものでしたらVBAを教えて頂ければ、
イベントプロシージャに書き込みます。

大変恐縮ですがお知恵をお貸しください、宜しくお願いします。

宜しくお願いします。

仕様環境:WinVISTA Access2007

別フォームから別フォームへの再クエリの仕方を教えてください。

画像を貼らせて頂きます。
まず、後ろのメインフォームから新規作成ボタンを押して、
別のフォーム(作成画面)を開きます。
そこに新しいデータを入力して、閉じますと、
そのままではメインフォームには反映しません。
(テーブルには反映していますが)

別フォーム(新規の作成画面)に再クエリをかけても
そのフォームが更新させるだけで、メインフォームに変化はあり...続きを読む

Aベストアンサー

連投すみません。
・・というか、私も「削除されました」というのを見て一旦中止してました。
(中止した場合も含めて、回答はメモ帳で保存しているので無事でしたが)

> どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか?

マクロの場合は、「オブジェクトの選択」アクションで対象フォームを選択した後、
「再クエリ」アクションを行えばOkです。
なお、「作成画面」フォームも連結フォーム(レコードソースが指定されたフォーム)と
いう前提で作成しました。

【1行目】
アクション: 閉じる
  オブジェクトの種類: フォーム
  オブジェクト名: 作成画面
  オブジェクトの保存: 確認
  ※今回の内容・順序では、オブジェクトの種類と名前は空白でも可。
   (指定なしの場合、現在のフォームが閉じられるので)
【2行目】
アクション: オブジェクトの選択
  オブジェクトの種類: フォーム
  オブジェクト名: メインフォーム
  データベース ウィンドウ内: いいえ
【3行目】
アクション: 再クエリ
  コントロール名: (空白のままにします)

<解説>
メインフォームを再クエリする前に、作成画面側のデータを保存してやる必要が
あります。
ここでは、「閉じる」アクションによって、実質的なレコード保存を行っています。
順序を逆(オブジェクトの選択→再クエリ→閉じる)では、メインフォームには
反映されないのでご注意下さい。

連投すみません。
・・というか、私も「削除されました」というのを見て一旦中止してました。
(中止した場合も含めて、回答はメモ帳で保存しているので無事でしたが)

> どうしたら別フォームから後ろのメインフォームを再クエリ(更新)できるのでしょうか?

マクロの場合は、「オブジェクトの選択」アクションで対象フォームを選択した後、
「再クエリ」アクションを行えばOkです。
なお、「作成画面」フォームも連結フォーム(レコードソースが指定されたフォーム)と
いう前提で作成しました。

【1...続きを読む

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

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
とすれば良いでしょう。

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

Qサブフォームに対してGoToRecordするには?

フォームに対してRequeryすると先頭のレコードへ移動してしまうので
Requeryする前のレコードの番号を取得して
Requery後にそのレコード番号へ移動したいのですが

Sub test()
i = Forms("Form").Controls("SubForm").Form.CurrentRecord
Forms("Form").Controls("SubForm").Requery
DoCmd.GoToRecord acActiveDataObject, Forms("Form").Controls("SubForm"), acGoTo, i
End Sub

これをすると、実行時エラー2498
指定した式は、いずれかの引数とデータ型が対応していません。
になりますが、
どこがおかしいのでしょうか?

Aベストアンサー

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現状・例2>
  Forms("Form").Requery
 <現状・例3>
  Forms("Form").Controls("SubForm").Form.Requery
 <代替策>
  Forms("Form").Controls("SubForm").Requery
  ※「現状・例3」との違い(→途中の「.Form」の有無)に注意。


【詳細】
> 実行時エラー2498

このエラーの直接の原因は、GotoRecordメソッドの第2引数に指定している
「Forms("Form").Controls("Subform")」の部分です。

ここに指定するのはオブジェクト名になりますが、そのデータ型は文字列型です。
一方、「~.Controls(~)」の形で指定した場合、取得できるのは
 a)オブジェクトそのもの
 b)そのオブジェクトのデフォルトプロパティ
のどちらかです(→状況によって変化します)。
(例えばテキストボックスなら、TextBoxオブジェクトまたはValueプロパティの値)

サブフォームのデフォルトプロパティは調べていませんが(汗)、少なくとも文字列
型のプロパティではないため、「型が一致しない」とのエラーとなります。
サブフォームのコントロール名を取得する場合は、
  Forms("Form").Controls("SubForm").Name
というように、Nameプロパティを明示的に指定する必要があります。

ただ、「サブフォームのレコード移動」の場合、明示的に「Name」プロパティを
指定しても解決には至りません(汗)
これは、GotoRecordメソッドの第2引数には、直接開いているオブジェクトの
名前のみが有効なためで、サブフォームを直接的に指定することはできない、
ということです。
(注:Microsoftの資料を探したわけではなく、経験則から記述していますので、
 私の勘違いでしたらご容赦願います(汗))

サブフォームのレコード移動には、冒頭に記述したとおり、「フォーカスの移動」と
「一部の引数を省略したGotoRecord」を使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

なお、これも冒頭に書きましたが、サブフォームのRequeryの仕方には幾つか
方法がありますが、Requeryの対象を「コントロールとしてのサブフォーム」にすれば、
レコード移動が発生しませんので、GotoRecord自体が不要になります。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsFrmHowToRequeryAndReturn.html

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現...続きを読む

Qアクセスのフォームのビューが表示されないのですが、

Accessでフォームを作っているのですが、クエリを元にウイザードで作成。デザインビューではちゃんと文字が出ているのに、データシートビューでも1行目に項目が出ているのに、フォームビューは壁紙だけなんですが、何が原因なのでしょうか? 同じ作り方で出来る物もあるのですが、アクセスは初心者です。本を見てもわからないのですが、教えて下さい。よろしくお願い致します。
参考になるURLがあれば、それも教えて頂きたいです。

Aベストアンサー

> データシートビューでも1行目に項目が出ているのに、フォームビューは壁紙だけ

表示されるレコードがなく、追加もできない(=新規レコードの枠が表示されない)状態
の場合、フォームビューの詳細領域にあるコントロールは、全て表示されなくなります。

これはAccessがそういう仕様になっているようなのでどうしようもないのですが、
詳細領域ではなくフォーム ヘッダ/フッタに設置したコントロールであれば表示は
されるので、表示レコードがない場合にも表示が必要なコントロール(フォームを閉じたり
表示を切り替えるコマンドボタンや、フォームの抽出条件を指定するテキストボックス等)
はフッタ/ヘッダに移動する、といった回避方法があります。

フォーム ヘッダ/フッタを表示するようにするには、フォームをデザインビューで開き、
メニューで「表示(V)→フォーム ヘッダ/フッタ(H)」を選択します。
ヘッダのみ、またはフッタのみ必要な場合は、不要な方の下端にマウスポインタを
合わせて、水平な線と上下矢印を組み合わせた形になったところで、マウスをクリック&
ドラッグして下さい。


※本来表示させるレコードがない状態で、詳細領域のコントロールを強引に表示させる
  には、フォームのプロパティシートの『データ』タブで、『レコードセット』の設定を
  「ダイナセット (矛盾を許す)」にするという手もあります。
  但し、変な形でレコード編集がされてしまう危険性が生じますので、お勧めはできません。


参考までに、以前の回答へのリンクも載せておきます:
http://oshiete1.goo.ne.jp/qa3371589.html
http://oshiete1.goo.ne.jp/qa3028994.html

> データシートビューでも1行目に項目が出ているのに、フォームビューは壁紙だけ

表示されるレコードがなく、追加もできない(=新規レコードの枠が表示されない)状態
の場合、フォームビューの詳細領域にあるコントロールは、全て表示されなくなります。

これはAccessがそういう仕様になっているようなのでどうしようもないのですが、
詳細領域ではなくフォーム ヘッダ/フッタに設置したコントロールであれば表示は
されるので、表示レコードがない場合にも表示が必要なコントロール(フォームを閉じたり
...続きを読む


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

人気Q&Aランキング