Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2003)
フォームヘッダ部分に配置したフレーム内のトグルボタンを押したのに、押されない状態に戻ってしまいます。
投稿日時: 21/05/22 08:36:55
投稿者: takodo

ACCESS 2003です。
いつもお世話になります。
帳票フォームです。
フォームヘッダ部分に配置したフレーム内のトグルボタンを押したのに、押されない状態に戻ってしまいます。
例えばフレーム(flm)内トグルボタンを3つ配置します。(tgl1,tgl2,tgl3)
オプション値はそれぞれ、1,2,3とします。
flmをクリックしたとき、レコードソースを切り替えます。
そして、切り替えたレコードソースでデータを表示し、最終行へ移動させます。
DoCmd.GoToRecord , , acLast
これだけだと、最終行が一番上に一行だけしか表示されないので
一度、レコードを上へ移動させて再度最終行へ移動させるという処理を行っています。
コードは以下へ記載します。
変数tmpは、関数を呼び出し返値を得るためのものです。
 
レコードソースによっては、トグルボタンがそのまま押された状態になるときもあります。
goLast()を実行しないと、いずれのトグルボタンも押された状態となります。
つまり、ここで提起している問題は発生しません。
だから、goLast()に原因があると思われます。
MsgBoxを使って押下状態を調べると、
.MoveLast
を実行すると、トグルボタンが押された状態から押されない状態に戻ってしまうようです。
「ようです」というのは、そのようにならないときも有り動作が安定しないです。
また、
Private Sub flm_Click()の
@の処理により、flmの値を一端変数に格納し、元へ戻すこともしてみました。
しかし、トグルボタンが押された状態になりませんでした。
 
また、レコードソースを切り替えて、
トグルボタンが押されない状態になった後に
もう一度、同じトグルボタンを押すと押された状態になります。
しかし、このとき、flmにクリックイベントは発生しません。
ただ、トグルボタンが押された状態に変わるだけです。
 
同じトグルボタンでも時々、押された状態が保持されることもあります。
 
おわかりになる方見えましたら
なにとぞよろしくお願いいたします。
 
 
以下コードです。
'---フレームをクリックしたとき
Private Sub flm_Click()
    Dim tmp
    Dim preV As Long
    preV = Me.flm.Value '@
    tmp = setRecSrc() 'レコードソースを設定する
    Me.flm.Value = preV '@
End Sub
 
'---レコードソースを設定する
Private Function setRecSrc()
    dim tmp
    Dim strRecSrc As String
    Select Case Me.flm
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
    End Select
    Me.RecordSource = strRecSrc 'レコードソースを設定する。
    tmp=goLast() '最終行へ移動する
End Function
 
'---最終行へ移動する
Private Function goLast()
    Dim jumpRow As Long
    jumpRow = 25 'この行数を超えるときに一度上へ移動させて、その後下へ移動させる。
    With Me.Recordset
        recCnt = .RecordCount
        If recCnt > jumpRow Then
            .MoveLast
            .Move -jumpRow
        End If
    End With
    DoCmd.GoToRecord , , acLast
End Function
 

回答
投稿日時: 21/05/22 12:49:53
投稿者: hatena
投稿者のウェブサイトに移動

引用:
.MoveLast
を実行すると、トグルボタンが押された状態から押されない状態に戻ってしまうようです。

 
実際に試して分けではないので、思い付きですが、.MoveLast に問題があるのなら、
DoCmd.GoToRecord , , acLast
で最終レコードへ移動するようにしたらどうなりますか。

投稿日時: 21/05/22 13:01:46
投稿者: takodo

早速のお返事ありがとうございます。
[quote="hatena"]

引用:
DoCmd.GoToRecord , , acLast
で最終レコードへ移動するようにしたらどうなりますか。

'.MoveLast 'コメントアウトして
DoCmd.GoToRecord , , acLast 'としてみました
改善されませんでした。

回答
投稿日時: 21/05/23 19:34:23
投稿者: hatena
投稿者のウェブサイトに移動

Recordsetプロパティを使わずに、すべてDoCmd.GoToRecord でレコード移動するようにしたらどうでしょうか。

投稿日時: 21/05/23 20:57:32
投稿者: takodo

アドバイスありがとうございます。
DoCmd.GoToRecord , , acLast
DoCmd.GoToRecord , , acPrevious, jumpRow
としてみましたが、動作に変化ありません。

回答
投稿日時: 21/05/24 11:02:03
投稿者: Suzu

動作確認は出来ていませんが、気になった点をいくつか。
 
1.

引用:
.MoveLast
を実行すると、トグルボタンが押された状態から押されない状態に戻ってしまうようです。

問題点らしきが確認できているのであればその部分をコメントアウトした場合には
希望の動作にはならないものの、問題は発生しない事を確認できていますか?
 
 
2.フレームのClick時ではなく、他にボタンを用意しそのボタンクリック時のイベントに変えてみてください。
 
 
3. setRecSrc の中で goLast を呼び出すのではなく、
 
  Sub btn_xx_Click()
     〜〜
    Call setRecSrc
    Call goLast
  End Sub
 
  の様に、契機イベント内で 呼び出しましょう。
 
