Access97でサブフォームを使用したフォームを作成しています。

サブフォームの明細行の最後に新規レコード行がありますよね。
サブフォームの初期表示時に、この新規レコード行にカーソルを位置付けたいのですが、
Docmd.GoTORecord,,acNewREc とやると、新規レコード行がサブフォームの
最上部にいってしまい、その前にある既存レコードが見えなくなってしまいます。

理想は、サブフォームの1ページが10明細分の大きさで獲ってあるとすると、
新規レコード行を10行目に表示されるようにもっていきたいのですが、
サブフォームに対してこのような制御は可能なのでしょうか。

RecordCountを操作したりしてやってみたのですが、既存レコードの件数によって、
うまくいったりいかなかったりです。

よろしくお願いします。

A 回答 (2件)

私も同じことで悩んだことがあります。

そのときの結論ですが、

(1) 一番簡単なのは、
サブフォームのビューをデータシートにすれば新規レコードに移動しても10行表示されます。

(2) サブフォームのビューをを帳票にする必要があるなら、
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acPrevious, 9
DoCmd.GoToRecord , , acNewRec
のように、一度9行前のレコードに行ってから、新規レコードに移動すれば、ちゃんと10行表示されます。
(なんだか裏技っぽくてスマートじゃないんで、自分では納得できてないんですが・・・)

(3) 最後の9レコードより前を表示する必要が無ければ、
サブフォームのクエリーを
SELECT ID, フィールド1, フィールド2,・・・・
FROM テーブル1
WHERE ID In (SELECT TOP 7 ID FROM テーブル1 ORDER BY ID DESC;)
ORDER BY ID;
のようにして、レコード数を新規も含めて10に限定してしまうのも一つの方法かと思います。

とりあえず (2) で用が足りるということでは、自信あり(経験済み)ですが、この方法がベストか? ということではちょっと自信なしです。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

実は、私も不本意ながら、(2)にやや近い方法で実験していたのですが、
あともう少しというところでうまくいかなかったりでした。

で、yoishoさんのいわれたようにやってみたところ、うまくいきました。

ちょっと1回余分にレコード移動しているので、
画面のチラツキが気になるところですが、しょうがないですね。

ありがとうございました。

お礼日時:2002/01/18 18:06

画面のちらつきを止めるには



Application.Echo False
画面の更新処理
Application.Echo True

とすれば良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

早速試してみたところ、なるほどうまくいきました。
目からウロコ状態です。
まだまだ知らないメソッドがいっぱいあるなあと痛感...

ありがとうございました。

お礼日時:2002/01/21 09:29

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

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

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

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

Qサブフォームへの新規レコードを一度に複数行を出したい

access初心者です。マクロやVBAもほとんどわかりません。

前任者がTHE CARDというソフトで見積書を作っていたのですが
最近データが壊れやすくなってきて、作り方も忘れたとのこと。
そこでaccessを使う事になったのですが、フォームで見積書を作り
サブフォームには見積の詳細を出しています。
そこで無駄には見えますが、新しいレコードを追加した時に
サブフォームに13行を自動的に出せないでしょうか?
あと、そのカレントのレポートのみの印刷方法も教えて下さい。
わかりにくいかと思いますが宜しくお願いします。

Aベストアンサー

>サブフォームに13行を自動的に出せないでしょうか?
サブフォームの元になっているテーブルに13個の新しいレコードを追加してやればいいいのです

テーブルの情報が全くないので
適当にモデルで回答しますから応用してください

テーブルは以下のようなものだとします

[見積見出し](見積番号、日付、顧客CD、・・・)
[見積詳細](見積番号、行番号、・・・・)

メインのデータ入力後、ボタンを押した時に
13の新しいレコードを見積詳細に追加するには
下のような追加クエリを作成し、ボタンで走らせるようにします

1~13までの数字だけのテーブルを作成します
このテーブルから

行番号:数字
見積番号:Forms!メインフォーム名!見積番号

というクエリを作り、見積詳細への追加クエリに変換します

