🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の CheckBox — True/False、TripleState の Null、OptionButton のグループ化

|

Excel VBA の CheckBox — True/False、TripleState の Null、OptionButton のグループ化

TL;DR — CheckBox はオン/オフのトグルです。.Value を Boolean、True か False として If CheckBox1.Value Then ... で読みます。人を驚かせることが二つあります。TripleState = True は .Value に 三つ目の状態 Null を与え、そのとき If CheckBox1.Value は Type mismatch を発生させます。そしていとこ分の OptionButton(オプションボタン)は コンテナー単位 で排他的です。同じフォーム上のオプションボタンはすべ てひとつのグループなので、独立したグループは Frame で分けます。CheckBox = 独立したトグル、Frame の中の OptionButton = ちょうど一つを選ぶ、です。

' チェックボックスの読み取りは VBA で最も単純な部類
Private Sub cmdSave_Click()
    If chkEmail.Value Then Range("B1").Value = "Email opt-in"
    If chkSMS.Value Then Range("B2").Value = "SMS opt-in"
End Sub

CheckBox は UserForm 上のコントロールで、読むのが最もやさしい一つです。その .Value はただの Boolean です。この単純さこそが、下の二つの例外が人の隙を突く理由です — コントロールが気の 利いたことをすると期待しなくなり、そこへ TripleState や、グループ化されていない OptionButton の一組が噛み ついてきます。

この記事で学べること

  • CheckBox を Boolean として読む — どんなフォームでも最も単純なコントロール
  • TripleState の落とし穴:If CheckBox1.Value を失敗させる三つ目の .Value、Null
  • OptionButton のグループが名前ではなく コンテナー で決まる理由
  • Frame(または GroupName)が二つのラジオグループの衝突をどう防ぐか
  • 判断のしどころ:独立したオン/オフには CheckBox、多くの中から一つには OptionButton
  • チェックボックスでラジオグループを決してまねしてはいけない理由

考え方の軸:チェックボックスは目に見える Boolean

CheckBox には、ほとんど何もありません。ラベルの付いた Boolean です。

CheckBox1.Value       ' チェックが入っていれば True、外れていれば False

If で読み、チェックを切り替えるために書く、それで終わりです。これはフォーム上で最もきれいなコントロールとコ ードの対応で、独立した オン/オフの選択肢の一組 — メールのオプトイン、SMS のオプトイン、合計を含める — には まさにうってつけです。どのチェックボックスも単独で立っています。一つにチェックを入れても、ほかのどれにも影響 しません。この「独立」という考えをつかんでおいてください。それが CheckBox と OptionButton の境界線だから です。

TripleState の落とし穴:.Value が Null になりうるとき

CheckBox には TripleState プロパティがあります。False(既定)のままなら、.Value は True か False のどちらかにしかなりません。True に設定すると、コントロールは 三つ目の 状態を得ます — 灰色の、どっちつか ずのチェック — その .Value は False ではなく Null です。

' With TripleState = True, this line can blow up
If CheckBox1.Value Then ...     ' If の中の Null は実行時エラー 13、Type mismatch を発生させる

If Null Then は Type mismatch(実行時エラー 13)です。Null は True でも False でもないからです。です から TripleState をオンにするなら、三つの状態を明示的に調べなければなりません。

If IsNull(CheckBox1.Value) Then
    ' 不定 - オンでもオフでもない
ElseIf CheckBox1.Value Then
    ' チェックが入っている
Else
    ' 外れている
End If

実務的な助言はこうです。どっちつかずの状態が本当に必要でない限り、TripleState を有効にしないこと。 ほと んどのフォームは必要とせず、オフのままにするフォームはどれも、ただの If で .Value を読めます。

OptionButton:同じ単純さ、排他的な一つの答え

OptionButton(オプションボタン)は CheckBox とまったく同じように読みます — 選ばれたものの .Value が True — が、その眼目は グループの中で一度に一つだけが True になれる ことです。一つを選ぶと、ほかが解除 されます。グループはオンになっている一つを見つけて読みます。

Dim shipping As String
If optStandard.Value Then shipping = "Standard"
If optExpress.Value Then shipping = "Express"
If optOvernight.Value Then shipping = "Overnight"

答えが いくつかのうちの一つ — 配送速度、支払い方法、サイズ — のときに、これが正しいコントロールです。まずい ことになるのはグループ化です。

グループ化の落とし穴:オプションボタンはコンテナー単位で排他的

「一つのラジオを選ぶと、まったく無関係なグループのボタンが解除される」を生む間違いがこれです。OptionButton の排他性は、名前や意図ではなく コンテナー で決まります。UserForm に直接 置かれたオプションボタンはすべて ひとつの グループに属します — だから同じフォーム上の二つの別々のラジオの問いは、互いに衝突します。直し方は、 各組にそれぞれのコンテナー、Frame を与えることです。

UserForm
  Frame "Shipping"        <- one exclusive group
    optStandard
    optExpress
    optOvernight
  Frame "Payment"         <- a separate, independent group
    optCard
    optInvoice

オプションボタンのかたまりをそれぞれ自分の Frame の中に落とし込めば、各 Frame が独立したグループになります。 こうすればユーザーは、二つが干渉することなく、配送速度を一つ と 支払い方法を一つ選べます。(あるいは、各ボタ ンの .GroupName プロパティを共通の文字列に設定してもかまいません。Frame は目に見える手段で、たいていはより 分かりやすい選択です。)

判断のしどころ:CheckBox か OptionButton か

この選択は 答えの形 の問題であって、好みの問題ではありません。

  • 選択肢が 独立 していて、いくつでもオンになりうるときは CheckBox を使います — 有効にする機能、含める 列、オプトイン。いくつも同時にチェックできます。
  • 答えが排他的な組の中の ちょうど一つ のときは(Frame の中の)OptionButton を使います — モード、速 度、サイズ。

そして避けるべきアンチパターン。チェックボックスでラジオグループを決してまねしないこと — 一つにチェックが 入ったらほかを外すコードを書く、というやり方です。それは OptionButton のグループがすでにタダでやってくれるこ とを、下手に作り直しているだけで — 四つ目の選択肢を足した瞬間に壊れる、手作りの状態管理です。答えが多くの中の 一つなら、Frame の中の OptionButton を使いましょう。

ExcelMaster の活用

このページの二つの失敗は、静かで、いらだたしいものです。TripleState が Null を紛れ込ませたせいで Type mismatch でクラッシュする If CheckBox1.Value、そして誰も Frame に入れなかったせいで無関係な問いをま たいで互いを解除するオプションボタンです。

ExcelMaster には、フォームを普通の言葉で 伝えられます — 「独立したオプトインのチェックボックスを三つ、それに配送速度の選択と支払いの選択」 — すると CheckBox を配置し、OptionButton を干渉しないようそれぞれの Frame にまとめ、各コントロールを正しいやり方で 読みます。ブックとコードはあなたの手元に残ります。

よくある質問

VBA で CheckBox にチェックが入っているかを読むには?

Boolean である .Value を読みます。If CheckBox1.Value Then ... は、ボックスにチェックが入っているときに動 きます。CheckBox1.Value = True と書けば、コードからチェックを入れられます。既定である TripleState が False のあいだは、これはきれいに動きます。

If CheckBox1.Value が Type mismatch エラーになるのはなぜですか?

TripleState がオンで、チェックボックスが三つ目の、どっちつかずの状態にあり、.Value が Null だからです。 If Null Then は実行時エラー 13、Type mismatch を発生させます。値が True か False にしかならないよう TripleState = False のままにするか、If の前に IsNull(CheckBox1.Value) で三つの状態を調べます。

オプションボタンが別々のグループをまたいで互いに解除し合うのはなぜですか?

OptionButton の排他性がコンテナーで決まるからです。UserForm に直接置かれたオプションボタンはすべてひとつの グループとして扱われるので、無関係な問いが干渉します。オプションボタンの各組をそれぞれの Frame の中に入れる (または各組に別々の .GroupName を与える)ことで、独立したグループにします。

CheckBox と OptionButton の違いは何ですか?

CheckBox は独立したオン/オフのトグルで — いくつでも同時にチェックできます。OptionButton は排他的なグループ からの一つの選択で — 一つを選ぶと残りが解除されます。独立した選択肢にはチェックボックスを、ユーザーがちょうど 一つを選ばなければならないときは(Frame にまとめた)オプションボタンを使います。

VBA の UserForm でオプションボタンをグループ化するには?

OptionButton コントロールの各グループを、それぞれの Frame コントロールの中に入れます。Frame がグループを 定義するので、別々のフレームのボタンは、もう互いを解除しません。フレームを使えないときは、各グループの .GroupName プロパティを共通の、別々の文字列に設定します。どちらにせよ、目的は各排他的な問いにそれぞれのコン テナーを与えることです。

検証環境

検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-09-25。

関連ガイド: VBA ListBox · VBA ComboBox · VBA UserForm · VBA MsgBox · VBA If Then Else