引用:
変数tmpは、関数を呼び出し返値を得るためのものです。
についてもそうですが
各プロシージャが、Function である必要性が見出せません。
Subプロシージャに変える前提でCall としています
 
4. recCnt = .RecordCount
    recCnt の値を確認してみてください。 -1 等が返っていたりしませんよね?

回答
投稿日時: 21/05/24 12:40:26
投稿者: コーヒー飴

コードをコピペで全容をさらした方がいいんじゃないでしょうか。
 
全部 Me.tBtn1.OptionValue と比較している。

        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・

 
Dimなしで変数が出現している。
        recCnt = .RecordCount

 
レコード件数が0件の時にエラーが発生する。
DoCmd.GoToRecord , , acLast

 
 
あと↓この場合
引用:
トグルボタンを押したのに、押されない状態に戻ってしまいます。

実際の値がなんなのか調査してみてから考えてみたり・・・
その時点で、Null値なのか、ちゃんとした値が入っているのか ということです。

投稿日時: 21/05/24 13:05:51
投稿者: takodo

貴重なアドバイスをありがとうございます。
 
>1.問題点らしきが確認できているのであればその部分をコメントアウトした場合には
>希望の動作にはならないものの、問題は発生しない事を確認できていますか?
しています。
レコード移動をさせなければ、問題とするような挙動は発生しません。
  
>2.フレームのClick時ではなく、他にボタンを用意しそのボタンクリック時のイベントに変えてみてください。
コマンドボタンを用意してgoLast()を実行しました。
問題は発生しません。
フレーム内のトグルボタンのときに、押したにもかかわらず、押されない状態に戻るというトラブルが発生します。フレーム内のトグルボタンを押した時に一連の処理としてgoLast()を実行するのでなく、
goLast()を改めて、コマンドボタンクリック時に実行すればトグルボタンが押されない状態に戻るということはありません。
  
>3. setRecSrc の中で goLast を呼び出すのではなく、
・・・・
> の様に、契機イベント内で 呼び出しましょう。
改善しません。
  
>各プロシージャが、Function である必要性が見出せません。
あえて言うなら私の趣味です。
昔、Cに凝ったものだから、ついつい関数でなどと・・・
この場合、関数でもプロシージャでも同じトラブルが発生します。
  
4. recCnt = .RecordCount
    recCnt の値を確認してみてください。 -1 等が返っていたりしませんよね?
 確認しました。レコード数は正常な値が返っています。
 
追記 さらに自分なりに思いつく方法をいろいろと調べて見ました。
  Sub btn_xx_Click()
     〜〜
    Call setRecSrc
    Call goLast '@
    MsgBox "処理が終わりました。" 'A
  End Sub
@はここで実行しても、setRecSrc内で呼び出しても変化ありません。
Aで止めると、レコード移動も表示したい行数だけ表示し、カーソルは最終行へ移動します。
つまり、goLastで行いたい処理が行われます。
そして、トグルボタンも押された状態のままです。
Aのメッセージが出た状態で、何かキーを押すと、
トグルボタンが押されない状態に戻ってしまいます。
そして、flmの値を調べると、
押したトグルボタンのオプション値を保持しています。
preVで値を戻しているから当然かもしれません。
つまり、flmの値は押したトグルボタンの値となっているにもかかわらず
トグルボタンが押されない状態になってしまうということです。
だから、押されない状態となったトグルボタンを押しても、
Call setRecSrc
の処理は実行されません。
上の2.で述べたように
この、goLastの処理を他のコマンドボタンに割り振って改めて実行すれば
このトラブル事態発生しません。
だから、上にも書きましたが、
フレーム内のクリックイベントからの一連の操作で
goLastの処理を行うと
トグルボタンを押したにもかかわらず
goLastの処理後
押されない状態に戻ってしまうという事態になるということです。
 

投稿日時: 21/05/24 13:12:35
投稿者: takodo

goLast()
のソースです。
 
Private Sub goLast()
    On Error GoTo goLast_Err
    Dim tmp
    Dim recCnt As Long
    Dim jumpRow As Long
    jumpRow = 25
    With Me.Recordset
        recCnt = .RecordCount
        'MsgBox "recCnt=" & recCnt
        If recCnt > jumpRow Then
            'MsgBox "recCnt > jumpRowなのだ" & recCnt & ">" & jumpRow
            DoCmd.GoToRecord , , acLast
' .MoveLast
            .Move -jumpRow
            .MoveLast
        End If
    End With
    DoCmd.GoToRecord , , acNewRec
    Exit Sub
 
goLast_Err:
    Select Case Err.Number
        '/* カレント レコードがありません。(Error 3021) */
        Case 3021
            Resume Next
        '/* 指定したレコードに移動できません。(Error 2105) */
        Case 2105
            Resume Next
        Case Else
            tmp = MsgBox("RQG Doc モジュール goLast でエラー発生" _
            & Chr(13) & "エラー番号 " & Str(Err.Number) & " " & Error$, , "My Doc")
    End Select
End Sub

回答
投稿日時: 21/05/24 14:19:16
投稿者: sk

引用:
フォームヘッダ部分に配置したフレーム内のトグルボタンを押したのに、
押されない状態に戻ってしまいます。

引用:
flmをクリックしたとき、レコードソースを切り替えます。
そして、切り替えたレコードソースでデータを表示し、最終行へ移動させます。

引用:
レコードソースによっては、トグルボタンがそのまま押された状態になるときもあります。
goLast()を実行しないと、いずれのトグルボタンも押された状態となります。

引用:
レコード移動をさせなければ、問題とするような挙動は発生しません。

[flm]が連結オプショングループだからではないでしょうか。

投稿日時: 21/05/24 15:51:37
投稿者: takodo

アドバイスありがとうございます。

引用:
[flm]が連結オプショングループだからではないでしょうか。

フレームをフィールドに連結しているということですよね。
連結していないです。

回答
投稿日時: 21/05/24 16:46:29
投稿者: hatena
投稿者のウェブサイトに移動

フォームを開いている途中で RecordSource を変更するというのはちょっとリスキーな感じです。
 
もし、抽出条件だけが変わるというのなら、Fiterプロパティで条件を設定するほうが安心な気がします。
 
もし、From句のテーブル自体が変わるというのことなら、
同じフォームに表示するということは同じような性質のデータ群ということになりますので、テーブルを分割するという設計はデータベース的にはあまりいいものではないと思います。
 

引用:
>2.フレームのClick時ではなく、他にボタンを用意しそのボタンクリック時のイベントに変えてみてください。
コマンドボタンを用意してgoLast()を実行しました。
問題は発生しません。
フレーム内のトグルボタンのときに、押したにもかかわらず、押されない状態に戻るというトラブルが発生します。フレーム内のトグルボタンを押した時に一連の処理としてgoLast()を実行するのでなく、
goLast()を改めて、コマンドボタンクリック時に実行すればトグルボタンが押されない状態に戻るということはありません。

 
フレームのClick時に goLast() を実行すると問題が発生する、それ以外なら発生しないということなら、
対症療法的ですが、タイマー時イベントで時間差で実行させたらどうでしょうか。
 
Sub btn_xx_Click()
     〜〜
    Call setRecSrc

    Me.Me.TimerInterval = 100 '0.1秒後に実行
 End Sub

'タイマー時イベント
Private Sub Form_Timer()
    Me.Me.TimerInterval = 0 'タイマー停止
    Call goLas
End Sub

 

投稿日時: 21/05/24 17:51:58
投稿者: takodo

多くの、貴重なアドバイスをありがとうございます。

hatena さんの引用:
もし、抽出条件だけが変わるというのなら、Fiterプロパティで条件を設定するほうが安心な気がします。

抽出条件と、並び替えを変えているだけです。
>Fiterプロパティで条件を設定するほうが
SQLを変えれば操作がしやすいもので
抽出条件だけならともかく、並び替えも適時変えたいものですので。
 
>もし、From句のテーブル自体が変わるというのことなら、
テーブル自体は変えていません。
 
hatena さんの引用:
フレームのClick時に goLast() を実行すると問題が発生する、それ以外なら発生しないということなら、
対症療法的ですが、タイマー時イベントで時間差で実行させたらどうでしょうか。

これは、やってみました。
設定した時間が経過して、goLast()が実行されます。
この、goLast()が実行されると、トグルボタンの押されていた状態が押されていない状態に変化します。

回答
投稿日時: 21/05/24 18:43:58
投稿者: hatena
投稿者のウェブサイトに移動

引用:
SQLを変えれば操作がしやすいもので
抽出条件だけならともかく、並び替えも適時変えたいものですので。
・・・
テーブル自体は変えていません。

並べ替えはOrderByプロパティで変更できます。
 

回答
投稿日時: 21/05/25 08:52:05
投稿者: Suzu

引用:
>2.フレームのClick時ではなく、他にボタンを用意しそのボタンクリック時のイベントに変えてみてください。
コマンドボタンを用意してgoLast()を実行しました。
問題は発生しません。
フレーム内のトグルボタンのときに、押したにもかかわらず、押されない状態に戻るというトラブルが発生します。フレーム内のトグルボタンを押した時に一連の処理としてgoLast()を実行するのでなく、
goLast()を改めて、コマンドボタンクリック時に実行すればトグルボタンが押されない状態に戻るということはありません。

 
引用:
上の2.で述べたように
この、goLastの処理を他のコマンドボタンに割り振って改めて実行すれば
このトラブル事態発生しません。
だから、上にも書きましたが、
フレーム内のクリックイベントからの一連の操作で
goLastの処理を行うと
トグルボタンを押したにもかかわらず
goLastの処理後
押されない状態に戻ってしまうという事態になるということです。

 
では、フレームのClickではなく、ボタンのClick にて実行する様に変えれば良い様に見えます。

投稿日時: 21/05/25 09:04:06
投稿者: takodo

