こんにちは、Ryoです。
用途的に幅広く、ビジュアル的にもわかりやすいチェックボックスをExcelで活用する方も多いと思います。そのチェックボックスをVBAで扱う場合の例として、「チェックボックスのみ」「セル高さ、幅に合わせる」「セル枠内に収める」3例と指定位置に設ける簡易的な関数サンプルを作りましたので、その内容について書いていきたいと思います。
1.サンプル概要、及びサンプルコード(3種)
今回は主にチェックボックスをVBAで作成する際の例に重点を置いて説明していきますので、構文やメソッド、プロパティなど詳細は割愛します。(記事が長くなりすぎるので。。。)
◆チェックボックスのみ
CheckBoxオブジェクトというのは表示がLeft又はRightしか選択肢がありませんので、通常通りの場合はセルに対し左端、又は右端としかできないという点があります。しかしながら、用途によっては「CheckBox」のみ表示させたいこともあるでしょうから、やや強引に作ってみました。
Sub Sample_CheckBox1() 'チェックボックスのみとしてセルの中央に配置する Application.ScreenUpdating = False With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False) 'サイズを縮小しチェックボックスのみ表示 .Height = 10 .Width = 11 '対象セルの中央配置 .Top = .Top + (ActiveCell.Height - .Height) / 2 .Left = .Left + (ActiveCell.Width - .Width) / 2 With .Object 'テキスト .Caption = "" '背景色 .BackColor = rgbWhite '色定数:白 'チェックボックスON=True,OFF=False .Value = True End With End With Application.ScreenUpdating = True End Sub
このサンプルコードを実行すると、以下の通りチェックボックスのみがアクティブセルに埋め込まれます。位置は指定したセルの幅と高さから中央位置を求めているので常に中央位置になるようにしています。
見栄え的にサンプルコードでは.Value = True(チェックON)としていますが、通常はFalse(=Off)で使うことが多いかと思います。
簡単にサンプルコードを説明しますと、アクティブセルにチェックボックスを挿入する際にサイズを指定して画像の部分のみ残るように縮小しています。その後セル幅や高さから単純計算で中央位置を算出し、テキスト=なし、背景色=白とすればOKです。
◆セル高さや幅に合わせる
これはアクティブセルのセル高さ/幅に合わせて配置するものです。
Sub Sample_CheckBox2() 'チェックボックス+テキスト表示、セルの高さ/幅に合わせる Application.ScreenUpdating = False With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False) '対象セルの高さ/幅に合わせる .Width = ActiveCell.Width .Height = ActiveCell.Height With .Object 'テキスト .Caption = "Sample2" '文字色 .ForeColor = rgbWhite 'フォントサイズ .Font.Size = 9 '太字設定 .Font.Bold = True '背景色 .BackColor = rgbBlue 'チェックボックスON=True,OFF=False .Value = True End With End With Application.ScreenUpdating = True End Sub
実行すると以下画像の通り、セルサイズに合わせて配置されます。
チェックボックスのみのサンプルコードに対し、表示させるテキストや関連する設定などが追加していますが基本的な流れは同様です。
◆セル枠内に収める
上述のセルサイズに合わせるサンプルコードを一部修正すれば、枠内に収められます。
Sub Sample_CheckBox3() 'チェックボックス+テキスト表示、セル内に収める Application.ScreenUpdating = False With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False) '対象セルの枠内に収める .Width = ActiveCell.Width - 5 .Height = ActiveCell.Height - 5 .Top = .Top + (ActiveCell.Height - .Height) / 2 .Left = .Left + (ActiveCell.Width - .Width) / 2 With .Object 'テキスト .Caption = "Sample3" '文字色 .ForeColor = rgbWhite '色定数:白色 'フォントサイズ .Font.Size = 9 '太字設定 .Font.Bold = True '背景色 .BackColor = rgbBlue '色定数:青色 'チェックボックスON=True,OFF=False .Value = True End With End With Application.ScreenUpdating = True End Sub
実行すると以下画像の通り、セル枠内に収めることが出来ます。
私個人としては、この形を使うことが多いですね。
黒枠はセル内に収まっていることを表現する為に罫線で囲っています。
このサンプルでも枠内に収めることに合わせて、セル高さや幅の変化に柔軟に対処するようにしていますが、元々のセル幅が表示するテキストより小さい場合は下の画像のようになりますから、その点は留意くださいね。
サンプルコード内で使っている色定数はMSDNのこちらに載っていますので、任意の色に設定すれば良いと思います。
2.指定位置にチェックボックスを配置
1.ではチェックボックス単体の配置について3例ご紹介しましたが、次に以下画像の簡易的な表から「Judge」欄のOK/NGによりチェックボックスのON/OFFなどを実行するサンプルコードについて書いていきます。
この表内「Number」の値をチェックボックスの名前として設定し、セルへの挿入は「Data_Out」欄に行います。その際にOK=チェックON、NG=チェックOFFとしています。
◆サンプルコード
Sub Sample1() Dim Nm, Addr As String Dim Data_Judge As String Dim i As Integer Application.ScreenUpdating = False For i = 7 To 16 Cells(i, 2).Select 'Numberを文字列に変換して取得 Nm = Str(ActiveCell) 'チェックボックスの貼付け位置(アドレス)を相対参照で取得 Addr = ActiveCell.Offset(0, 2).Address(False, False) 'Judge欄のOK/NGを「半角/小文字」に統一する Data_Judge = StrConv(LCase(ActiveCell.Offset(0, 1)), vbNarrow) 'ユーザー定義関数実行(チェックボックス設置) Selection = CheckBoxCR(Nm, Addr) '「Judge」欄のOK/NGで処理を分岐 Select Case Data_Judge Case "ok" With ActiveSheet.OLEObjects(Nm) '同一名のチェックボックスを対象 If .Name = Nm Then With .Object 'テキスト .Caption = "出力済み" '文字色 .ForeColor = rgbWhite 'フォントサイズ .Font.Size = 9 '太字設定 .Font.Bold = True '背景色 .BackColor = rgbBlue 'チェックボックスをON .Value = True End With End If End With Case Else With ActiveSheet.OLEObjects(Nm).Object '念の為にチェックボックスをOff If .Value = True Then .Value = False End With End Select Next i Application.ScreenUpdating = True End Sub
このサンプルコードがメインとなりますが、処理内容としては簡易的にFor~NextでNumberが記入されているセル間をループ処理し、その中で後述するユーザー定義関数に引き渡すNumber(文字列に置換=Str())、セルアドレス(=Addr変数)を取得して「Judge」欄のOK/NGの文字を判別しやすいように「半角/小文字」に統一しています。
その後、独自に作成したユーザー定義関数(CheckBoxCR)でチェックボックスを作成します。
Function CheckBoxCR(Nm, Addr As String) '指定位置にチェックボックスを設置する関数 Range(Addr).Select With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False) '対象セルの中央配置、及び枠内に収める .Width = ActiveCell.Width - 5 .Height = ActiveCell.Height - 5 .Top = .Top + (ActiveCell.Height - .Height) / 2 .Left = .Left + (ActiveCell.Width - .Width) / 2 '名前は処理時点の「Number」とする .Name = Nm With .Object 'デフォルト「Judge」=NGでの表示 .Caption = "未出力" .ForeColor = rgbRed '赤色 .Font.Size = 9 .Font.Bold = True .BackColor = rgbLightGrey '薄い灰色 .Value = False End With End With End Function
ここでは引き渡された変数Nm、Addrを使用してチェックボックスの名前設定や指定位置への挿入、チェックボックスとしてはデフォルトとして「NG」での表示に設定しています。
その後、メイン側の処理に戻りますのでSelect CaseでOK,NGでの各処理を実行します。
「OK」であれば、その時に処理しているNumberと同じ名前のチェックボックスに対してテキストや文字色、背景色、チェックONの処理を行い、NGであればチェックOFFとします。
以後は順次処理の繰り返しを行い、上の画像のような結果となります。
こういった処理内容としては用途に応じて様々なアプローチがあると思いますので、本サンプルは一例としてみていただければ良いかと思います。
3.まとめ
今回は主にチェックボックス単体の配置に於ける参考例を主に書いていますので、説明が不足している点や実運用に置き換えた場合に必要になると思われる連動の部分がありますが、その点はまた別の機会に書いてみたいと思います。
VBAで扱おうとすると少々面倒な感じではありますが、データの読み書きが頻繁なファイルなどに活用すると取捨選択に便利だったりするので、知っていると良いこともあります(笑)
以上、チェックボックスの作成と活用例についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo