• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MSアクセス2010と2003)

MSアクセスの帳票フォームで入力用チェックボックスの更新処理に関する問題

このQ&Aのポイント
  • MSアクセスの帳票フォームで使用する入力用チェックボックスの更新処理に関して問題が発生しています。
  • チェックボックスの更新前処理で同じ場所へのダブリが発生しないような処理を行っています。
  • しかし、アクセス2003+Office2003SP1、アクセス2010+Office2010SP1の環境ではチェックボックスの更新に時間がかかる問題があります。解決策をお知りになりたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

以上と言いつつ、 最初の質問の Me.Refresh を見逃していました。 Me でフォーム全体のRefreshを行うのではなく 個々のコントロールのRefresh、Recalc、Requeryを行えませんかね? Me!コントロール名.Re… ただ、Me.Refresh を外しても若干の改善となると。。。 実際にファイルを見られればもう少し何とかなるかも?ですが やり取りはこのサイトではご法度なのでゴメン。

minoriyuki
質問者

お礼

ありがとうございます。計算を全部更新するためフォーム全体を行わないといけないと思っておりましたが、CK1だけをRequeryしてやればCK1が確定し全ての計算をやり直してくれました。2003,SP3に比べればまだまだ遅いですが、Me.CKXX,Requeryでずいぶん速くなりました。(.accdbに変更致しました)VB7.0のレジストリ値が怪しいと友人が言っておりましたので、このへんも見てみたいと思っておりますが、随分と改善致しました。ありがとうございます。

minoriyuki
質問者

補足

http://okwave.jp/qa/q7958022.html こちらの方も教えて下さい。 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

一つのチェックボックスを変えるだけで、 全てのチェックボックスの値が再更新されるような動きは? 何処かにイベント連鎖的なモノがあって SP3 だとAccess が気を廻してくれるのが速くて無駄な連鎖を遮断して・・かもです。 ステップ実行してみると何かが見えてくるかも? 私からは以上です。

minoriyuki
質問者

お礼

ありがとうございます。2010で更新後処理からme.refreshを外すと少し速くなりました。しかしRefreshしないと値を確定できないため同じ場所へのダブリ予防ができませんし、下のフィールドにある計算結果も出て来ません。チェックマークのチェックを付けた時に値を確定させるのにはMe.refreshだけですよね。Requeryでは恐らくもっと遅くなると思います。色々教えて頂きどうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

ん~ 個々のPCに置いてあるという事ですか。。 ネットワークの設定の違いから・・かなと踏んでたのですが違ったようですね。 となるとAccessの内部的な問題になる?ので心当たりはありません。 全体的に遅くなるのか、ある一部(一行)の処理だけに時間が掛かっているのか 経過処理時間をイミディエイトウィンドウに出力するようなのを 数か所おいておいて検証する事くらいしか思いつきません。 後は、Access2010ならACCDB形式にしたら変わるかとか Decompile して再コンパイル・最適化で変わるかなど。

minoriyuki
質問者

お礼

連絡ありがとうございます。 動きで少し見えるのですが、チェックマークをオンにすると、全てのチェックマークが1つづつ色が変わって元に戻る動きが見えました。恐らくSelect caseを見ているのではないのでしょうか。VBAの問題かな、、と思いました。おっしゃるとおり一部の問題かと思います。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

して、そのMDBファイルはどこに置いてありますか?

minoriyuki
質問者

補足