貴重なアドバイスをありがとうございます
>フレームのClickではなく、ボタンのClick にて実行する様に変えれば良い様に見えます。
そのとおりです。そうすれば少なくとも押したにもかかわらず、押されていない状態に戻ることはないです。
フレーム内に、類似の処理を集めてトグルボタンの押下状態により処理しているです。
トグルボタンを、コマンドボタンに変えると、あるコマンドボタンを押した時に他のボタンを押されない状態にするという処理が必要になってきます。
この処理をコーディングすれば済むことです。
フレーム内のトグルボタンのオプション値で扱えればコーディングも簡潔なのでと思っていたのですが。
このような想定外の挙動が現れてしまいました。
そこで、解決できないものかと皆さんのアドバイスを受けながら、解決に向けて挑戦しています。
よろしくお願いいたします。

回答
投稿日時: 21/05/25 10:00:12
投稿者: hatena
投稿者のウェブサイトに移動

タイマー時イベントで時間差で実行するという方法ではうまくいかないといかことでしたが、
時間差を増やしても同じでしょうか。
 

   Me.Me.TimerInterval = 3000 '3秒後に実行

 
あと、
 
RecordSource は変更せずに、FilterプロパティとOrderByプロパティで抽出と並べ替えをするという方法は試されましたか。

回答
投稿日時: 21/05/25 10:16:16
投稿者: Suzu

引用:
フレーム内に、類似の処理を集めてトグルボタンの押下状態により処理しているです。
トグルボタンを、コマンドボタンに変えると、あるコマンドボタンを押した時に他のボタンを押されない状態にするという処理が必要になってきます。

 
??発動契機をボタンに変えるだけなのでは?
フレームの外に、コマンドボタンを配置し、
   フレーム内のトグルボタンの値を変更させた後、そのボタンをクリックさせ、マクロ発動させる と言うことですよ。
 
 
コーヒー飴 さんも仰っていますが、提示されたコード内容が実際のコードと同一なのかどうなのかは
質問者には判りませんから、推測で話している部分も多くあります。
 
少なくとも frmの値と比較しているのが、Me.tBtn1.OptionValue と言うのはおかしいですが
本来のコードは、tBtn1、tBtn2、tBtn3 であると思い回答しています。
 
他には、
 フレームのクリックのほかに、変更イベントや
  トグルボタンの変更イベント等があり、イベントの連鎖が起きているとか
コントロールが、連結コントロールの場合、その連結されたフィールドの値が表れているとか。
 
今回の様な、希望の動作と違う というのは、提示されていない部分に原因が隠されている事が多いです。
 
 
どうしても希望通りにならないのであれば、目線を変えるのも一案です。
並び順を逆にする。これだけで スクロールの必要は無いです。
 
新規入力が必要なフォームであれば、非連結のコントロールを配し、追加ボタンで INSERT を行うとか。

投稿日時: 21/05/25 16:35:52
投稿者: takodo

多くの貴重な意見をありがとうございます。
 
>フォームを開いている途中で RecordSource を変更するというのはちょっとリスキーな感じです。
私、この方法を多用してきました。テーブルは同じでも、Where,Order BYの他、Groupなど
ときには、テーブル自体も変えたりしてきました。
何かリスキーなことが考えられるのでしょうか。
 
>タイマー時イベントで時間差で実行するという方法ではうまくいかないといかことでしたが、
>時間差を増やしても同じでしょうか。
> Me.Me.TimerInterval = 3000 '3秒後に実行
どれだけ時間差をとっても同じです。
goLast()が実行された後、トグルボタンが押されない状態になってしまいます。
 
>RecordSource は変更せずに、FilterプロパティとOrderByプロパティで抽出と並べ替えをするという方法は試されましたか。
試しました。
改善されませんでした。
 
>??発動契機をボタンに変えるだけなのでは?
>フレームの外に、コマンドボタンを配置し、
> フレーム内のトグルボタンの値を変更させた後、そのボタンをクリックさせ、マクロ発動させる と言うことですよ。
なるほどです。
でも、これ、トグルボタンの数だけ更にコマンドボタンを用意すると言うことでしょうか?
 
 
>少なくとも frmの値と比較しているのが、Me.tBtn1.OptionValue と言うのはおかしいですが
>本来のコードは、tBtn1、tBtn2、tBtn3 であると思い回答しています。
グループフレーム内のトグルボタンです。
だから、フレームの値は、トグルボタンのオプション値、Me.tBtn1.OptionValueとなります。
 
 
>フレームのクリックのほかに、変更イベントや
>トグルボタンの変更イベント等があり、イベントの連鎖が起きているとか
特に、goLast()の処理が行われた後に、予期しないイベントが発生していないか
私なりに、いろいろと調べたのですが、見つけられないです。
 
>コントロールが、連結コントロールの場合、その連結されたフィールドの値が表れているとか。
連結コントロールではありません。
 
>今回の様な、希望の動作と違う というのは、提示されていない部分に原因が隠されている事が多いです。
そうですよね。何度そんなことがあったことか。
 
 
>どうしても希望通りにならないのであれば、目線を変えるのも一案です。
そうですよね。
 
