質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

3回答

102398閲覧

エクセルVBAでチェックボックスのチェック状態を取得したい

sanson914

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

3クリップ

投稿2018/07/07 04:24

前提・実現したいこと

エクセルのVBAでチェックボックスにチェックが入っているかを確認するマクロを作りたいです。

発生している問題・エラーメッセージ

動くには動くのですが、チェックボックスの有無に関わらず「true」が返ります。

該当のソースコード

Sub test()

Dim rc As Boolean

rc = Sheets("Sheet1").CheckBoxes(1)
MsgBox rc

End Sub

試したこと

いろいろ書きなおしてみたのですが、出来ず・・・
こんな簡単そうなコードも書けず恐縮です。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

フォームコントロールのチェックボックスですよね。

フォームコントロールのチェックボックスの Value はBoolean型でなく、
定数 xlOn, xlOff で判断します。

vba

1Sub test() 2 Dim rc As Boolean 3 4 rc = WorkSheets("Sheet1").CheckBoxes(1).Value = xlOn 5 MsgBox rc 6 7End Sub

補足
ちなみに、上記はコードは
WorkSheets("Sheet1").CheckBoxes(1).Value = xlOn の結果(True/False)を rcに代入しています。
下記のコードと同じ意味になります。

vba

1Sub test() 2 Dim rc As Boolean 3 4 If WorkSheets("Sheet1").CheckBoxes(1).Value = xlOn Then 5 rc = True 6 Else 7 rc = False 8 End If 9 MsgBox rc 10 11End Sub

追記
フォームコントロールのチェックボックスを名前で参照する場合は、
「オブジェクトの選択と表示」に表示される名前で、
Worksheets("Sheet1").CheckBoxes("check box 4")
としてもいいし、選択した時に「名前ボックス」に表示される名前でもOKです。
Worksheets("Sheet1").CheckBoxes("チェック 4")

ちなみに、チェックボックスの横のテキストは右クリックの「テキストの編集」で編集できますが、
その文字列は、
Worksheets("Sheet1").CheckBoxes("check box 4").Text
で取得できます。

投稿2018/07/07 04:34

編集2018/07/08 03:43
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanson914

2018/07/07 04:44

お返事ありがとうございます! なるほど! では上記のコードだと rc=xlOn(xlonは「チェックなし」の意味か・・・?) でメッセージボックスに「false」が返るのですね! では、メッセージボックスにチェックの状態を出すにはどうすればいいでしょうか・・・? ここまで教えて頂きながらピンとこずすみません
hatena19

2018/07/07 04:50

xlOn はチェックありの意味です。 ですので、CheckBoxes(1) にチェックが入っていれば(ValueがxlOn) CheckBoxes(1).Value = xlOn は、xlOn = xlOn となってTrueになります。 CheckBoxes(1) にチェックが入っていなければ(ValueがxlOff)、 xlOff = xlOn は成立しないので、False になります。 ということで、提示のコードでメッセージボックスにチェックの状態を表示できると思いますが。
sanson914

2018/07/07 05:34

お返事ありがとうございます! 上記をマクロ登録して、全てのチェックボックスで試した所、「オブジェクトの選択と表示」で「check box4」となっている場所のチェック状況でチェックが入っていると「true」、入っていないと「false」の反応が返ってきました。ありがとうござます! CheckBoxes(1)が、『「オブジェクトの選択と表示」で「check box4」』の事を指しているのでしょうか・・・だとすれば、複数のチェックボックスを作っている場合、任意のチェックボックスを選択する為に、そのチェックボックスの本当の名前を知る方法はありますでしょうか・・・
hatena19

2018/07/08 03:44

回答の方に追記しておきました。
guest

0

ども^^

早とちりばかりして、
理解あるいは納得されているような返答をされていますが、
言葉の意味を全く理解しているように見えません。

すでに他の方が指摘されていますが、
フォームコントロールのチェックボックスは、
True/FalseというBoolean型の値を持っていません。
つまり、xlOn/xlOff というLong型のVBAで定義されている定数を保持しています。

この定数というのは、コード上では文字で表現できる名前がついていますが、
実際はただのLong型の整数となっています。
xlon → 1
xloff → -4146

この数値をBoolean型の変数に代入したとき、
暗黙のうちに型変換がされるのですが、このとき、
0 → False
それ以外 → True
と型変換されます。
(逆にやると、False→0、True→-1となります。)
なので、単に返り値をBoolean型の変数に代入したら、
どっちでもTrueになってしまいます。
この辺は理屈だけでなく自分で実験されて納得いだだくといいと思います。

VBA

1Sub test() 2 Dim rc As Boolean 3 4 MsgBox Sheets("Sheet1").CheckBoxes(1).Value 5End Sub

なので、

VBA

1Sub test() 2 Dim rc As Long 3 4 rc = Sheets("Sheet1").CheckBoxes(1).Value 5 6 If rc = xlOn Then 7 'なにか 8 Else 9 'なにか 10 End If 11End Sub

と、条件分岐をしてください。
(xlonを1と書いても同じ意味ですが、
xlonと書いたほうがon/offの評価をしているのだということが
読み易いですよね?そのために定数というものが事前に定義されています。)

それから、名前の件ですが、
CheckBoxes(1)
と、1番目のチェックボックスを指定しているのですから、
2番目は、CheckBoxes(2)と表現できます。
もちろん名前でも指定できます。
名前は各コントロールを選択して、名前ボックスで確認するか、
VBAでコードを書いて名前を調べるかですが、
単にシート上に配置して自動で名前が付けられた状態だと、
名前ボックス→日本語
VBA→英語
の表記になるので気を付けてください。
(ただし、使うときはどっちでもOK)
新たに付け直すと、直した値に統一されるようです。

投稿2018/07/08 02:33

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Valueをお忘れですよ。

投稿2018/07/07 04:31

sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanson914

2018/07/07 04:37

ご回答ありがとうございます! 確かにそうですね。 ですが、今「Value」を後ろにくっ付けても、 チェックボックスにチェックが有ろうが無かろうが「true」が返ってくるのです。 ・・・そもそも論として、エクセルのチェックボックスの名前は、「オブジェクトの選択と表示」で出てくる名前でいいですよね・・・?
sysjojo

2018/07/07 21:05 編集

失礼しました。hatena19さんご指摘のとおり値の受け方に問題がありましたね。 名前はご推察の通り、「オブジェクトの選択と表示」で出てくるものでよいです。 CheckBoxes(1)のNameをDebug.Printなどすれば確認できるかと思います。 試しに、チェックボックスのチェックがついてる項目だけメッセージボックスを出すようにサンプル書いてみましたが Sub test() Dim cb As Variant For Each cb In ActiveSheet.CheckBoxes If cb.Value = 1 Then MsgBox ActiveSheet.Shapes(cb.Name).AlternativeText End If Next End Sub ↑のcb.Nameが名前ですね。チェックボックスにつけたキャプション文字列はShapesからとれそうですがもっといい方法があるかもしれません。
hatena19

2018/07/09 02:12

> チェックボックスにつけたキャプション文字列は cb.Text でとれるようです。
sysjojo

2018/07/09 02:34

> cb.Text でとれるようです。 ですよね。 寝起きでちゃんと確認してなかったけど、なんか上手く行かなかった気がしたのでウォッチ式でプロパティ眺めて、それっぽい値が入っている項目使ってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問