QACCESSのフォーム内のレコードへのサブフォーム内のレコードの表示

いつも色々な方々に大変お世話になっております。
今回は見積書というフォームの中に、得意先一覧というサブフォームがあり、その得意先一覧にはもちろん得意先の名前があります。
現時点では、見積書フォーム内の得意先名レコードにコンボボックスを設置して選べるようにしてあります。
これを得意先一覧サブフォームの中から、見積書フォーム内の得意先レコードに表示させたい、得意先名をダブルクリックすると転記されるようするのは可能でしょうか?
宜しくお願いします。

Aベストアンサー

> 得意先名をダブルクリックすると転記されるようするのは可能でしょうか?
サブフォームの得意先名をということですよね?

Me.Parent!得意先レコード = Me!得意先名
のように、サブフォームのイベントに記述すれば、親フォームのコントロールを指定できます。

Qサブフォームの新規レコードに移動したい アクセス

親フォームのコマンドボタンをクリックしたら
親フォームにはまっているサブフォームの新規レコードに移動したいのですが、
うまくできません。

サブフォームのオブジェクト名は、"F_SubForm"です。
サブフォームはデータシートビューです。

VBAコードは
Private Sub cmd_test_Click()
DoCmd.SelectObject acForm, "F_SubForm"
DoCmd.GoToRecord , , acNewRec
End Sub
です。

上記コードを実行すると
DoCmd.SelectObject acForm, "F_SubForm"
の部分で、
「実行時エラー 2489
 オブジェクトが開いていません。」
となります。

だからと言って、
DoCmd.GoToRecord , , acNewRec
だと、何も起こりません。(新規レコードに移動しません)

解決方法をご教授ください。

Aベストアンサー

> DoCmd.GoToRecord

これは、現在フォーカスがあるフォームに対して有効だったと思うので、

> 親フォームのコマンドボタンをクリック

した状態では、
フォーカスはコマンドボタンにあり、
そのコマンドボタンは親フォームにあるので、
親フォームに対して・・・という解釈になります。

> DoCmd.SelectObject acForm, "F_SubForm"

この DoCmd.SelectObject acForm は、フォームとして起動されている・・・
組み込まれたサブフォームは、フォームとして起動されているわけではないので NG

親フォームをデザインで見た時、
サブフォームコントロール名が F_SubForm なら
サブフォームコントロールにフォーカスを移した後に、DoCmd.GoToRecord しては?

Private Sub cmd_test_Click()
  Me.F_SubForm.SetFocus
  DoCmd.GoToRecord , , acNewRec
End Sub

※ 未検証

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?」のような
表示が出てきます。


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

Qメインフォームとサブフォームのレコードを複製

(昨日同じ質問をあげましたがカテゴリが間違っていたのでこちらにあげなおしました)

メインフォーム「MAIN」にサブフォーム「REN」を埋め込んでいます。

【メインフォームMAIN】
テーブル名:JIK
ID:事件ID

【サブフォームREN】
テーブル名:REN
ID:連絡先ID(・事件ID)

ボタンをクリックすると、メインフォームで表示させているレコードを複製させたいです。

以下を参考に、そのとおり(のつもり)に作ってみたのですが
(メインフォーム「MAIN」に「txtCopy事件ID」という名前のテキストボックスも作成しました)
「コマンドまたはアクション”追加貼り付け”は無効です。」
とエラーメッセージが出てしまいます。
どのように修正すればよいでしょうか?
http://www.accessclub.jp/bbs3/0103/superbeg36719 …

ちなみに追加クエリだけを実行すると
表示させているメインフォーム「MAIN」のレコードに、
サブフォーム「REN」のレコードが追加され、
サブフォーム「REN」のレコードが2倍になりました。

以下追加クエリとコードです。

【追加クエリ】
INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ )
SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・
FROM REN
WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

【VBA】
Private Sub 明細コピー_Click()
On Error GoTo Err_明細コピー_Click

Me!txtCopy事件ID = Me!事件ID

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append


Dim stDocName As String