>並び順を逆にする。これだけで スクロールの必要は無いです。
>新規入力が必要なフォームであれば、非連結のコントロールを配し、追加ボタンで INSERT を行うとか。
このようにしてしまったら、操作性が大きく変わってしまいます。
元もこもないです。
 
 
更に、追記
フレームが押したトグルボタンが押されていない状態になっても、そのオプション値を保持している。
これを、確認する方法として、今まで、Debug.Printで行っていました。
今回別の方法として、新たに、コマンドボタンを用意しました。
そして、一連の処理が終わり、トグルボタンが押されない状態にもどる。
その後、新たに用意したコマンドボタンをクリックしMsgBoxでフレームの値を表示確認しました。
フレームの値は押したトグルボタンのオプション値でした。
MsgBoxで確認後何かキーを押すと、トグルボタンが押された状態に変化しました。
 
ならばと、フレームのクリックイベントの一連の操作の最後に
この、新たに用意したコマンドボタンクリックイベントをCallして実行しました。
すると、MsgBoxで、フレームの値を表示します。
しかし、その後に、トグルボタンは押されない状態に戻ってしまいました。
一連の処理の後ではフレームの値をMsgBoxで確認する処理をしてもダメでした。
 
みなさんに、貴重なアドバイスを頂きながら解決できなくて申し訳ないです。
何とか、頑張ります。
 
処理内容自体に不具合はありませんから、
トグルボタンを二度押しすれば押された状態となるのですが。
先にも書かせていただいたように、二度目に押した時は
トグルボタンの見た目が押された状態に変わるだけで
クリックによるイベントも発生しないです。見た目を変えるだけです。
無理にトグルボタンを、押された状態にしなくても処理自体は正しく行われているから
見た目を気にしなければ良い。ま、良いか。
これでは、何か悔しい。
アクセスの不具合!!!
と叫びたくなります。

回答
投稿日時: 21/05/25 18:13:40
投稿者: hatena
投稿者のウェブサイトに移動

> グループフレーム内のトグルボタンです。
> だから、フレームの値は、トグルボタンのオプション値、Me.tBtn1.OptionValueとなります。
 
すべて Case Me.tBtn1.OptionValue となっているけど、下記のようにしないとダメだと思いますが。
(コーヒー飴さんやSuzuさんも指摘していますか)
 
    Select Case Me.flm
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn2.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn3.OptionValue
            strRecSrc="SELECT ・・・・"
    End Select
 
当方で簡単なサンプルを作成してみましたが(上記のコードに修正して)、現象は再現できませんでした。
環境の差なのか、提示されていない他の部分が影響しているのか分かりませんので、
これ以上のアドバイスは難しいですが、最後にダメもとで一つだけ提案してみます。
 
> フレームが押したトグルボタンが押されていない状態になっても、そのオプション値を保持している。
> これを、確認する方法として、今まで、Debug.Printで行っていました。
 
データは変更されているが、それが表示上は反映されていない状態のようですので、
 
Me.Repaint
か、
Me.Recalc
を最後に追加したらどうだろう。
 
これでだめなら、私にはお手上げです。

投稿日時: 21/05/25 19:55:47
投稿者: takodo

一緒に考えていただき
お礼の申しようもありません。
>当方で簡単なサンプルを作成してみましたが(上記のコードに修正して)、現象は再現できませんでした。
そうですか。
私のアクセス2003
バージョン情報は
Microsoft Office Access 2003(11.5614.5606)
Microsoft Office Professinal Edirion 2003 の一部
Copyright 1992-2003 Microsoft Corporation. All right reserves.
となっています。
 
Me.Repaint
Me.Recalc

goLast()の処理の後に記載してみました。
また、
フレームをクリックして一連の処理を行い、preVにより値を戻してからも
同様に記載してみました。
改善はありません。
 
先にも書かせていただいたように
処理自体に問題はありません。
ただ、トグルボタンを押したにもかかわらず、処理が終了すると
押した状態から、押されない状態に戻ってしまうだけです。
 
なにかしっくりしないです。
 
改めて、みなさん、ありがとうございました。

回答
投稿日時: 21/05/26 09:11:05
投稿者: Suzu

引用:
>フレームのクリックのほかに、変更イベントや
>トグルボタンの変更イベント等があり、イベントの連鎖が起きているとか
特に、goLast()の処理が行われた後に、予期しないイベントが発生していないか
私なりに、いろいろと調べたのですが、見つけられないです。

 
多分、この イベントの連鎖や、コントロールソース や 条件付き書式 との兼ね合いが今回の原因と思います。
 
各値を順次 コメントアウトや、空白にすることでテストを行い、原因を探ります。
 
・各イベントプロシージャをコメントアウト
・条件付き書式の削除
・コントロールの非連結化
 
 
 
なので、以下は直接関係無いとは思いますが・・・
 
引用:
>フォームを開いている途中で RecordSource を変更するというのはちょっとリスキーな感じです。
私、この方法を多用してきました。テーブルは同じでも、Where,Order BYの他、Groupなど
ときには、テーブル自体も変えたりしてきました。
何かリスキーなことが考えられるのでしょうか。

 
連結フォームですから、コントロールにデータを入力し、
フォーカスの移動、カレントレコードの移動により、レコードソースのレコードの編集が行われます。
レコードソースを変える際に、そのレコード編集が中途半端になる恐れがあると言うことです。
 
