プロが教える店舗&オフィスのセキュリティ対策術

ExcelのVBAで、チェックボックス(ActiveXコントロール)を使用し、各セル毎に設定する方法を教えてください。

はじめまして、VBA初心者です。
下記のように、各セルにチェックボックスを設け、VBA(セル内を値のみにする<Selection.Value = Selection.Value>)で各セル毎にチェックボックスが機能するようにしたいのですが、どのようにすれば宜しいでしょうか?

現状下記のようにチェックボックスを配置しております。
・A列には各番号が振ってあります。
・B列にチェックボックスを配置。
・C列に関数<=Today()>を使用して、設定してあります。
A B C
1 □ 2/23
2 □ 2/23
3 □ 2/23
4 □ 2/23
5 □ 2/23

VBA内での指示は以下になります。
Selection.Value = Selection.Value

ひとつのチェックボックスにはVBAを設定することはできたのですが、各チェックボックス(B2-B5以下)への設定が難航している状態です。

ちなみに下記VBAを設定しました。

Sub 関数値変換()

Range("c7").Select

Selection.Value = Selection.Value

End Sub

※また可能であれば、VBAと関数にて(もしくはいずれかで)、チェックボックスを使用時、TRUEであれば→selection.value、FALSEであれば元の関数に戻す、が行える方法を教えていただけますか。

大変申し訳ございませんが、皆様のお力添えのほどよろしくお願いします。

A 回答 (1件)

こんにちは。



> ExcelのVBAで、チェックボックス(ActiveXコントロール)を使用し、各セル毎に設定する方法を教えてください。

「初心者」となると、
ActiveXコントロールの扱いはまともにやるとなると結構難しいです。
易しい方法もありますが手数が掛かります。
もしもフォームコントロールのチェックボックスでも良ければ、
(ActiveXコントロールに比べてデザイン性・機能性は落ちますが)
かなり簡単に出来ます。
なので、
◆易しいけど手数が掛かる◆ActiveXコントロールを使用する例◆初級向き◆
◆簡単な◆フォームコントロールを使用する例◆初心者向き◆
◆少し難しい◆ActiveXコントロール+クラスを使用する例◆初中級向き◆
の3例挙げておきます。
どれを奨めるでもないので、自分に合ったやり方を見つけてみてください。

その前に、処理内容に関する共通したポイントについて。
まず、チェックボックスをセルに貼り付けるような手順等で
正しい位置(コントロールの左上がセルから食み出さない位置)
に配置してあるならば、
チェックボックスを配したセルのひとつ右のセルへの参照として
 checkbox.TopLeftCell.Offset(, 1) ...のように
一様な多数のチェックボックスに共通した記述が可能になります。
つまりこれは、チェックボックス毎ひとつひとつに
セル範囲を指定する必要はない、ということです。
次に、現在の日付を定数値で設定するだけなら
VBAにはDate()関数があるので
 checkbox.TopLeftCell.Offset(, 1).Value = Date
のような記述が可能です。
> Selection.Value = Selection.Value
> TRUEであれば→selection.value、FALSEであれば元の関数に戻す、が行える方法
Trueであれば現在の日付を定数値で、FalseであればExcel関数"=TODAY()"、
チェックボックスが押されて値が変わったタイミングで
チェックボックスが配されたセルのひとつ右のセルに対して処理をする。
という記述は、条件判別さえ出来れば、さほど難しいものではないです。

問題は、多数あるチェックボックスと
一様な(隣のセルを操作するだけの)処理とを
どのように連動させるか、という点に集約されます。

◆易しいけど手数が掛かる◆ActiveXコントロールを使用する例◆初級向き◆
配置済みのActiveX.チェックボックスはそのままで。
チェックボックス毎にひとつずつプロシージャを書きます。
◆以下、チェックボックスを配置したシートの[シートモジュール]
' ' ==================
Private Sub CheckBox1_Change()
  関数値変換 CheckBox1
End Sub
Private Sub CheckBox2_Change()
  関数値変換 CheckBox2
End Sub
Private Sub CheckBox3_Change()
  関数値変換 CheckBox3
