Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1999 / 13645 ツリー ←次へ | 前へ→

【70570】チェックボックスのチェック数について atsjack 11/12/1(木) 22:53 質問[未読]
【70571】Re:チェックボックスのチェック数について atsjack 11/12/1(木) 23:19 発言[未読]
【70572】Re:チェックボックスのチェック数について UO3 11/12/1(木) 23:22 発言[未読]
【70573】Re:チェックボックスのチェック数について atsjack 11/12/1(木) 23:33 お礼[未読]
【70574】Re:チェックボックスのチェック数について みそじのおじさん 11/12/1(木) 23:43 発言[未読]
【70575】Re:チェックボックスのチェック数について atsjack 11/12/1(木) 23:57 お礼[未読]
【70576】Re:チェックボックスのチェック数について みそじのおじさん 11/12/2(金) 0:13 発言[未読]
【70577】Re:チェックボックスのチェック数について atsjack 11/12/2(金) 10:17 お礼[未読]

【70570】チェックボックスのチェック数について
質問  atsjack  - 11/12/1(木) 22:53 -

引用なし
パスワード
   ユーザーフォームにてチェックボックスのチェック数を
ユーザーフォーム内に動的に表示させたいと考えております。
5つあるチェックボックスのうち、2個チェックしたら、ユーザーフォーム内のテキストボックスに"2"と表示させる。

チェックボックスが一つの場合は、表示できたのですが、
複数の場合、動的に表示させるにはどのようなコードになりますでしょうか。

また、チェックを外した場合も再計算し、正確な数字を表示したいです。

宜しくお願いいたします。

以下は、現在のコードです。

Private Sub CheckBox1_Click()

  Dim cnt As Long

  If CheckBox1.Value = True Then
    
    cnt = cnt + 1
    total.Value = cnt
  
  End If

End Sub

【70571】Re:チェックボックスのチェック数について
発言  atsjack  - 11/12/1(木) 23:19 -

引用なし
パスワード
   追記いたします。

表示させるタイミングは、各チェックボックスをクリックした時にです。
また、チェックボックスの名前は"checkbox1"〜"checkbox40"
というパターンです。

▼atsjack さん:
>ユーザーフォームにてチェックボックスのチェック数を
>ユーザーフォーム内に動的に表示させたいと考えております。
>5つあるチェックボックスのうち、2個チェックしたら、ユーザーフォーム内のテキストボックスに"2"と表示させる。
>
>チェックボックスが一つの場合は、表示できたのですが、
>複数の場合、動的に表示させるにはどのようなコードになりますでしょうか。
>
>また、チェックを外した場合も再計算し、正確な数字を表示したいです。
>
>宜しくお願いいたします。
>
>以下は、現在のコードです。
>
>Private Sub CheckBox1_Click()
>
>  Dim cnt As Long
>
>  If CheckBox1.Value = True Then
>    
>    cnt = cnt + 1
>    total.Value = cnt
>  
>  End If
>
>End Sub

【70572】Re:チェックボックスのチェック数について
発言  UO3  - 11/12/1(木) 23:22 -

引用なし
パスワード
   ▼atsjack さん:

あまりこらないで、素直にやるとすれば。
以下は、CheckBoxが4個ある場合のサンプルです。

Private Sub CheckBox1_Click()
  Call countcheck
End Sub
Private Sub CheckBox2_Click()
  Call countcheck
End Sub
Private Sub CheckBox3_Click()
  Call countcheck
End Sub
Private Sub CheckBox4_Click()
  Call countcheck
End Sub

Private Sub countcheck()
  Dim i As Long
  Dim n As Long
  
  For i = 1 To 4
    If Me.Controls("CheckBox" & i).Value Then n = n + 1
  Next
  
  total.Value = n
  
End Sub

【70573】Re:チェックボックスのチェック数について
お礼  atsjack  - 11/12/1(木) 23:33 -

引用なし
パスワード
   ご返答ありがとうございました。意図する動作ができました。
勉強になります。

各チェックボックスに個別に設定すれば出来そうだとはなんとなく思っていましたが、数十個あると効率的な書き方があるのかな?と思っておりました。
※ここでいうMe.Controls("CheckBox" & i)のような。

本題とはすこしずれますが、
プロシージャに上記のような変数を用いることはできないですか?


▼UO3 さん:
>▼atsjack さん:
>
>あまりこらないで、素直にやるとすれば。
>以下は、CheckBoxが4個ある場合のサンプルです。
>
>Private Sub CheckBox1_Click()
>  Call countcheck
>End Sub
>Private Sub CheckBox2_Click()
>  Call countcheck
>End Sub
>Private Sub CheckBox3_Click()
>  Call countcheck
>End Sub
>Private Sub CheckBox4_Click()
>  Call countcheck
>End Sub
>
>Private Sub countcheck()
>  Dim i As Long
>  Dim n As Long
>  
>  For i = 1 To 4
>    If Me.Controls("CheckBox" & i).Value Then n = n + 1
>  Next
>  
>  total.Value = n
>  
>End Sub