コントロールの値を編集中に、レコードソースの変更を行う事で、
レコードの編集者にとって、編集していない つもりでも編集されてしまっていたり、逆も然りです。
 
 
引用:
>??発動契機をボタンに変えるだけなのでは?
>フレームの外に、コマンドボタンを配置し、
> フレーム内のトグルボタンの値を変更させた後、そのボタンをクリックさせ、マクロ発動させる と言うことですよ。
なるほどです。
でも、これ、トグルボタンの数だけ更にコマンドボタンを用意すると言うことでしょうか?

 
+-----------------+
| +-----------+ |   +------------------+
| | トグル1 | |   | 処理実行ボタン |
| +-----------+ |   +------------------+
| +-----------+ |
| | トグル2 | |
| +-----------+ |     こういう話ですよ
| +-----------+ |
| | トグル3 | |
| +-----------+ |
+-----------------+
 
 
引用:
>少なくとも frmの値と比較しているのが、Me.tBtn1.OptionValue と言うのはおかしいですが
>本来のコードは、tBtn1、tBtn2、tBtn3 であると思い回答しています。
グループフレーム内のトグルボタンです。
だから、フレームの値は、トグルボタンのオプション値、Me.tBtn1.OptionValueとなります。

 
hatena さんが 改善案を提示くださっていますが、
 
    Select Case Me.flm
Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
        Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
    End Selec
 
  Case の後の比較対象の値が、 全て Me.tBtn1.OptionValue ですから、
  frm が、tBtn1 を選択した場合に、赤の部分が 実行されるだけで
            tBtn2,tBtn3 の場合は、実行されるコードがありません。
 
 つまり、
    Select Case Me.flm
        Case 1
            strRecSrc="SELECT ・・・・"
        Case 1
            strRecSrc="SELECT ・・・・"
        Case 1
            strRecSrc="SELECT ・・・・"
    End Selec
  と一緒であり、分岐になっていません。
 
 
 
引用:
>コントロールが、連結コントロールの場合、その連結されたフィールドの値が表れているとか。
連結コントロールではありません。
 
>今回の様な、希望の動作と違う というのは、提示されていない部分に原因が隠されている事が多いです。
そうですよね。何度そんなことがあったことか。
 
 
>どうしても希望通りにならないのであれば、目線を変えるのも一案です。
そうですよね。
 
>並び順を逆にする。これだけで スクロールの必要は無いです。
>新規入力が必要なフォームであれば、非連結のコントロールを配し、追加ボタンで INSERT を行うとか。
このようにしてしまったら、操作性が大きく変わってしまいます。
元もこもないです。

 
であれば、当方から提案できる事は無さそうです
 
感触からすると、Accessの不具合では無さそうな気がします。
本当に解決をしたいなら、ファイルをコピーしバックアップをとり、
機能をひとつづつ削除し、原因を明らかにする くらいでしょうか。

投稿日時: 21/05/26 10:00:06
投稿者: takodo

引用:
Select Case Me.flm
      Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
      Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
      Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
    End Selec

こんな単純なミスをしたコードを提示して質問していて失礼しました。
当然、
      Case Me.tBtn1.OptionValue
            strRecSrc="SELECT ・・・・"
       Case Me.tBtn2.OptionValue
            strRecSrc="SELECT ・・・・"
       Case Me.tBtn3.OptionValue
            strRecSrc="SELECT ・・・・"
です。
実際には、もっと多くのトグルボタンを配置していますが。
あるトグルボタンについては、押した状態が保持される。
あるトグルボタンについては、押されない状態となってしまう。
また、まれに、いつも戻ってしまうのに、押された状態が保持されることもあります。
 
いろいろなことを何回も試していて最近気がついたことがあります。
goLast()の処理が終わった後、
アクセスのツールバーのところに表示される
「コピー」「貼り付け」「昇順で並び替え」「降順で並び替え」などのアイコンが使用不可能となることがあります。
どのような時かというと、
トグルボタンが押された状態を保持する時、押された状態から押されない状態に変わったとき。
そのまま使用可能です。
しかし、トグルボタンが押されない状態に戻ってしまい、それをも一度押して押された状態にすると
アイコンの色がが、グレーに変わり使用できなくなってしまいます。
他のトグルボタンを押せば、使用可能な状態に戻ります。
 
引用:
感触からすると、Accessの不具合では無さそうな気がします。

私もそんな気がして原因解明できないものかと調べてきたのですが。
この現象に気づいたのは、もう数年前からです。
様々なテーブルを、group,where,order by などを設定を変更しながら扱っています。
だから、いろいろな帳票フォームで同様な現象が現れています。
時々、原因を調べてはわからないであきらめて・・・
そんなことを何回も繰り返してきました。
トグルボタンの見ためのことであって処理自体に不具合がないので
余裕がある時に調査してきました。
 
そして、今回はこちらのお力もお借りしてなんとか原因究明をと思い質問させていただきました。
多くの方から多くのアドバイスを頂きありがとうございました。

回答
投稿日時: 21/05/26 10:14:47
投稿者: コーヒー飴

