ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

Form_Open ’開くとき
Form_Load ’読み込み時
Form_Current ’レコート゛移動時
Form_Activate ’アクティブ時

これはどの順番で実行されるのでしょうか?

それと
もしほかに起動時に実行されるイベントがあれば教えてください。
よろしくお願い致します。

A 回答 (2件)

下記は自信はありません。

これではダメなのかも知れないが、何かの参考に。
ーー
Public i

Private Sub Form_Current()
i = i + 1
MsgBox "C" & i
End Sub

Private Sub Form_Load()
i = i + 1
MsgBox "L" & i
End Sub
Private Sub Form_Open(Cancel As Integer)
i = i + 1
MsgBox "O" & i
End Sub
Private Sub Form_Activate()
i = i + 1
MsgBox "A" & i
End Sub
をそのフォームのイベントプロに入れて、フォームを開くを行うと
私のテストでは、順に
O1
L2
A3
C4
と表示されましたが。
ーー
>起動時に実行されるイベントがあれば教えてください
上記以外は操作者のマウスでの行動や操作のタイミング時やプログラムの実行時に起こるものなので、質問の類とは別と思います。
Onconnectも疑ったが、
http://www.feedsoft.net/access/tips/tips91.html
の解説を見て、ピボット利用の限定的な場合らしい。
ほかもこの一覧をみて考えてください。
    • good
    • 0
この回答へのお礼

コピペして試してみたら同じ結果になりました!
すべてフォームが表示される前に発生するのですね。
ありがとうございます。

お礼日時:2009/05/27 22:05

こちらのサイトが参考になると思います(Microsoft Access2003のヘルプ):


http://office.microsoft.com/ja-jp/access/HP05186 …
(「+フォーム及びサブフォームのイベントの順序」の「+」をクリックして下さい)

> フォームを開くと、フォームでは次の順序でイベントが発生します。
> Open → Load → Resize → Activate → Current
>
> フォームに使用可能なコントロールがない場合は、Activate イベントの後、
> Current イベントの前に、GotFocus イベントが発生します。

従って、

 開くとき(Open) → 読み込み時(Load) → サイズ変更時(Resize)
 → アクティブ時(Activate) ( → フォーカス取得時(GotFocus) )
 → レコード移動時(Current)

ということになるかと思います。
(もちろん、それぞれのイベントで行った操作によって別のイベントが発生した
 場合(例えば開くときに、前回起動時に表示して削除し損ねた暫定レコードを
 削除したことによる「レコード削除時」イベントの発生など)は、上記以外の
 イベントも発生します)
    • good
    • 0
この回答へのお礼

ありがとうございます。
Resizeも含まれるとは思ってませんでした。

お礼日時:2009/05/27 22:04

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

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

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

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

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

Qサブフォームでのダブルクリックイベント

Access2003です。
フォームにサブフォームを設置し、直接テーブルを表示させています。
このサブフォームのテーブルのある行をダブルクリックしたら
その行のデータを他のフォームのオブジェクトにセットしたいのですが
行や行のデータ全てを取得は出来るのですが、サブフォームのイベントがEnterとExitしかなくて、イベント発生が出来ません。
フォームのダブルクリックでXとYを見て…と思ったのですがサブフォーム上ではフォームのダブルクリックイベントが発生せず。
サブフォームのテーブルはユーザーがソートする事もあるのでベタに上にテキストボックス等を置く事は出来ません。
どうにかダブルクリックで動作させる方法はありませんでしょうか?

Aベストアンサー

> どうにかダブルクリックで動作させる方法はありませんでしょうか?

前回の質問でも触れたように(下から2つ目の段落)、
http://oshiete1.goo.ne.jp/qa4952701.html

> サブフォームの「コントロールとしてのイベント」は「Enter」と「Exit」の2つしかありませんが、
> ソースオブジェクトに指定したフォーム(上記の例では「SF1」)側で、各種イベント(Open
> その他)が実行

されます。

ですので、No.1の方の回答にもあるように、『既定のビュー』(フォームのプロパティシートの
『書式』タブにあります)を「データシート ビュー」にしたフォームを、サブフォームのソース
オブジェクトにすれば、テーブルと同様の表示で、かつ、ダブルクリック等のイベントを発生
させることができます。
(但し、テーブル/クエリでは「サブデータシート」を表示できますが、これには非対応です)


【重要】
「フォームのダブルクリックイベント」は、データシートの外側(データが表示されていない、
グレーの背景部分)をダブルクリックした時にしか発生しません。
『データシート内でのダブルクリック』でデータを取得するレコードを指定する場合は、面倒
でも「各コントロールのダブルクリックイベント」に処理を記述してやる必要がありますので
ご注意下さい。
(以下のように、他のフォームへの代入を行う部分を、イベントとは別のSubとして作成して、
 各コントロールではそれを呼び出す形にすると、コードを組むのも修正/管理するのも
 比較的楽だと思います)

なお、ダブルクリックした時点で、コントロールの値は「現在のレコードのもの」しか参照
できないので、x,yなどで「どのレコードが選択されたか」の判定は不要です。念のため(汗)


Private Sub 社員コード_DblClick(Cancel As Integer)
  Call FromAtoB
End Sub

Private Sub 氏名_DblClick(Cancel As Integer)
  Call FromAtoB
End Sub

Private Sub FromAtoB()
  With Forms!フォームB   '別フォームの名前が「フォームB」の場合
    !社員コード = Me!社員コード
    !氏名 = Me!氏名
    '(以下、データを転記する処理を必要な追加)
  End With
End Sub

