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であれば元の関数に戻す、が行える方法を教えていただけますか。
大変申し訳ございませんが、皆様のお力添えのほどよろしくお願いします。
No.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
' ' ==================
多数のコントロールに同じ処理を実行させるには
このようにクラスモジュールを用いるのが有効です。◆◆
以上です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでチェックボックスにチェックを入れる 1 2022/09/14 00:52
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) VBA チェックボックスで 5 2023/05/31 17:10
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
-
4
配列の値を置換するにはどうすればいいでしょう?
Excel(エクセル)
-
5
ブックをCloseまたはQuitで閉じると他のユーザーフォームが消えてしまう。
Excel(エクセル)
-
6
(VBA)チェックボックスのclickのイベントが、プログラムからの操作でも反応してしまいます。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
Excel VBA、 別ブックの最終行...
-
【Excel VBA】指定行以降をクリ...
-
VBAで行削除できないようにする...
-
連続する複数のセル値がすべて0...
-
エクセルVBAでコピーして順...
-
screenupdatingが機能しなくて...
-
Excel vbaで特定の文字以外が入...
-
i=cells(Rows.Count, 1)とi=cel...
-
特定行の色を変えたい(FlexGrid)
-
Excelのプルダウンで2列分の情...
-
ExcelのVBAで数字と文字列をマ...
-
VBA コピーして次の値まで貼り...
-
DataGridViewの各セル幅を自由...
-
DataGridViewのセル編集完了後...
-
VBA初心者です。結合セルを保持...
-
【Excel】指定したセルの名前で...
-
vbsのセル値の取得について
-
EXCELで変数をペーストしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel VBA】指定行以降をクリ...
-
【マクロ】プルダウンが設定し...
-
Excelで指定した日付から過去の...
-
VBA実行後に元のセルに戻りたい
-
【Excel】指定したセルの名前で...
-
Excel vbaで特定の文字以外が入...
-
特定の文字を条件に行挿入とそ...
-
EXCELで変数をペーストしたい
-
【EXCEL VBA】Range("A:A").Fi...
-
エクセルVBAでコピーして順...
-
連続する複数のセル値がすべて0...
-
screenupdatingが機能しなくて...
-
Excel VBA、 別ブックの最終行...
-
任意フォルダから画像をすべて...
-
Excelのプルダウンで2列分の情...
-
【VBA】カーソルのある行の1行...
-
VBAコマンドボタンを押すたびに...
おすすめ情報