• 締切済み

アクセスのタイマー間隔

アクセス2003のタイマー間隔の実行で 何回実行したかカウントを取りたいのですが変数がクリアなるのか いきません。 フォームを開いた時 Dim a As Double a=0 Private Sub Form_Timer() Dim a As Double a = a + 1 MsgBox a End Sub 返し値がすべて 1になる ご伝授お願いします

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

フォームモジュールでも、モジュールでも、その中で変数を宣言したら、抜けるとともに変数のその値は使えない。 質問のコードではaの初期値を初期化してないが、0の扱いにしてくれるので、VBでは落ちないので気づかないだけ。 PUblic Static モジュール外宣言 モジュール内宣言 などWEBで{VBAを付けて)WEB検索し、勉強のこと。 この程度の質問レベルで、タイマーなどでフォーム表示を繰返す質問を別途していたようだが、現状を超える課題だろう。 基礎的なVBA解説書を通読すること。

  • -boya-
  • ベストアンサー率35% (176/494)
回答No.2

Subの中でDimで宣言をしたら、そのSubの中でしか使えません。 今回の場合は Private Sub Form_Open(Cancel As Integer) ~ End Sub の間で宣言した変数「a」と Private Sub Form_Timer() ~ End Sub の間で宣言した変数「a」は別物として扱われています。 またTimer発生時に毎回 変数「a」を宣言しているので毎回クリアされます。 これを回避するためにはモジュール全部で参照できる位置に変数「a」を定義して、 それぞれのSubプロシージャ内では宣言をせずに呼び出します。 具体的にはモジュールの上部にある Option Compare Database のすぐあとに「Dim a As Double」で宣言を書き、 Private Sub Form_Open(Cancel As Integer) ~ End Sub の間で変数「a」に初期値0を入れます。 タイマー発生時にカウントアップするのでしたら Private Sub Form_Timer() ~ End Sub の中に「a = a + 1」を記述すれば期待する動きになると思います。 もしフォーム間で変数を共有したいのであれば、標準モジュール内で Publicで変数を宣言すれば、どこからでも呼び出せます。 以下、参考情報ですが、、、 「a」の値を確認するためにメッセージボックスを使っているのでしたら 「debug.print a」とか「debug.print "a=" & a」とか書くと、 イミディエイトウィンドウに表示されるので便利かもしれません。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

関数内で宣言してる時点で、関数内のみで有効な変数ですね。 名前を同じにしても、関数が違えば、全く関係ない別の変数 となります。 東京都.中央区と大阪府.中央区が同じ中央区だから同じ場所に なるか?というくらい違います。 関数の外(モジュールレベル)で変数を宣言して下さい。 Private a As Double Private Sub Form_load  a=0 End Sub Private Sub Form_Timer()  a = a + 1  MsgBox a End Sub このあたりは「変数のスコープ(有効範囲)」という事で 入門本の最初の方に書かれています。この辺りの事を 知らないとプログラムはできませんので、よく勉強して おいて下さい。

関連するQ&A