【70574】Re:チェックボックスのチェック数について
発言  みそじのおじさん  - 11/12/1(木) 23:43 -

引用なし
パスワード
   atsjack さん UO3さん。こんばんは。

クラスモジュールで処理をする簡単なサンプルです。
(UO3さん、クラスバカでごめんなさい^^)

クラスモジュールを1つ挿入します。名前はデフォルトのClass1のままで
結構です。

Class1

Option Explicit

Private WithEvents mCheckBox As MSForms.CheckBox
Private mTargetForm     As Object

Public Sub Init(ByVal NewCheckBox As MSForms.CheckBox, ByVal NewForm As Object)
  Set mCheckBox = NewCheckBox
  Set mTargetForm = NewForm
End Sub

Private Sub Class_Terminate()
  Set mCheckBox = Nothing
  Set mTargetForm = Nothing
End Sub

Private Sub mCheckBox_Click()
  Call mTargetForm.CheckCount_Calculate
End Sub

Class1ここまで

該当UserFormのモジュールに

Option Explicit
Private myCheckBox() As Class1

Private Sub UserForm_Initialize()

  Dim chk As Object
  Dim i  As Long
  
    'UserFormに配置してあるコントロールを全て列挙
    For Each chk In Me.Controls
      '変数chkがCheckBoxだったら
      If TypeName(chk) = "CheckBox" Then
        '配列のサイズをRedimして確保
        ReDim Preserve myCheckBox(i) As Class1
        'クラスのインスタンスを作成し配列に確保
        Set myCheckBox(i) = New Class1
        'クラスのメソッド"Init"を呼び出しCheckBoxとUserFormを登録
        myCheckBox(i).Init chk, Me
        '次のCheckBoxの格納の為にiを+1
        i = i + 1
      End If
    Next
End Sub

Private Sub UserForm_Terminate()
  'クラスを解放
  Erase myCheckBox
End Sub

'checkされている数をカウントするプロシージャ
'このプロシージャのスコープはpublic
Public Sub CheckCount_Calculate()

  Dim chk As Object
  Dim c  As Long
  
    For Each chk In Me.Controls
      If TypeName(chk) = "CheckBox" Then
        'CheckBox.ValueがTrueなら+1
        If chk.Value Then
          c = c + 1
        End If
      End If
    Next
    
    Debug.Print "Checkされている数は、" & c
   
End Sub

このクラスはクラスに登録したCheckBoxにイベント(Click)が
発生するとUserFormに用意したカウントをするプロシージャ
を呼びだす仕組みです。

クラスモジュールは大変便利です。是非押さえてくださいね。

【70575】Re:チェックボックスのチェック数について
お礼  atsjack  - 11/12/1(木) 23:57 -

引用なし
パスワード
   こんばんわ。連日のお返事ありがとうございます。

UO3にご提示頂いたコードでも動作しましたが、
今後の為に1行ずつ確認・理解しながら勉強したいと思います。

まだ動作などは確認しておりませんが、
たすかりました。ありがとうございます!

【70576】Re:チェックボックスのチェック数について
発言  みそじのおじさん  - 11/12/2(金) 0:13 -

引用なし
パスワード
   もし確認されるのなら、今あるフォームでなくテストの為に新規に作成して
CheckBoxの数を3つくらいにしたフォームでやってもらうと確認しやすいと
思います。(40個もあるとデバッグが大変だと思います)

昨日のスレですが、「初めて書いたVBAがあそこまで書けるなんてすごいなー。
何か別言語の経験のある方かな?」なんて思っていました。^^

それでは失礼します。

【70577】Re:チェックボックスのチェック数について
お礼  atsjack  - 11/12/2(金) 10:17 -

引用なし
パスワード
   こんにちわ。みそじのおじさんさん。

先に試験の件。その通りですね。
そうしたいと思います。

お察しの通り、webデザインで生計を立てていたことが
ありますので、多少は役に立っているのかなとおもいます。
HTMLはプログラムとは言いがたいですが。
ただ誰でもさわれるように、scriptなどは極力使わずに、HTML+CSSのみを基本としていたので、VBを勉強するに当たってなかなか苦労しています。
思い通りの動作を頭の中でざっくり組み立てれるくらいになりたいですね。

それでは。色々とありがとうございます。


▼みそじのおじさん さん:
>もし確認されるのなら、今あるフォームでなくテストの為に新規に作成して
>CheckBoxの数を3つくらいにしたフォームでやってもらうと確認しやすいと
>思います。(40個もあるとデバッグが大変だと思います)
>
>昨日のスレですが、「初めて書いたVBAがあそこまで書けるなんてすごいなー。
>何か別言語の経験のある方かな?」なんて思っていました。^^
>
>それでは失礼します。

1999 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free