• ベストアンサー

エクセル チェックボックスの解除について(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

質問者が選んだベストアンサー

  • ベストアンサー
  • Xen
  • ベストアンサー率75% (15/20)
回答No.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を一行で記述しているだけです。 参考になりますでしょうか?

kmasumi
質問者

お礼

ありがとうございます。 オプションボタンも少し勉強してみたのですが、どうも私が意図してるようには動いてくれませんでした。 Xenさんが教示してくれたこの方法だと、ほぼ私のやりたいことが実現できそうです。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

本件はチェックボックスの例ですが、オプションボタンを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 など載ってました。

kmasumi
質問者

補足

お世話になります。実はこの種のボタン使用するの初めてで、アンケート用紙に既に150個ものボタンを作ってしまい、いざ試してみると想定外の動きをしてしまったのです。みなさんのお答えではオプションボタンがいいらしいですね!書かれたコマンドもよく分からない状況なので、勉強してやり直そうと思います。だからポイント発行まで時間かかるかも知れませんがご容赦くださいませ。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 本来は、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 まあ、とりあえず、試してみてください。

kmasumi
質問者

お礼

ありがとうございました。 Xenさんの2つ目の回答で、スリムに解決しました。

  • Xen
  • ベストアンサー率75% (15/20)
回答No.1

別途フラグを使用すれば出来ますが、オプションボタンではだめなのでしょうか? オプションボタンの右クリックメニュー「プロパティ」にある「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

kmasumi
質問者

補足

ありがとうございます。いただいたアドバイスがよく分からないので!かみ砕いてお願いします。 オプションボタン1をクリックするとCell_Setと云うルーチンが実行されるのですね?このルーチンのRange・・・は、何を意味してますか? 私は、YESの場合、A1に1、Noの場合A2に0、未選択の場合、A1,A2にNULLデータを入力したかったのですが。