> どうにかダブルクリックで動作させる方法はありませんでしょうか?

前回の質問でも触れたように(下から2つ目の段落)、
http://oshiete1.goo.ne.jp/qa4952701.html

> サブフォームの「コントロールとしてのイベント」は「Enter」と「Exit」の2つしかありませんが、
> ソースオブジェクトに指定したフォーム(上記の例では「SF1」)側で、各種イベント(Open
> その他)が実行

されます。

ですので、No.1の方の回答にもあるように、『既定のビュー』(フォームのプロパティシートの
『書式』タブにあり...続きを読む

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

QMS Accessでフォームの「開く時」と「読込み時」のイベントの違い

Accessでフォームのイベントに「開く時」と「読込み時」のイベントがありますが、どのような違いがあるのでしょうか?
例えば、フォームのドロップダウンリストのリストのソースを変更するプログラムを「開く時」に設定していますが、「読込み時」だとまずいんでしょうか?
今は、問題なく動いているので結果オーライなんですが、ちょっと気になります。
特にフォームのテキストボックスにプログラムの条件で初期値を入れるときなどはどっちのイベントでやるのが正しいのでしょうか?
今はどっちでやってもうまく動いているのですが。
よろしくお願いいたします。

Aベストアンサー

イベントの発生順は
Open → Load
です。
また、Open はキャンセルできますが、Load はできません。
ドロップダウンリストのリストを変更しようとしてエラーが発生した場合にはフォームを開かずにおくようにするのであれば Open イベントに記述しなければなりません。
キャンセルする必要がなければ、どちらでもよいと思いますよ。どちらが正しいということでもないように思います。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QAccessでフォームへのフィールドの追加方法について

よろしくお願いします
Access2002にて名簿を作成しております。
テーブル「A」とテーブル「B」という2つのテーブルを作成し
ウィザートを利用してAとBの混ざったフォーム「名簿」を作成しました。
その後テーブル「A」のフィールド「年齢」を増やしたのですが
フォーム「名簿」へ「年齢」フィールドの追加の仕方がわかりません
フォーム「名簿」のフィールドリストに「年齢」はありませんので、
まず「フィールドリスト」へ「年齢」フィールドを追加する必要が
あると思うのですが、その方法を教えて下さい。

よろしくお願いします

Aベストアンサー

>まず「フィールドリスト」へ「年齢」フィールドを追加する必要が
>あると思うのですが、その方法を教えて下さい。

レコードソースに「年齢」が無いのだと思います。
フォームのデザイン画面 → フォームのプロパティ → データ → レコードソース
これの内容はどうなってますか?

クエリだった場合、そのクエリのSQL文はどうなってますか?
(クエリのSQL文はデザイン画面 → 表示 → SQLビューで確認できます。)

Qaccessへエクセルの複数のシートのインポートの仕方

エクセルの複数のシートをアクセスにインポートをするにはどうしたらいいのでしょうか?
シート数が40以上あって困っています。

できればVBAやマクロ等はわかりませんのでそれ以外の方法で無いでしょうか?
よろしく御願いいたします。

Aベストアンサー

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します。
データベースに、シートと同じ名前のテーブルができます。
同じシート名のテーブルがすでにあれば、インポートしたレコードは追加されます。

コードは実際に自分のパソコンで走らせて確認していますが、やる前に絶対にパックアップを取っておいてください。
お手元のデータベースがめちゃくちゃになってしまったら、私は、これも絶対に、直せません。

ポイントは DoCmd.TransferSpreadsheet という命令です。
引数は左から順番に、インポート、ソースはエクセル2000、シートの名前は Sheet**、ソースのファイル名は db1.xls、先頭行をフィールド名として使う、と言う意味です。

詳しくはヘルプで見ていただきたいと思います。
ヘルプはもしかしたら、デフォルトでインストールされていないかもしれません。
インストールされていれば、TransferSpreadsheet の部分のどこかにカーソルを置いて、F1で表示されます。
2番目の引数について、エクセル2000より後の場合にどうなるのかは、申し訳ないですが、知りません。
これについては、ヘルプで確認してください。

もし、シート名がこのように規則的な名前でなければ、この DoCmd.TransferSpreadsheet をシートの数だけ羅列します。

Sub A()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "なんとか"db1.xls", True
DoCmd.TransferSpreadsheet acImport acSpreadsheetTypeExcel9, "かんとか"db1.xls", True
............(以下同様)
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "ほにゃら"db1.xls", True
End Sub

さて、余談になりますが、今回きりの作業であれば、私なら、ひとつひとつインポートウィザードでインポートします。
高々、40シートですよね。スプレッドシートの構成や中身によりますが、1シートあたり10分もあれば、インポートできるのではないでしょうか。

TransferSpreadsheet メソッドでインポートしても、あとでフィールドのデータ型を変えたり、主キーを設定したり、という作業がそれぞれのテーブルで必要になるかもしれません。つまり、モジュールをつくってみても、それで終わりにはなりません。定期的なルーチン作業ならともかく、今回限りなら、大して手間は変わらないと思います。

VBAで書けば、例えば、こんな感じになります。
db1.xls というエクセルのファイルがあって、そのファイルに Sheet1、Sheet2、、、、、、Sheet40というシートが含まれている、という前提です。
(行替えやタブがここでうまく書けないので、読みにくいし、そのままコピーしてもうまく行かないかもしれません)

Sub A()
Dim I As Intege
For I = 1 To 40
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Sheet" & I, "db1.xls", True
Next
End Sub

F5で実行します...続きを読む


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

人気Q&Aランキング

おすすめ情報