Excel (VBA)

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

 
(Windows 11 Home : Excel 2019)
チェックボックスに基づく集計
投稿日時: 23/08/14 12:31:11
投稿者: shimoichimabu

現在、A列にチェックボックスをワークシート上に10個配置しています。
CheckBox1、CheckBox2、・・・、CheckBox10
B列に金額が入力されています。
ワークシート上にテキストボックスに配置しています。(合計金額表示用)
また、ワークシート上にマクロ実行ボタンを配置しています。
 
  A    B
  □   1,200
  □   1,500
  □   1,600
・・・・・・・・・
・・・・・・・・・
  □   2,200
チェックボックスにチェックを付け、マクロ実行ボタンを押すと、それに対応したB列の
金額の合計値をテキストボックスに表示させるようにしています。
 
Private Sub 合計確認Button_Click()
 
Dim N As Long
     
    For N = 1 To 10
        If OLEObjects("CheckBox" & N).Object.Value = True Then
            msg = msg + Range("B" & N).Value
        End If
    Next
     
    ActiveSheet.DrawingObjects("合計金額").Text = "¥ " & StrConv(Format(msg, "#,#00"), 4)
     
End Sub
 
これをマクロ実行ボタンではなく、チェックボックスにチェックを付けただけで
リアルタイムに金額の合計値をテキストボックスに表示したいです。
ただ、
Private Sub CheckBox1_Click()
・・・・・
End Sub
 
Private Sub CheckBox2_Click()
・・・・・
End Sub
・・・・・
・・・・・
 
Private Sub CheckBox10_Click()
・・・・・
End Sub
 
と、順次コードを作成すればできると思いますが、冗長になります。
任意のチェックボックスをクリックすれば、イベントが起こるコードがわかりません。
ワークシートの場合はchangeイベントがありますが・・・・。
説明が悪くてすみません。

回答
投稿日時: 23/08/14 14:03:11
投稿者: WinArrow

引用:

これをマクロ実行ボタンではなく、チェックボックスにチェックを付けただけで
リアルタイムに金額の合計値をテキストボックスに表示したいです。

 
話がみえないですが・・・・
 
チェックボックスは、セルBに対応しているですよね?
 
そのチェックボックスONの時、セルBnの値をテキストボックスに表示するだけなんでsか?
合計する対象が分かりませんが・・・

回答
投稿日時: 23/08/14 14:23:00
投稿者: WinArrow

私見の理解ーーーーーーー
チェックボックスが「10」個あります。
チェックボックスON/OFFは、A列セルの対応しています。
右隣のB列には金額が入力されています。
チェックボックスONに対応した金額を集計したいです。
ーーーーーー
という前提で、
チェックボックスのプロパテイでリンク先セルを設定します。

CheckBox1のLinkdCellは「A1」とする
 
セルB11に次の数式を入力する
=SUMIF(A1:A10,TRUE,B1:B10)
 
テキストボックス不要、マクロ不要
 
 
 

回答
投稿日時: 23/08/14 15:19:29
投稿者: WinArrow

引用:
ActiveSheet.DrawingObjects("合計金額").Text = "¥ " & StrConv(Format(msg, "#,#00"), 4)

 
ActiveXのテキストボックスは、手操作で入力/更新できてしまいます。
シートを保護するなどの対応が必要と思われます。

回答
投稿日時: 23/08/14 15:31:35
投稿者: Suzu

チェックボックスの対応したセルのデータの合計なら
 WinArrowさんの提示されている方法の方が楽でしょう。
 
当方なら、そもそも、CheckBox を使用しませんね。
1を入れさせる か、0を入力させるか。
 (印刷を考えるなら、セルの書式設定で、"x";"x";"y" を 設定 しますかね。)
     x には、「チェック」の読み変換 で出る □の中にレ が入った文字(=UNICHAR(9745))
   y には、□
 
 
VBAで行う必要があるのであれば、各チェックボックスのイベントで
実プロシージャを Callすれば 良いのでは?
 
 
でも、多分意図としては
・Withevents
・クラス定義
を使って 実行する事なのでしょうね。
 
「VBA Class Event」 をキーワードにWEB検索してみましょう。

回答
投稿日時: 23/08/14 19:02:36
投稿者: WinArrow

前レスで
>テキストボックス不要、マクロ不要
と書いてしまいましたが、
 
テキストボックスが必要の場合の対応策を紹介しておきます。
 
ActiveXのテキストぼっくすではなく、
「挿入」「図形」の中のテキストボックスを使います。
このテキストボックスを選択して置いて、
「数式バー」に
=B11
と入力します。・・・・・セルB1の表示状態が反映されます。
 
セルB11の「表示形式」で「ユーザー定義」
=[DBNUM3]\#,##0
を設定します。
 
これは、全角文字表示の指定です。「値」は、あくまでも数値です。
なお、SuMiF関数のセルは、説明の都合上、B11にしただけなので、
都合のよいセルに変更しtも構いません。

投稿日時: 23/08/14 20:56:52
投稿者: shimoichimabu

WinArrowさん回答ありがとうございます。
 
私見の理解ーーーーーーー
チェックボックスが「10」個あります。
チェックボックスON/OFFは、A列セルの対応しています。
右隣のB列には金額が入力されています。
チェックボックスONに対応した金額を集計したいです。
ーーーーーー
はい、おっしゃる通りです。
 
LinkdCellを使用することができるのですね。
早速、LinkdCellを設定し、セルD1に =SUMIF(A1:A10,TRUE,B1:B10) を入力し、
更に、テキストボックスを選択し、数式バーに =D1 と入力して
マクロを使用せずに、希望することが出来ました。
有難うございました。
 
Suzuが提言されたクラス定義については、
そのサイトを見てみましたが、私には敷居が高かったです。
機会があれば、勉強してみたいと思っています。