この記事では、マクロでセルにフォームコントロールのチェックボックスを配置する方法についてご説明します。
【動画】マクロでセルにフォームコントロールのチェックボックスを配置する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
チェックボックスを配置する位置をあらかじめ取得しておき、新しいフォームコントロールのチェックボックスを追加します。
新しいフォームコントロールのチェックボックスを追加するには、CheckBoxes.Addメソッドを実行します。
今回のサンプルでは複数設置しているので、フォームコントロールのチェックボックスの名前が重複しないよう「cbx」という名前にカウンタの値をつなげて名前を一意にしています。
ちなみにフォームコントロールのチェックボックスとは下の画像にあるチェックボックスです。(ActiveXコントロールのチェックボックスではないです)
マクロ作成の流れ
コードの例
Option Explicit Sub test() Dim cnt As Long 'カウンタ用変数 Dim rng As Range 'Rangeオブジェクト格納用変数 Dim cell As Range 'セル用変数 Dim top As Double 'チェックボックスの上端位置を格納する変数 Dim left As Double 'チェックボックスの左端位置を格納する変数 Dim cb As CheckBox 'チェックボックス用変数 Dim ws As Worksheet 'ワークシート用変数 'カウンタを初期化する cnt = 0 'チェックボックスを設置するセルの範囲を取得する Set rng = Worksheets("data").Range("A1:A10") For Each cell In rng 'カウンタの値を一つ増やす cnt = cnt + 1 'チェックボックスの上端位置を取得する(セルの縦位置の中央に設置) '→(セルのHeightの中央値に設定し、さらに微調整分マイナスする) top = cell.top + (cell.Height / 2) - 9 'チェックボックスの左端位置を取得する left = cell.left 'チェックボックスを生成して配置する Set cb = Worksheets("data").CheckBoxes.Add(left, top, 0, 0) 'チェックボックスのキャプションを空にする cb.Caption = "" 'チェックボックスに名前を付ける(重複しないよう項番も付与する) cb.Name = "cbx" & cnt DoEvents Next cell End Sub
注目すべきコード①
最初に見て頂きたいのは17行目です。
'チェックボックスを設置するセルの範囲を取得する Set rng = Worksheets("data").Range("A1:A10")
コードの説明
以上のコードは、チェックボックスを配置するセルの範囲を取得するコードです。
今回のサンプルではセルにチェックボックスをA1のセルからA10のセルの合計10のセルに配置します。
なので、Range(“A1:A10”)としています。
注目すべきコード②
次に見て頂きたいのは19行目です。
For Each cell In rng
コードの説明
以上のコードは、「注目すべきコード①」で説明したチェックボックスを配置する範囲のセルを一つ一つ繰り返し取得するFor文のコードです。
セルを取得する目的はセルの上端位置と左端位置が欲しいためです。
上端位置と左端位置については詳しくは「注目すべきコード③」でご説明します。
注目すべきコード③
次に見て頂きたいのは25行目から29行目です。
'チェックボックスの上端位置を取得する(セルの縦位置の中央に設置) '→(セルのHeightの中央値に設定し、さらに微調整分マイナスする) top = cell.top + (cell.Height / 2) - 9 'チェックボックスの左端位置を取得する left = cell.left
コードの説明
以上のコードは、セルの上端位置と左端位置を取得し、その位置からチェックボックスを設置するチェックボックスの上端位置と左端位置を決めます。
今回のサンプルでは、チェックボックスの上端位置は、配置するセルの上端から真ん中に設定しています。
また、チェックボックスの左端位置は、配置するセルの左端位置と同じにしています。
注目すべきコード④
次に見て頂きたいのは32行目です。
'チェックボックスを生成して配置する Set cb = Worksheets("data").CheckBoxes.Add(left, top, 0, 0)
以上のコードは、セルにフォームコントロールのチェックボックスを配置している処理のコードです。
CheckBoxes.Addメソッドに左端位置、上端位置、横幅、縦幅の4つの値を引数に設置して実行することでセルにフォームコントロールのチェックボックスが配置されます。
今回のサンプルでは横幅、縦幅には0を設定しています(チェックボックスの□だけが欲しいので(チェックボックスの文言部分は使わない))
注目すべきコード⑤
次に見て頂きたいのは35行目から38行目です。
'チェックボックスのキャプションを空にする cb.Caption = "" 'チェックボックスに名前を付ける(重複しないよう項番も付与する) cb.Name = "cbx" & cnt
コードの説明
以上のコードは、配置されたチェックボックスのキャプションと名前の設定を行っている処理のコードです。
コードの詳細
35行目では、チェックボックスのキャプションを空にしています。
チェックボックスが配置された直後は、デフォルトでキャプションが設定されており表示されます。
上の画像のチェックボックスにはキャプションが「チェック 1」と設定されているので、この文言がそのまま表示されています。
今回のサンプルでは□だけの表示にしたいのでキャプションは何も設定しないようCaptionプロパティにブランクを設定しています。
38行目では、チェックボックスに名前を付けています。
今回のサンプルでは複数設置しているので、フォームコントロールのチェックボックスの名前が重複しないよう「cbx」という名前にカウンタの値をつなげて名前を一意にしています。
動作確認
マクロ実行前
以下のシートにチェックボックスを配置します。セルの高さはバラバラに設定しています。
マクロ実行後
A1のセルからA10のセルまで10個フォームコントロールのチェックボックスが設置されました。
なお、フォームコントロールのチェックボックスはセルの真ん中の縦位置に設置されています。
懸念事項
今回紹介したサンプルのコードを実行するのにあたり一つ懸念事項があります。
それは、多くのフォームコントロールのチェックボックスを設置しようとすると完了までにかなり時間がかかってしまうことです。
ちなみに私のパソコンで1000個フォームコントロールのチェックボックスを設置してみたら35秒かかりました。
数千、数万という数をもし設置したい場合はお使いの環境によってかなり完了までに待たされる可能性があります。
なので、フォームコントロールのチェックボックスの数が多すぎると完了までに時間がかかってしまうことを念頭に処理を行って頂ければ幸いです。
最後に
本記事では、マクロでセルにフォームコントロールのチェックボックスを配置する方法についてご説明しました。
いちいち手動でフォームコントロールのチェックボックスをセルに設置するのが面倒だと感じている場合は本記事が参考になるかもしれません。
マクロから一括でチェックボックスを設置しているコードのサンプルを参考にしてみてくださいね。
ちなみにマクロでActiveXのチェックボックスを設置したい場合は次の記事で説明しています。
【ExcelVBA】マクロでセルにActiveXのチェックボックスを配置するにはプログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。