それでもなんとなく記述コードに不具合があるような気がします。
記述されているVBAコードの無修正全容が開示されないので、これ以上は回答するにも無理が感じられます。
灯りを持たずの洞窟探検状態で、これだけの回答者さんが応答しているのに出口が見つからないわけです。
 
とりあえず
・VBEよりコンパイルしてみる
・修復/最適化してみる
・新規DBに現状DBの全オブジェクトをインポートしてみる
で、ダメなら諦めるしかないことでしょう。

回答
投稿日時: 21/05/26 11:45:56
投稿者: sk

引用:
連結していないです。

・フォームの Current イベントの発生時に
 何の処理(イベントプロシージャ、埋め込みマクロ)も
 実行していない。
 
・各トグルボタンのどのイベントの発生時においても
 何の処理(イベントプロシージャ、埋め込みマクロ)も
 実行していない。
 
・[flm]の Value プロパティや ControlSource プロパティを
 書き換えるコードがどこにも記述されていない。
 
・イベントラッパークラスを使用したりもしていない。
 
引用:
また、レコードソースを切り替えて、
トグルボタンが押されない状態になった後に
もう一度、同じトグルボタンを押すと押された状態になります。
しかし、このとき、flmにクリックイベントは発生しません
ただ、トグルボタンが押された状態に変わるだけです。

引用:
トグルボタンを二度押しすれば押された状態となるのですが。
先にも書かせていただいたように、二度目に押した時は
トグルボタンの見た目が押された状態に変わるだけで
クリックによるイベントも発生しない
です。見た目を変えるだけです。

・別のトグルボタンをクリックした場合は
 イベントプロシージャが実行される。
 
以上の全てに該当するのであれば、恐らく環境由来の不具合ではないか、
というのが、今のところの私の見解。
 
引用:
Windows 10 Home : Access 2003

とりあえず、Office 2013 以上のバージョンの Access が
インストールされている別の環境で実行してみても同じ現象が
再現されるかどうかを確認なさればはっきりするでしょう。
 
いずれにしても、Windows 10 での動作環境が全く保証されていない
バージョンを使用している以上、この手の不可解な現象が起こっても
不思議ではないでしょうし、その場合における根本的な解決手段は
「新しいバージョンの Access に移行すること」しかありません。

回答
投稿日時: 21/05/26 15:04:44
投稿者: Suzu

引用:
こんな単純なミスをしたコードを提示して質問していて失礼しました。

 
ですよね。 Me.tBtn1.OptionValue を推されていたので、回答者側としては混乱してしまいました。
 
 
引用:
実際には、もっと多くのトグルボタンを配置していますが。
あるトグルボタンについては、押した状態が保持される。
あるトグルボタンについては、押されない状態となってしまう。
また、まれに、いつも戻ってしまうのに、押された状態が保持されることもあります。

 
コントロール数が多い場合、動作が不安定になる事があります。
特に、VBAで処理しようと時には顕著に表れる事があります。
 
フォームをコピーしバックアップを取り、
今回の処理に処理に関係なさそうな部分の コントロールを削除
再コンパイルを行い、テストを行ってみてください。
 
 
引用:
「コピー」「貼り付け」「昇順で並び替え」「降順で並び替え」などのアイコンが使用不可能となることがあります。
引用:
他のトグルボタンを押せば、使用可能な状態に戻ります。

トグルボタンが悪さをしているかも知れません。
 
トグルボタンを全部削除、トグルボタン再配置(コントロール名修正)
トグルボタンを全部削除、トグルではなく、オプションボタンを配置
      (コントロール名を削除したトグルと同じものに修正)
等を行い、コンパイルの上実行
 
 
 
不具合 を 不具合と感じ、改善をするつもりがあるのであれば、テストを行い原因を探る必要があるのでしょう。
もっとも、Windows10 と Access2003 の環境に 起因する問題であれば 回答者の方々には検証する方法は無いと思います。
 
また、どこかで、2003 を 捨てなければならない 時は 来るのですが、、
!!あ !! まさか、、mdbではなく、ADPとか?? それは余計に検証できる人は居なさそう。。
 
上記を書いて居て気づきましたが、、
レコードソースの変更を行うと言うことは、レコードセットを開きなおすことになります。
 
そのレコードセットを開くのに時間を要する為、ボタンがグレーアウトしているのでは?
 
 
あるいは、レコードソースに問題がる為、レコードセットが開けないが、エラートラップをしているせいで
 
トグルボタンを押しなおす と言うことは、 その時に、もう一度 Click イベントが 発生しませんか?
 
とっ散らかった文章になりましたが、、参考になれば。

投稿日時: 21/05/26 16:47:36
投稿者: takodo

こんなにいろいろな方法を皆さんにご提示いただき感謝の申しようもありません。

コーヒー飴 さんの引用:
とりあえず
・VBEよりコンパイルしてみる
・修復/最適化してみる
・新規DBに現状DBの全オブジェクトをインポートしてみる

MDEを作ろうとしたら、次のようなエラーが発生しできませんでした。