End Sub
' ' … CheckBoxの名前2ヶ所違うだけの同じ記述の繰り返し …
Private Sub CheckBox99_Change()
  関数値変換 CheckBox99
End Sub
' ' ----------------------------------------
Private Sub 関数値変換(oCx As MSForms.CheckBox)
  With oCx
    If .Value = True Then
      .TopLeftCell.Offset(, 1).Value = Date
    Else
      .TopLeftCell.Offset(, 1).Formula = "=today()"
    End If
  End With
End Sub
' ' ==================
プロシージャをコピーして複製を必要な数作り
チェックボックスの名前を慎重に正確に書換えていく
作業が必要です。◆◆

◆簡単な◆フォームコントロールを使用する例◆初心者向き◆
配置済みのActiveX.チェックボックスはすべて破棄します。
◆まず、[標準モジュール]に以下の記述をコピペしてシート名を正しく指定します。
' ' ==================
Sub CheckBoxes_Change()
  With Sheets("Sheet1").Shapes(Application.Caller) ' ★シート名を正しく指定!!
    If .DrawingObject.Value = 1 Then
      .TopLeftCell.Offset(, 1).Value = Date
    Else
      .TopLeftCell.Offset(, 1).Formula = "=today()"
    End If
  End With
End Sub
' ' ==================
◆次に、B1セルにフォームコントロールのチェックボックスを挿入し
右クリックで[マクロの登録]
→表示されたリストから"CheckBoxes_Change"をクリックして選択
→[OK]ボタン
必要なら、位置やサイズの微調整やキャプションや書式の変更を加える。
出来上がったチェックボックスをコピーし
B2、B3、、、と順番に
<次のセルを選択(クリック)して→貼付け>を繰り返して
必要な数のチェックボックスを配置する。これだけでOKです。◆◆

◆少し難しい◆ActiveXコントロール+クラスを使用する例◆初中級向き◆
配置済みのActiveX.チェックボックスはそのままで。
◆まず、[ThisWorkbookモジュール]に以下の記述をコピペしてシート名を正しく指定します。
次回からブックを開いた時に自動で(または直接手動で)
Workbook_Open イベントプロシージャを実行することで
チェックボックスと一様な(隣のセルを操作するだけの)処理とを
連動させるようにVBAが設定してくれます。
(デザインモード移行やエラー終了の場合は
 再度、Workbook_Openを実行して復旧する必要があります)
' ' ==================
Private cClass As Collection
' ' ----------------------------------------
Private Sub Workbook_Open()
Dim o As OLEObject
  Set cClass = New Collection
  For Each o In Sheets("Sheet1").OLEObjects ' ★シート名を正しく指定!!
    If TypeName(o.Object) = "CheckBox" Then
      If o.TopLeftCell.Column = 2 Then ' ★チェックボックスの列位置を正しく指定!!
        cClass.Add New Class1, o.Name
        Call cClass(o.Name).SetEv(o.Object)
      End If
    End If
  Next
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim i As Long
  If cClass Is Nothing Then Exit Sub
  For i = 1 To cClass.Count
    Call cClass(1).CancelEv
    cClass.Remove 1
  Next i
  Set cClass = Nothing
End Sub
' ' ==================

◆次に、
VBE(VBA編集画面)で、
メニュー[挿入][クラスモジュール]→新しく[Class1モジュール]が挿入される
[Class1モジュール]に以下の記述をコピペします。
' ' ==================
Private WithEvents myCx As MSForms.CheckBox
' ' ----------------------------------------
Private Sub myCx_Change()
  With myCx
    If .Value = True Then
      .TopLeftCell.Offset(, 1).Value = Date
    Else
      .TopLeftCell.Offset(, 1).Formula = "=today()"
    End If
  End With
End Sub
Sub SetEv(o As MSForms.CheckBox)
  Set myCx = o
End Sub
Sub CancelEv()
  Set myCx = Nothing
End Sub
' ' ==================
多数のコントロールに同じ処理を実行させるには
このようにクラスモジュールを用いるのが有効です。◆◆
以上です。
    • good
    • 1
この回答へのお礼

完璧なご回答誠にありがとうございます。
頂きましたフォームコントロールを使用し利用できました。
本当にありがとうございました。

お礼日時:2015/02/24 08:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています