Access (VBA)

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

 
(Windows 10 Pro : Access 2016)
フォーム上のリアルタイムラベル更新
投稿日時: 19/02/15 08:44:39
投稿者: Manabukunn

再度質問させていただきました。”テーブル中のチェックボックスをカウント”
での質問中の下記のコードを使用してチェックボックスがあるフォーム上の
ラベルにこのコードの結果であるSJCを表示させることが目的です。
 
 
Sub Sample()
    Dim RS As ADODB.Recordset
    Dim i As Integer
    Dim x As Integer
      
    Set cn = CurrentProject.Connection
    Set RS = New ADODB.Recordset
      
  x = 0
  
  RS.Open "サンプル", cn, adOpenKeyset, adLockOptimistic
    
  RS.Filter = "主キーID = 2"
    
      
  For i = 2 To 30
     
    If RS(i).Value Then
      
    SJC = SJC + 1
      
    End If
 Next
      
End Sub
 
新しくフォームを開いたり、次のレコードに移動する場合は
Form_Current()に上のコードと
 Me!テキストボックス1.Caption = SJC
を記載すると可能であることは理解したのですが
フォーム上で新たにチェックボックスを変更した結果を
リアルタイムでフォーム上のテキストボックスに反映する方法が
わかりません。こちらに関してよろしくお願いいたします。

回答
投稿日時: 19/02/15 09:41:47
投稿者: sk

引用:
フォーム上で新たにチェックボックスを変更した結果を
リアルタイムでフォーム上のテキストボックスに反映する方法

引用:
For i = 2 To 30
    
  If RS(i).Value Then
     
  SJC = SJC + 1
     
  End If
Next

「フォーム上の全ての(あるいは一部の)チェックボックスの値を
合計し、正の数に反転させた結果を返す式」がコントロールソースに
設定された演算テキストボックスを配置なされば済むのではないでしょうか。
 
(フォームモジュール)
-------------------------------------------------------------
Private Sub Form_Load()
     
    Dim ctl As Access.Control
    Dim strExpression As String
    
    For Each ctl In Me.Section(0).Controls
        If ctl.ControlType = acCheckBox Then
            strExpression = strExpression & _
                            "+[" & ctl.Name & "]"
        End If
    Next
     
    If strExpression <> "" Then
        strExpression = "=-(" & Mid(strExpression, 2) & ")"
    End If
     
    Me.演算テキストボックス名.ControlSource = strExpression
 
End Sub
-------------------------------------------------------------
 
演算テキストボックスの[コントロールソース]プロパティを
自動的に設定する場合は上記のようなコードを実行なさればよいはず。

投稿日時: 19/02/15 12:46:59
投稿者: Manabukunn

有難うございます。
最初、.nameとか出てきて理解できませんでしたが
コントロールソースでの演算式だとわかりなんとか理解出来ました。
そもそも、コントロールソースに評価したいコントロールボックスを
すべて足していけばいいことは理解できました。
 
以上理解できたのですが、VBAでやろうとするともう一点質問があるので
お願いいたします。
今回、フォーム上のチェックボックスは複数個のテーブルを参照しております。
例えば、これらのテーブル別に参照(Each ctl In Me.Section(0).Controls のように
すべてではなく)する場合はどのように書き直せばよりでしょうか。
よろしくお願いいたします。

回答
投稿日時: 19/02/15 14:15:16
投稿者: sk

引用:
今回、フォーム上のチェックボックスは複数個のテーブルを参照しております。

そのフォームのレコードソースが、「 2 つ以上のテーブルを
内部結合(または外部結合)し、それぞれのテーブルから
任意の Yes/No 型のフィールドを選択した結果」を返す
選択クエリである、という意味でおっしゃっているのでしょうか。
 
引用:
例えば、これらのテーブル別に参照(Each ctl In Me.Section(0).Controls のように
すべてではなく)する場合はどのように書き直せばよりでしょうか。

例えば、[テーブルA]のフィールドと連結している[チェック1]と[チェック2]、
[テーブルB]のフィールドと連結している[チェック3],[チェック4],[チェック5]
という 5 つのチェックボックスが 1 つのフォームの詳細セクション上に
配置されているとして、「[チェック1]と[チェック2]のうち、
チェックが入っている(値が True である)チェックボックスの数」を
表示するためのテキストボックスと、「[チェック3]と[チェック4]と
[チェック5]のうち、チェックが入っている(値が True である)
チェックボックスの数」表示するためのテキストボックスを
同じフォームの詳細セクションに配置なさろうとしているのでしょうか。
 
(前者の結果を返すテキストボックスの[コントロールソース]プロパティ)
--------------------------------------------------------------------
 
=-([チェック1]+[チェック2])
 
--------------------------------------------------------------------
 
(後者の結果を返すテキストボックスの[コントロールソース]プロパティ)
--------------------------------------------------------------------
 
=-([チェック3]+[チェック4]+[チェック5])
 
--------------------------------------------------------------------
 
以上のような式を、それぞれのテキストボックスの
[コントロールソース]プロパティに
デザインビューで)設定なさればよいでしょう。
 
また、「フォームの詳細セクション上にある全てのチェックボックスのうち、
チェックが入っている(値が True である)チェックボックスの数」を
表示させたいのであれば、
 
--------------------------------------------------------------------
 
=-([チェック1]+[チェック2]+[チェック3]+[チェック4]+[チェック5])
 
--------------------------------------------------------------------
 
のように、「全てのチェックボックスの値を合計し、正の数に
反転させた結果を返す式」を任意のテキストボックスの
[コントロールソース]プロパティに設定するだけです。
(それぞれのチェックボックスが、どのテーブルのフィールドと
連結しているかは関係がない)
 
引用:
最初、.nameとか出てきて理解できませんでしたが
コントロールソースでの演算式だとわかりなんとか理解出来ました。

私が例示したのは、フォームの Load イベントが発生した時に
フォームの詳細セクション上に配置されている
全てのチェックボックスを 1 つずつ参照しながら
それぞれの名前を取得し、上記の式と同様の文字列式を
自動的に生成し、その文字列式を任意のテキストボックスの
[コントロールソース]プロパティに設定する、というコードに過ぎません。
 
あとは「互いの値を足し合わせるチェックボックスの組み合わせ」が
何によって決まるか、それを誰が決めるのか、という問題です。

トピックに返信