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、NullOptionButtonのグループが名前ではなく コンテナー で決まる理由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
