Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
テーブル中のチェックボックスをカウント
投稿日時: 19/02/14 20:12:28
投稿者: Manabukunn

いつもお世話になっております。
サンプルとうテーブル名で構成ですが
最初のフィールドはオートナンバーで主キー(フィールド名:主キーID)
その他のフィールドはチェックボックスが複数個で構成されております。
現在、やりたいこととしてはチェックボックスでチェックが付いている
ものだけをカウントすることを目的としております。
チェックボックスの数があらかじめ30と分かっていれば
下記のようなもので何とか達成出来ました。
(主キーIDが2のものを対象としてチェック)
 
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
 
これを発展させてテーブルの中でチェックボックスの数をカウントして
(上の場合”30”をVBAで求める)
その中でチェックが付いているものの数をカウントする場合どのように
すればよいでしょうか。
宜しくお願いいたします。

回答
投稿日時: 19/02/14 20:29:51
投稿者: hatena
投稿者のウェブサイトに移動

1列目以外はすべてYes/No型(データシートビューではチェックボックス)ということでよろしいですか。
 
For i = 1 To RS.FieldsCount - 1
 
とすればいいでしょう。
 
ちなみに、RS(0) が1列目、RS(1)が2列目です。
 
しかしテーブル設計で、フィールド数が固定でないというのはデータベースとしてはありません。
「テーブル 正規化」でWEB検索して、データベース設計の基本を理解されることをお勧めします。

投稿日時: 19/02/14 21:07:40
投稿者: Manabukunn

有難うございます。
こちらの書き方が悪かったです。
チェックボックスの数はもちろん固定してあるのですが
4つのテーブルがありそれぞれチェックボックスの数が
異なるために、一つのコードでできないかと思い
質問させていただきました。
 
hatenaさんから教えていただいたものが一番簡単で
非常にためになりました。
今後の勉強として再度追加で質問をさせていただきます
例えばテーブル中のフィールドのControlTypeを調べて
acCheckBoxであればカウントするという感じでVBAを
作成しようとして
 
For Each Ctl In RS.Controls
 
    If Ctl.ControlType = acCheckBox Then
       i = i + 1
        
    End If
Next
 
などを考えました。しかし、これだと
 RS.Controlsが不正の様で実行できません・・・
こちらに関する解決法もお願いいたします。

回答
投稿日時: 19/02/14 21:46:26
投稿者: hatena
投稿者のウェブサイトに移動

Control というのは、フォームやレポート上に配置するテキストボックスやチェックボックスやコマンドボタンなどなどのことです。
テーブルのレコードセットにコントロールはありません。
Yes/No型フィールドをデータシートビューで表示するときに、既定ではチェックボックスになるだけです。(データシートビューは自動生成されるフォームです。)
 
レコードセットのフィールドのデータ型が Yes/No型の場合、カウントしたいということですよね。
 
データ型は Typeプロパティで調べることができます。
Yes/No型 は adBoolean (11)
 

    For i = 1 To RS.Fields.Count - 1
        If RS(i).Type = adBoolean Then
            If RS(i).Value Then x = x + 1
        End If
    Next
    Debug.Print x

 
 

投稿日時: 19/02/15 07:27:24
投稿者: Manabukunn

いろいろとありがとうございました。
非常に助かり、また勉強になりました。
今後ともよろしくお願いいたします。