MDEデータベースを作成できませんでした。
このエラーは通常、大きなデータベースをMDEファイルにコンパイルする場合に起こります。
データベースをコンパイルするのに、多くのTableIDの参照がテーブルごとに作成されます。
MicrosoftJetデータベースエンジンバージョン4.0では一度に2048までのTableIDしか作成できません。
テーブル、マクロ、フォーム、リポートなどの多くのオブジェクトを含むデータベースをMDEファイルとしてエクスポートする場合に上限を超える可能性があります。

 
sk さんの引用:
とりあえず、Office 2013 以上のバージョンの Access が
インストールされている別の環境で実行してみても同じ現象が
再現されるかどうかを確認なさればはっきりするでしょう。

sk さんの引用:
とりあえず、Office 2013 以上のバージョンの Access が
インストールされている別の環境で実行してみても同じ現象が
再現されるかどうかを確認なさればはっきりするでしょう。

できるものならですが・・・
そのような環境は望めないです。
 
Suzu さんの引用:

トグルボタンが悪さをしているかも知れません。
トグルボタンを全部削除、トグルボタン再配置(コントロール名修正)
トグルボタンを全部削除、トグルではなく、オプションボタンを配置
      (コントロール名を削除したトグルと同じものに修正)

これについては私も気になりまして
全てではありませんが、気になるトグルボタンを一度削除して新たに作り直しました。
しかし、改善されませんでした。
 
Suzu さんの引用:
!!あ !! まさか、、mdbではなく、ADPとか?? それは余計に検証できる人は居なさそう。

mdbです。
 
Suzu さんの引用:
トグルボタンを押しなおす と言うことは、 その時に、もう一度 Click イベントが 発生しませんか?

どのようなイベントが発生しているかを私のできる限り調べました。
少なくとも、もう一度 Click イベントが 発生していませんでした。

回答
投稿日時: 21/05/26 17:32:37
投稿者: sk

引用:
どのようなイベントが発生しているかを私のできる限り調べました。
少なくとも、もう一度 Click イベントが 発生していませんでした。

1 つ以上のトグルボタン(またはオプションボタン/チェックボックス)を
子コントロールとするオプショングループにおいて、
選択済みのオプションが(再び)クリックされても
そのオプショングループの Click イベントが発生しない
(未選択のオプションを選択すれば発生する)のは、
Access のオプショングループの動作として至って正常です
 
既にご確認された通り、クリック後のオプショングループの値が
選択されたトグルボタンのオプション値と同じであることが
間違いないのであれば、この現象においておかしな点はただ1つ、
「実際の選択状態(値)と画面上の表示内容が明らかに食い違っている」
という、オプショングループとその子コントロールの描画処理の挙動だけです。
 
T'sWare Access Tips より
https://tsware.jp/tips/tips_643.htm
 
引用:
できるものならですが・・・
そのような環境は望めないです。

まあ少なくとも、本スレッドで語られている現象を(私も含めた)
どの回答者の環境においても再現することが出来ていないことだけは
確かでしょう。

投稿日時: 21/05/26 19:26:17
投稿者: takodo

sk さんの引用:
まあ少なくとも、本スレッドで語られている現象を(私も含めた)
どの回答者の環境においても再現することが出来ていないことだけは
確かでしょう。

そのようですね。
sk さんの引用:
T'sWare Access Tips より
https://tsware.jp/tips/tips_643.htm

こんな情報も提供していただき、アクセスをすごい究められていることが伝わってきます。
極め方が半端じゃないですね。
 
私はMsAccess97から使い始めて、AC2000で大きくその仕様が変わり、
これが完成版だというように思ってきました。
AC2000以降は表面上の違いばかりのマイナーチェンジのみ。
でも、さすがに20年経過している。
よくもここまで2003年のものが使えていると驚きです。
それなりにアクセスを覚えたお陰で私用のデータ管理にとても役に立ってきました。
自分のことを書く場所でもないところで感慨にふけったりして、すみません。
 
このスレッド、そのまま解決済みにしないでおきたいです。
多くの方が見られると思うから同じような動作を経験された人がいたら是非とも教えていただきたいです。

投稿日時: 21/05/27 08:28:20
投稿者: takodo

完全に解決ではないですが、報告です。
ツール − オプション − フォーム/レポート −
□フォーム上のコントロールにWindowsのテーマを使用する(T)
にチェックを入れると、
トグルボタンクリックにより
凹凸が変わるのでなく
色が変わって選択/非選択している状態を表現するように変わりました。
そして、
色が変わることにより該当のトグルボタンが選択されている状態を表現する場合
そのまま、選択された色が保持されます。つまり、押された状態のままとなっています。
ご指摘いただいたように

Suzu さんの引用:
もっとも、Windows10 と Access2003 の環境に 起因する問題であれば 回答者の方々には検証する方法は無いと思います。

アクセスが、2003と古すぎることが原因なのかと思うに至ります。

回答
投稿日時: 21/05/27 10:02:50
投稿者: Suzu

sk さんの引用:
選択済みのオプションが(再び)クリックされても
そのオプショングループの Click イベントが発生しない
(未選択のオプションを選択すれば発生する)のは、
Access のオプショングループの動作として至って正常です

 
そうでしたね。失礼いたしました。

トピックに返信