- ベストアンサー
エクセル チェックボックスの解除について(VBA)
YES/NOを入力させる為の下記のVBAにおいて、チェックボックス1をチェックすると、アの部分でチェックボックス2の解除を行う関係で?、シート上でチェックボックス2を操作していないのにもかかわらず、勝手にCheckBox2_Click()に入り、命令文イを実行してしまいます。 ただ単にSub CheckBox1_Click()のルーチンの最後までの処理で終わりたいのですが、どうしたらよいのでしょうか。 Private Sub CheckBox1_Click() If CheckBox1 = True Then Sheets("sheet1").Range("A1") = 1 Sheets("sheet1").Range("A2") = 0 CheckBox2 = False・・・ア Else Sheets("sheet1").Range("A1") = "" End If End Sub Private Sub CheckBox2_Click() If CheckBox2 = True Then Sheets("sheet1").Range("A1") = 0 Sheets("sheet1").Range("A2") = 1 CheckBox1 = False Else Sheets("sheet1").Range("A2") = ""・・・イ End If End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 未選択の状態がありえるのですね。 その場合チェックボックスの方で良いと思います。 以下のコードでいかがでしょうか? Private Sub CheckBox1_Click() If Me.CheckBox1.Value = True Then Me.CheckBox2.Value = False End If Range("A1").Value = IIf(Me.CheckBox1.Value, 1, "") End Sub Private Sub CheckBox2_Click() If Me.CheckBox2.Value = True Then Me.CheckBox1.Value = False End If Range("A2").Value = IIf(Me.CheckBox2.Value, 0, "") End Sub IIf(Me.CheckBox1.Value, 1, "")はチェックボックスの状態がTrueであれば1をFalseであれば空文字を返す構文です。 If~Else~End Ifを一行で記述しているだけです。 参考になりますでしょうか?
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
本件はチェックボックスの例ですが、オプションボタンを2つ貼り付け、各々のプロパティでLinkedCellをA1セルとA2セルに設定すると、 またGroupNameが全てSheet1になるのを、3・4つ以上のボタンがあって、複数グループにする場合は、グループ別に同一文字列記号に設定しなおすと、質問のようなプログラムは不要になります。 ただ値がFALSE、TRUEになりますが、小生はこれを0、1にする書式設定がわかりません。 CheckBoxの場合 http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=one;no=9279;id=Excel など載ってました。
補足
お世話になります。実はこの種のボタン使用するの初めてで、アンケート用紙に既に150個ものボタンを作ってしまい、いざ試してみると想定外の動きをしてしまったのです。みなさんのお答えではオプションボタンがいいらしいですね!書かれたコマンドもよく分からない状況なので、勉強してやり直そうと思います。だからポイント発行まで時間かかるかも知れませんがご容赦くださいませ。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 本来は、CheckBox ではなくて、OptionButton の使い方ですね。なぜ、CheckBox でなくてはならないのか良く分りませんが、コードを読んでいると、CheckBoxの片方で、Offにした時に機能を持たせているようですね。贅沢な使い方のようですね。確かに、こればかりは、OptionButtonでは、真似できないような気がしますが、計画倒れになっちゃいましたね(^^\ でも、もっと贅沢に使うなら、MouseDownなんていうのを使えば、もっといろいろ使えます。 >単にSub CheckBox1_Click()のルーチンの最後までの処理で終わりたいのですが、 それなら、単に、フラッグをつければよいだけのことです。でも、なるべく、プロパティのValueなどを入れてくださいね。後々のエラーの原因になりますから。 Dim flg As Boolean Private Sub CheckBox1_Click() If flg = True Then Exit Sub If CheckBox1.Value = True Then Sheets("Sheet1").Range("A1").Value = 1 Sheets("Sheet1").Range("A2").Value = 0 flg = True CheckBox2.Value = False Else Sheets("Sheet1").Range("A1") = "" End If flg = False End Sub Private Sub CheckBox2_Click() If flg = True Then Exit Sub If CheckBox2.Value = True Then Sheets("Sheet1").Range("A1").Value = 0 Sheets("Sheet1").Range("A2").Value = 1 flg = True CheckBox1.Value = False Else Sheets("Sheet1").Range("A2").Value = "" End If flg = False End Sub まあ、とりあえず、試してみてください。
お礼
ありがとうございました。 Xenさんの2つ目の回答で、スリムに解決しました。
- Xen
- ベストアンサー率75% (15/20)
別途フラグを使用すれば出来ますが、オプションボタンではだめなのでしょうか? オプションボタンの右クリックメニュー「プロパティ」にある「GroupName」に同じ値(例:Q1)を設定すれば次の様なコードで良いのですが.... Private Sub OptionButton1_Click() Call Cell_Set End Sub Private Sub OptionButton2_Click() Call Cell_Set End Sub Private Sub Cell_Set() Range("A1").Value = IIf(Me.OptionButton1.Value, 1, 0) Range("A2").Value = IIf(Me.OptionButton2.Value, 1, 0) End Sub
補足
ありがとうございます。いただいたアドバイスがよく分からないので!かみ砕いてお願いします。 オプションボタン1をクリックするとCell_Setと云うルーチンが実行されるのですね?このルーチンのRange・・・は、何を意味してますか? 私は、YESの場合、A1に1、Noの場合A2に0、未選択の場合、A1,A2にNULLデータを入力したかったのですが。
お礼
ありがとうございます。 オプションボタンも少し勉強してみたのですが、どうも私が意図してるようには動いてくれませんでした。 Xenさんが教示してくれたこの方法だと、ほぼ私のやりたいことが実現できそうです。