• 締切済み

MS Access2007 フォーム作成で不思議な現象が起きて困っています

OS: WindowsXPSP3 Access2007:SP2 MSO(12.0 6425.1000) フォームのモジュールで Private 変数を宣言し、 フォームの開く時イベントで、値を代入するようにしました。 レコード移動時イベントでその変数を利用しようとしたら、 最初のレコード移動時にすでに値が空になってしまっているのです。 フォームを開いた時には、ちゃんと代入されています。 モジュール変数に値を代入しているのは、開く時だけです。 当然ながら、Option Explicit宣言をしてあります。 どうしてこんな現象が起きてしまったのでしょう? 解決に向けて、何をどう調べていったら良いのか、皆目見当がつかない状況に陥ってしまいました。 皆様のお知恵を是非お借りしたく、どうかよろしくお願いいたします。 ちなみに、Officeの診断プログラムは実行して問題のないことを確認済みです。

みんなの回答

  • yu_tang
  • ベストアンサー率81% (26/32)
回答No.2

私は 2007 を使っていないので実地に確かめたわけではありませんが、 ちょっと調べた限りでは分割フォームのバグくさいですね。 同様の問題がいくつかのフォーラムで報告されています。 http://www.experts-exchange.com/Microsoft/Development/MS_Access/Access_Coding-Macros/Q_24670641.html http://bytes.com/topic/access/answers/735432-access-2007-split-forms-subforms どれも解決していません。また公開されている MS のバグリストにも (自分の探した限りでは) 見当たりません。 Access 2010 のベータ版でも同じ現象だという書き込みがあったところを 見ると、今のところ MS はこれをバグと見ていないか、またはバグだと しても優先度が非常に低い扱いではないかという推測ができそうです。 分割フォームと同等のフォームはサブフォームを使って簡単に自作できます から (2003 までは皆さんそうしていたはず)、従来の方法にするか、または バグが直るまで (バグだったとして、ですが) 待つかいずれかではないで しょうか。

youchang-
質問者

お礼

なるほど、分割フォームの問題のようですね。 サイズ可変のデータシート表示が魅力で利用しようとしたのですが、避けておこうかと思います。 そろそろバグもフィックスしてきたころだろうと思い込んで、ACC2007に手を出したのが甘かったです。 闇雲なバージョンアップはせず、安定したソフトを常に選択するべきだと、痛感しました。 発売後3年も経つのに、これだけ明らかな不具合に対してコメントがないというのは、驚きです。 まったく、MOSのことしか考えないユーザ不在の企業倫理花盛り、と言ったところですね。 いろいろお調べいただいたようで、ありがとうございました。 貴重なお時間を割いてくださったことに感謝します。

  • seastar3
  • ベストアンサー率69% (99/142)
回答No.1

 直感的なアドバイスですけど、そのフォーム上のフィールドに初期値指定してしまった可能性があります。プロパティーをよく見て、もしゼロか何か埋め込まれていたら削除すれば直るかもしれません。

youchang-
質問者

お礼

Access側に問題がありそうなので、深追いせず、分割フォームの使用を避けることにしました。 ありがとうございました。

youchang-
質問者

補足

ご回答ありがとうございます。 ご指摘の内容ですが、私の宣言したモジュール変数はユニークな名前なのでフィールドとの関連付けはありません。 それで、よくよく調べたら、フォームの既定のビューを分割フォームにしたせいだと分かりました。 単票フォームにすると問題なく変数の値が維持されています。 なぜ分割フォームにしていると、レコードを移動する際にフォームのモジュール変数が初期化してしまうのでしょうか? このあたりの仕組みが今一つ理解できないです。  なにかヒントがあれば、是非ご教授ください。 引き続き、よろしくお願いします。