DoCmd.SetWarnings False ' システムメッセージ非表示
stDocName = "追加クエリ"
DoCmd.OpenQuery stDocName, acNormal, acEdit
DoCmd.SetWarnings True ' システムメッセージ表示

' サブフォーム再クエリ
Me!REN.Requery

Exit_明細コピー_Click:
Exit Sub

Err_明細コピー_Click:
MsgBox Err.Description
Resume Exit_明細コピー_Click

End Sub

よろしくお願いいたします!

(昨日同じ質問をあげましたがカテゴリが間違っていたのでこちらにあげなおしました)

メインフォーム「MAIN」にサブフォーム「REN」を埋め込んでいます。

【メインフォームMAIN】
テーブル名:JIK
ID:事件ID

【サブフォームREN】
テーブル名:REN
ID:連絡先ID(・事件ID)

ボタンをクリックすると、メインフォームで表示させているレコードを複製させたいです。

以下を参考に、そのとおり(のつもり)に作ってみたのですが
(メインフォーム「MAIN」に「txtCopy事件ID」という名前のテキストボックスも作...続きを読む

Aベストアンサー

メインフォーム側の方は解決しました様で良かったです。

サブフォーム側のキー違反に関してですが、リンク先のURLの内容によると

メインフォーム→見積明細フォーム
 見積明細ID→オートナンバー型(主キー)
 見積品名→テキスト型
 ・・・

サブフォーム→工程明細フォーム
 工程明細ID→オートナンバー型(主キー)
 見積明細ID→数値型
 工程コード→テキスト型
 ・・・

とあります。これをそっくりそのまま質問者様の仕様に置き換えると

メインフォーム→MAIN
 事件ID→オートナンバー型(主キー)
 ・・・

サブフォーム→REN
 連絡先ID→オートナンバー型(主キー)
 事件ID→数値型
 ・・・

となるかと思います(一つ前の回答にも同じような事を書きましたが)
考えられるキー違反の原因としては、サブフォーム側で「事件ID」が主キー設定されていませんか?

リンク先のURLのイメージですと、例えば

【メインフォーム】
1 A みかん
2 C りんご
3 D ぶどう
項目名は左からID1(オートナンバー)、コード、品名とします。主キーは「ID1」

【サブフォーム】
1 1 A みかん 愛媛
2 2 C りんご 青森
3 3 D ぶどう 山梨
項目名は左からID2(オートナンバー)、ID1(数値)、コード、品名、産地とします。主キーは「ID2」

というレコードが各フォームにあるとして、メインフォームで2のりんごの項目を表示させてボタンを押すと

【メインフォーム】
1 A みかん
2 C りんご
3 D ぶどう
4 C りんご

【サブフォーム】
1 1 A みかん 愛媛
2 2 C りんご 青森
3 3 D ぶどう 山梨
4 2 C りんご 青森

という感じの動作になるかと思うのですが(間違っていたらお恥ずかしい限りですが。。。^^;)
この時サブフォームの「ID1」(=事件ID)は同じ値が複製されるので、主キーが設定されているとキー違反になってしまうかと思われます。

もしサブフォーム側の「事件ID」に主キーが設定されていたら、そちらは主キーを外して「連絡先ID」の方に主キー設定して下さい。
(勿論、メインフォーム側の「事件ID」は主キーでOKです)

他の原因だったらすみませんm(_ _)m

メインフォーム側の方は解決しました様で良かったです。

サブフォーム側のキー違反に関してですが、リンク先のURLの内容によると

メインフォーム→見積明細フォーム
 見積明細ID→オートナンバー型(主キー)
 見積品名→テキスト型
 ・・・

サブフォーム→工程明細フォーム
 工程明細ID→オートナンバー型(主キー)
 見積明細ID→数値型
 工程コード→テキスト型
 ・・・

とあります。これをそっくりそのまま質問者様の仕様に置き換えると

メインフォーム→MAIN
 事件ID→オートナンバー型(主キー)
 ・・...続きを読む


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

人気Q&Aランキング

おすすめ情報