MDBファイルはC:\DBに入れてあります。テーブルはリンクでなく正規のテーブルです。2003、SP3でネットワーク経由でも使ってみましたがスピードは問題ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • access VBA処理がうまくいかない

    お世話になります。 T_請求に追加する追加クエリQ_家賃請求Tがあります。 どの物件を更新するかをチェックボックスで指定し、追加クエリの抽出条件にしています。 月に1度のみの操作ですが、数人でこのデータベースを触り、 何度も追加されると困るので2度目以降はエラー処理をさせたいと思っています。 Private Sub 更新_Click() Dim ret As Integer ret = MsgBox("チェック物件を請求更新します。" & vbCrLf & "よろしいですか?", _ vbYesNo + vbQuestion, "請求月次更新") If ret = vbYes Then If DCount("[契約者CD]", "[T_請求]", "[物件CD] = " & Me!物件CD & _ " AND [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") _ <> 0 Then MsgBox "すでに指定物件の請求は更新されています" & vbCrLf & _ "同じ月に請求を2度更新できません" Else DoCmd.SetWarnings False DoCmd.OpenQuery "Q_家賃請求用T" MsgBox "更新されました" DoCmd.SetWarnings True End If Else If MsgBox("処理を中止しました", vbOKOnly + vbDefaultButton1 + vbExclamation) = vbOK Then Me.Undo Cancel = True End If End If End Sub 以上のようなコードを書きました。 処理が正しくできているか確認のために、動作を調べたのですが、 まったく同じ請求年月で同じ物件CDのものが保存先のテーブルに処理されてしまいます。 どの部分を直せばいいのでしょうか? 足りない情報があれば提示しますので、よろしくお願いいたします。

  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • アクセスでの日付入力

    アクセスの初心者です。 2000を使っているのですが、フォーム上にチェックボックスと納品日のテキストボックス?を作りチェックボックスにチェックを入れると自動的に納品日(本日の日付)が入るようにしようと思い、自分でいちを作成してみました。 ただ、チェックを入れると日付は入るのですが、チェックを外しても日付が入ったままなのです。チェックを外したら日付も消えるようにする事はできるのでしょうか? チェックボックスのイベント→クリック時に下のようなVBAを入れてます。 Private Sub チェック12_Click() If Me!チェック12 = True Then Me!納品日 = Date End If End Sub

  • Access VBA での Null と "" 

    以前組んだAccessVBA(ADPファイルにて使用)でのコードの中に、入力値のチェックとして -------------------------- Dim value as String If me!TextBoxA = "" then 'ここでテキスト未入力時の処理 Else   ’テキストが入力されているのでここで正常な処理 value = me!TextBoxA.value End If --------------------------- という記述をしていました。 今でしたら、これに加えてIsNullや他の仕組みを併用するのですが、 今まで上のものでも問題なく使えていました。つまり、  If me!TextBoxA = "" then  だけで、テキストボックスの未入力をきちんと検出していました。 ところが、最近新しいPCを導入したところ、  「Nullが不正です」 のメッセージが出るようになりました。 恐らくIf文で入力値の””が検出されず、Elseの部分で、Valueに代入しようとしたため、「Nullが不正」となったのだと思います。 本来はこちらの方が正しいと思うのですが、わからないのは今までなぜ Nullが不正とならなかったのか、です。 因みに、問題なく使えていたPCの組み合わせとしては、  ・XP(SP3) Office2010Pro(Access2010)   ・XP(SP3) Office2002Pro(Access2002) + AccessRuntime2007  ・XP(SP3) Officeなし + AccessRuntime2010  ・・・など、あらゆる組み合わせで10台ほど、問題なく動いていました。  (OSはすべて32Bit.エデイションはProやHomeなど混在) そして、問題となったPCは  ・XP(SP3)Pro Office2010Pro(Access2010) です。しかも、購入した直後は問題なかったものの、つい先日急にダメになったとの事でした。 何かきっかけとなった事はなかったか聞いてみましたが、心当たりはないとの事。 また、ネットワーク上にある同一ファイルをそれぞれのPCで個別に開いてみても、 やはり、Nullを検出するのは今回の新しいPCだけです。 何が原因なのかが気になって仕方ありません。 このような違いが起こる要因としてどのようなことが考えられるでしょうか。

  • Accessのコントロールの数え方

    Access 2003のコントロールについてお教えください。 フォーム1というフォームにチェックボックスがいくつも配置されています。 チェックボックスがいくつ配置されているか知る方法はあるのでしょうか? また、いくつのチェックボックスにチェックが入っているか知る方法はあるでしょうか? ネットで検索したところ、下記のコードが約にたつような気がするのですが、どうやって活用すればよいのかがわかりません・・・・ For Each ctl In Me.Controls With ctl If .ControlType = acTextBox Then 'コントロールの種類がテキストボックスなら値をNull(空)に設定 .Value = Null End If End With Next ctl わかりでしたらお教えください。よろしくお願いします。

  • Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法

    テキストボックスの更新後処理で下記のような記述をし、 テキストボックスに1が入力された場合、エラーメッセージを表示した上で、 フォーカスを一度ボタンに移動した後、テキストボックスに移動しております。 SetFocusを二回記述している理由ですが、 フォーカス移動を抑止する為に、Me.テキストボックス.SetFocus のみを記述した所、次の場所にフォーカスが移動してしまい、 下記のように書くと元の場所にフォーカスが戻ってくる為です。 フォーカス喪失時(Exit)の場合、Cancelを使用すればフォーカスの移動を抑止できたのですが、 更新後処理(AfterUpdate)でSetFocusを2回書く以外に フォーカスを移動させない方法をご存知の方がいらっしゃいましたら アドバイスいただければと思います。 ★クラスモジュール Private Sub テキストボックス_AfterUpdate() Call CHECK_TEXT(Me, Me.テキストボックス.Value) End Sub ★標準モジュール Function CHECK_TEXT(MeForm As Form, text As String) If text = 1 Then MsgBox "エラー" MeForm.ボタン.SetFocus MeForm.テキストボックス.SetFocus End If End Function 以上、よろしくお願いします。

  • Access2003、2010間の非互換?

    これまでWindowsXPで動作していた Access2003のアプリケーションをそのまま、 Windows7 Office2010の環境で動作させようとしたところ、 以下のエラーが発生しました。  [エラー]   ”実行時エラー -2417352567(80020009)   このオブジェクトに値を代入することはできません。” デバッグで上記エラー発生個所を追ってみたところ フォームの処理モジュールで、 自フォームに定義されたチェックボックスの値を変更する箇所があるのですが、 そこで起きています。  [フォームの定義情報]    :   ・CKボックス = チェックボックスの名称  [フォームモジュール内でエラーが発生した処理]   Me.CKボックス = True 冒頭にも挙げたとおり、 本アプリケーションは2003⇒2010の際のソース・設定の変更は実施しておらず 2003の環境では正常に動作しています。 2010へのバージョンアップにあたり、 このチェックボックスの仕様に変更等があったのでしょうか? この現象の解決方法をご教授願います。 いくらかネットで調べてみましたが、 ピタリと該当する事例は確認できておらず お力を貸していただけたらと思います。

  • ACCESSのコンボボックスについて

    ACCESSのコンボボックスに「012/015/028/125」等が設定されているて、 コンボボックスのプロパティの「入力チェック」は「はい」の設定になっております。 そういった場合、「12」と入力した場合、「012」とすることは可能でしょうか? テキストボックスの場合には、そのテキストボックスの更新後処理で Me.コード = Format(Me.コード, "000") のように記述し変更していたのですが・・・。 コンボボックスでは、「指定した値はリストにありません」と表示され、更新後処理がが実行されません。

  • Access BeforeUpDateイベントで

    こんにちは。お世話になります。 行き詰ってしまったのでお力を貸してください。 Accessフォームでコンボボックスに規定値で必須としています。 そして、フォーカス喪失後に以下のように書いていたのですが、新規追加しようとして、閉じるボタンや、戻るボタンを押すときにまで、アラートを出してくれちゃうのです。それをどうにかしたくて、更新前処理に下記のように入力したのですが、ぜんぜん反応してくれません。 If Me.対処方法 = "必須" Then MsgBox "方法を選択してください。" Cancel=true End If 何か間違えてるのでしょうか?どなたかお知恵を貸してください。よろしくお願いします。

  • アクセスのコントロールの移動について教えてください

    Win2000、アクセス2000を使用しています。 日付を入力するテキストボックスの更新後処理に以下のVBを組みました。 Private Sub 発送日_AfterUpdate() If Me![発送日] < Me![受注日] Then MsgBox "受注日より前の日付を入力しています。" & vbNewLine & "訂正してください。", _ vbOKOnly + vbExclamation, "発送日" End If Me!発送日.SetFocus End Sub ところが、[発送日]のテキストボックスではなく、次のテキストボックスにカーソルが行ってしまいます。 ちなみに[発送日][受注日]ともプロパティで「g ee\.mm\.dd」という書式を設定しています。 書式の設定とは関係ないと思いますが… よろしくお願いします。