関連するQ&A

  • [Access]あるフォームのクラスモジュールで値を入れた変数を他のフォームでそのまま利用したい

    モジュールとクラスモジュール(イベントプロシージャ)に違いがあることや、モジュールを超えて変数を利用したいときは、Publicで宣言する、という辺りを本を読んでおおまかに理解しました。 帳票管理フォームというフォームに受付CDという主キーの番号があります。そのフォーム上に帳票の詳細な事項を入力するフォームを呼び出すボタンがあります。フォームのイベントプロシージャの一番上のOption Compare Database,Option Explicitの直下行にPublic UketukeCD as Integerと宣言し、 ボタンのイベントプロシージャで、 UketukeCD = Me![受付CD].Value などと記述しました。 新規入力データの受付CDが例えば452ならUketukeCDには452が代入されればいいんです。 帳票の詳細な事項を入力するフォーム(報告書フォームとします)の「読みこみ時」のイベントプロシージャに以下のように記述しました。 こちらのモジュールの一番上にもPublic UketukeCD as Integerと宣言し、(←これは必要なんでしょうか?) Me![受付CD].Value = UketukeCDと書きました。 過去のデータを検索するときはレコードソースのテーブルの受付CDのデータを受付CDフィールドに持ってき、新規入力の場合は、受付CDは帳票管理フォームのものを代入するという設計で、UketukeCDの値(例:452)を報告書フォーム内の受付CDフィールド内に出力する、という感じですが、なぜかUketukeCDにはいつも0が代入されています。 変数は他のモジュールで利用できても代入された値までは移行されないのですか? イベントプロシージャだからできないんですか? 字数の制限上、コードをかなり省略しています。 足りない部分は補足で補いますのでおっしゃって下さい。

  • 異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。

    msAccess2000のVBAコードの質問です。 元々、全てを理解しているわけではないのにVBAコードを書いているのが無茶なんですが、無茶を承知でプログラミングしています。 あるクエリの結果を、あるフォームで帳票表示しています。この帳票の一レコードにボタンをつけて、クリックイベントで、そのレコードを取得しようとしています。フォームはこの後、閉じられた後、呼び出された親にその、レコードを渡したいのです。 フォームは、親フォームのボタンクリックイベントから、DoCmd.Openformメソッドによって呼び出されるので、戻り値は使えません。 しょうがないので、広域変数rst(DAO.Recordset型)で、受け渡そうと思ったのですが、recordset型は、どうやら参照のようで、フォーム(クエリ?)を閉じると、レコードが壊れてしまうようなのです。 Module1で、 public rst as DAO.recordset として、 Private Sub コマンド34_Click() set Module1.rst=me.recordset ' この中では、rst.fields(*)で、フィールドの値を使えるのですが・・・ END Sub 呼び出した親フォームでは、module1.rst.fields(*)を使用できません。 質問は二つあります。 1)広域変数rstは、上記のような宣言・使用法で問題ないですか? 2)sub またはfunction間にわたって、レコードを渡す、いい方法はないですか?

  • ACCESSで変数の保持

    ACCESSを使っていますが、いまいち分からない点があります。 フォームのイベントで、変数に値を代入するのですが、 フォームAの変数AをフォームBのイベントで確認したいのですが、うまくいきません。 良く分からない表現で申し訳ありませんが、どのようにしたら良いのでしょうか。 よろしくお願いします。

  • ACCESS2000 VBA フォームのコントロールに値を転記

    <やりたいこと> 保存されているレコードのフィールド値を修正するために、修正用非連結フォームを開くとき、当該レコードの値を転記したい。 <できないこと> コンボボックスに値が転記できない。 (テキストボックスには値が転記できる。) Private Sub Form_Load() Dim Sql As String Sql = "SELECT* FROM T_履歴 WHERE NO.=" & Key & ";"  'KeyはPublic変数、別のフォームモジュール内で値が格納されている。  'Keyによって、レコードはひとつに絞られている。 Dim DB As ADODB.Connection Set DB = CurrentProject.Connection Dim RS As New ADODB.Recordset RS.Open Sql, DB, adOpenForwardOnly, adLockOptimistic, adCmdText Me!氏名combo = RS!氏名 ↑この式で思うような結果が得られない。  .Text .Value のプロパティを付加しても結果は同じ。  ACCESS97ではこのように コンボボックス名="値" で、  値が代入され、コンボのソースの中からその値が選ばれた状態になったのに…。  

  • フォームにて

    フォームであるボタンを押したら、そのボタンの値("name"等)を変数に代入し、その変数の値を維持したまま画面を再描画したいのですがどうしたらよいのでしょうか? onclick="func()"を使ってみたのですが、うまく代入されませんでした。 よろしければ教えてください。 お願いします。

    • ベストアンサー
    • PHP
  • 複数のフォーム間での変数宣言

    VB6.0についての質問です。ひとつのプロジェクトの中に複数のフォームがあるとします。この中のある一つのフォームで変数 NUM を宣言し、何かの計算値を入れます。このNUMを値は保持したまま、他のフォームで利用することはできるのでしょうか? とりあえず全てのフォームのコードの先頭(プロシージャの外、Option Explicit下)に「Public NUM As Single」と宣言して挑戦してみたのですが、駄目でした。。よろしくお願いします。

  • フォームのテキストコントロールに代入された計算式を計算したい

    VB.Netのイベントで、フォームのテキストコントロールに代入された計算式を計算したいのです。 (String変数に代入された値でも構いません) 計算式.textに "3*4+5"等の計算式が代入されているとします。 これを計算して結果を変数に代入させたいのですが、Textになっているので、どうすればよいか分かりません。 よい方法を教えて下さい。

  • データシートフォームでのSellength

    Access2010 データシートフォームの先頭のタブ位置(タブストップ0)に フォーカス時に全選択状態にしたいテキストボックスがあり、 Private Sub テキスト_Enter() Me!テキスト.SelStart = 0 Me!テキスト.SelLength = Nz(Len(Me!テキスト.Text)) End Sub のモジュールを入力しています。 普段はモジュール通りに機能するのですが、一つ前のレコードの最後のタブからEnterを押して レコード移動後このテキストボックスにフォーカスが移った場合に限り、全選択にならない事があります。 (このフォームではレコード移動時のモジュールは使用していません) ブレークポイントを入れて途中確認したところ内部上ではSelLengthの値は文字数通りになっているのですが、実際の画面ではおかしいままなので余計に分かりません 一応SendKeys "{F2}"に置き換えると全選択になったのでこれでやり過ごしているのですがどうすれば元のモジュールで正しく動いてもらえるのでしょうか?

  • ACCESSのフォームからレポートへの変数の引渡し

    フォームで定義した変数をレポートに渡して利用したいがうまく渡せません。 具体的にはクエリー名をレコードソースとして利用するために変数に入れて渡そうとしています。 [フォーム]での変数定義 Dim 抽出種別 as String -----(1) 抽出種別 = "Q抽出未回収" -----(2) [レポート]開く時のイベントプロシージャー Private Sub Report_Open(Cancel As Integer) Me.RecordSource = 抽出種別 -----(3) End Sub 実行結果は印刷の各フィールドの項目に #Name? と表示されてしまいます。 (3)で変数を使わずに"Q抽出未回収"とやるとうまくプレビューされます。 変数の定義の方法や場所などいまいち理解が出来ていないものと思います。 フォームからレポートへの変数の引渡しはどうやってやればうまく出来るのでしょうか?

  • MS-ACCESSについて

    ウィザードでフォームを作成しているのですが、 コンボボックスを設置し、値を文字で指定しているのですが フォームへ入力するときに、値を選択して終了すると 次にそのレコードを開いた時にはその選択が消えて、無選択状態 になってしまいます。 どうすれば宜しいでしょうか?