Excel VBAのオプションボタン 条件分岐

このQ&Aのポイント
  • Excel VBAでユーザーフォームにある4つのオプションボタンのいずれも押されていない場合に、注意メッセージを表示したいです。
  • オプションボタンのプロパティvalueが全てfalseで、メッセージが表示されない場合、どのように修正すればよいでしょうか?
  • Excel 2000の環境で実行しています。
回答を見る
  • ベストアンサー

excel vba のオプションボタン 条件分岐

ユーザーフォームに4つのオプションボタン(Opt1,Opt2,Opt3,Opt4)があり、一つも押さなかった場合に注意メッセージを出したいのですが、下記だとメッセージがでてくれません。 どのように修正すればいいか、ご教授頂ければ幸いです。 optボタンのプロパティ value は 4つとも false です。excel2000です。 If UserForm1.Opt1.Value = False And UserForm1.Opt2.Value = False And UserForm1.Opt3.Value = False And UserForm1.Opt4.Value = False Then MsgBox "いずれかを選んでください", vbExclamation, "区分を選んでください" End If

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
noname#146604
noname#146604
回答No.1

例えば、コマンドボタンを押したときに、どのオプションボタンも選択されていない場合 Sub userform_initialize() End Sub Private Sub CommandButton1_Click() If (OptionButton1 Or OptionButton2 Or OptionButton3 Or OptionButton4) = False Then MsgBox ("動作を選択して下さい") End If End Sub

puyopa
質問者

お礼

解答ありがとうございました。 解答頂いたコードで、うまくいきました。 とてもシンプルで分かりやすかったです。 ありがとうございました。

その他の回答 (2)

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

質問者のコードとは、別に下記をやって考えてみてください。 Userform1にFrameコントロールを2つ貼り付け。わざと複数個にした。 (質問者はFrameは書いてないが、こうすると、6つのうちの上下3つずつが別の設定が出来るようになる。何かのときに使えるだろう) それぞれのFrameにオプュションボタンを3つづつ貼り付け(同数にする意味は無いが)。 下記はFrame2でテストすることに注意。 UserForm1の_Initializeイベントに Private Sub UserForm_Initialize() For i = 1 To UserForm1.Frame2.Controls.Count Sheet1.Cells(1, i).Value = UserForm1.Frame2.Controls(i - 1).Value Next For ID = 0 To UserForm1.Frame2.Controls.Count - 1 UserForm1.Frame2.Controls(ID).Value = False Next ID 'UserForm1.Frame1.OptionButton2.Value = True 'UserForm1.Frame2.OptionButton3.Value = True End Sub ーー UserFormのコマンドボタンのイベントに Private Sub CommandButton1_Click() For ID = 0 To UserForm1.Frame2.Controls.Count - 1 If UserForm1.Frame2.Controls(ID).Value = True Then 'チェックされているオプションの処理を行う。 '選択されたオプションはCaption内容などで区別します。 MsgBox (ID + 1) & "が選択されています" Exit Sub End If Next ID MsgBox "オプションボタンが選択されていません" End Sub ーー 「Sub/ユーザーフォームの実行」後、 Frame2の、どれかオプションボタンをクリックして、コマンドボタンをクリックしてみてください。 どれをクリックしたか、してないか判別します。 こういうのが通常の、解説書などのオプションボタンの判別の記載例です。 Frameで、3つともドレもオプションボタンがクリックして無いというのを判別できないか、やってみましたが 現在までは見つからなかった(たぶん不可能か?) 何かまとめるコントロールでも無いと、質問の4つのボタンのどれか1つが選択されて居るかどうかは、一発で判別できないはずと考えてやって見たが、AND,ORで列挙するか、ForNextで繰り回すかの違いになった。

puyopa
質問者

お礼

回答ありがとうございました。 コードを読んだだけでは、理解できませんでしたので、実際に動作させてなんとか理解することができました。 これが、プロのコードなのかと感銘をうけました。 ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

アナタの書いたマクロは,まぁ色々冗長に見えるとかもっとクールに書けるとかはあるにしても,間違ってはいません。 Opt1から4が正しくFalseであれば,msgboxが上がってくるはずです。 にもかかわらず実行できないとすると,可能性としては 1.そもそもマクロの実行が,ご質問の箇所に辿り着いていない(別のルートで抜けてしまっているなど) 2.実際にはfalseになっていない(ご質問に掲示されたスナップショットも,falseではない絵のようにも見えます) などの状況も考えられます。 マクロを書いて漫然と実行し,「うごいたーとまったー」と一喜一憂するのではなく,動作がおかしいと思ったらその少し手前で「ブレイクポイント」を設け(若しくはStop命令を記入し),「ステップ実行(F8を連打)」を行ってマクロの動作を一行ずつトレースしてください。こういう作業を「デバッグ」と言いますが,マクロの開発では絶対に手抜きしてはいけない作業の一つです。 参考: http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html ステップ実行によって,マクロの実行が間違いなくif opt1.value = false and … の行に辿り着いているか,前段の意図しないルートで終了してしまったりしてないかなどを確認します。 また間違いなくifの行に辿り着いているのにあっさりend ifに抜けてしまったなら,その時はopt1,2,3,4の値がfalseでは無いということです。イミディエイトウィンドウなどを使って「その時の実際の値」を再確認したり,更に前段のマクロに遡って,妙な値の操作をしていたりしないか確認します。

puyopa
質問者

お礼

解答ありがとうございました。 アドバイスいただいた、デバッグを実践して、自分のマクロを検証することが、できました。 (今頃ですみません) 最終的には、明確に原因はつかめませんでしたが、Isnull関数を用いることで解決いたしました。 とても勉強になりました。ありがとうございました。

関連するQ&A

  • Excel VBA オプションボタンについて

    こんばんは オプションボタンが5つあり、 登録ボタンが1つあるユーザーフォームを作りました。 このオプションにチェックを入れずに登録ボタンを押したときに 「必ず選択してください。」とメッセージを表示し、再度入力させるようにしたいのですが、どうしたらよいのでしょうか。 Excelのバージョンは2003です。 調べたところ (1)で動きそうだ。ということが判ったのですがチェックを入れ値がtrueになるとエラーが発生して止まってしまいます。(理由がわかりません) Private Sub commandbutton2_click() Dim opt As ControlFormat, flg As Boolean flg = False For Each opt In frame1.Controls If opt.Value = True Then '←ここの行でtrueだった場合のエラーが発生してしまう。 flg = True Selection.Value = opt.Caption End If Next Unload userform1 End Sub (2)この方法で何とか動いたのですが、初めの方に書いたとおり、オプションボタンが選択されずに登録ボタンが押された場合、チェックするように促すメッセージを表示する方法がわかりません。また、できればユーザーホームの×ボタンを押せなくする方法もしくは、閉じられた場合にマクロを抜けるようにするにはどうしたらよいのでしょうか。宜しくお願い致します。 Private Sub commandbutton1_click() Dim i As Integer For i = 1 To 5 If Me.Controls("optionbutton" & i).Value = True Then Selection.Value = Me.Controls("optionbutton" & i).Caption End If Next i Unload userform1 End Sub

  • シートの条件選択

    EXCEL2003で下記のようにユーザーフォーム上のオプションボタンと チェックボックスの選択状況に応じてシートを選択するようにしていました が、EXCEL2007で実行したら、「sel_sw」のところで 「コンパイルエラー:プロジェクトおよびライブラリが見つかりません」 とエラーが出てしまいました。 EXCEL2007ではどのように記述すればよいか、教えていただけますでしょうか。 よろしくお願いします。 --------------------------------------------------------------- Private Sub 印刷する_Click() UserForm9.Hide With UserForm9 If .OptionButton1 = False And .OptionButton2 = False Then MsgBox ("オプションボタン選択") GoTo error End If If .CheckBox2 = False And .CheckBox3 = False And .CheckBox4 = False And .CheckBox5 = False Then MsgBox ("チェックボックスを選択") GoTo error Else sel_sw = True If .CheckBox2 = True And .OptionButton1 = True Then Sheets("A").Select sel_sw sel_sw = False End If If .CheckBox2 = True And .OptionButton2 = True Then Sheets("B").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton1 = True Then Sheets("C").Select sel_sw sel_sw = False End If If .CheckBox3 = True And .OptionButton2 = True Then Sheets("D").Select sel_sw sel_sw = False End If If .CheckBox4 = True Then Sheets("E").Select sel_sw sel_sw = False End If If .CheckBox5 = True Then Sheets("F").Select sel_sw sel_sw = False End If End If End With Exit Sub error: UserForm9.Show End Sub

  • エクセルVBAでスピンボタン

    ワークシート上にスピンボタンを配置しました。 Valueは、Max100、Min0 で設定しました。 やりたいのは、スピンボタンでValueを減らしていって、0になるまでは何も言わず、Valueが0の状態でさらに減らそうとした場合、メッセージを出したいのです。 Private Sub SpinButton1_Change() If SpinButton1 <= 0 Then MsgBox "マイナスにはできません!", vbCritical End If End Sub としましたら、0になった瞬間にメッセージがでてしまいます。 If SpinButton1 < 0 Then としたら、マイナスにはならないので当たり前ですが何も出ません。 どうしたらいいでしょうか?

  • エクセルVBA 赤ペン先生をお願いします

    皆さんこんにちは。 エクセル2013使用しているVBA初心者です。 エクセルVBAでコードをど根性&こちらで質問させていただいた時のご回答を元に 作成してみたのですが思うような動作になりません。 下記のコードが美しくないのも重々承知しておりますが 下記内容で修正するべき個所を教えていただけないでしょうか。 やりたい事は ・ユーザーフォーム5でフレームが2個あり  1個は作成書類を7個から1つ選択  もう1個は支社を7個から1つ選択  →「次へ」のボタンを押すと「○○と△△支社を選択しています。お客様情報に~」のメッセージ表示  →OK→処理を続行します→OKならユーザーフォーム4(お客様情報)を開く   キャンセル→処理を中断します→ユーザーフォーム5を再度表示して選択し直せるように・・・   という事をやりたいのですが知識不足の上いくら参考書等を探しても これだ!というものにたどりつけずに困っています。 「○○と△△支社が選択されています」の箇所も myMSG & vbCrLf & "と" & myMSG & だと「△△と△△支社が選択されています」に なってしまうのは理解出来ているのですが代わりにいれるコードも分かりません。 また、「メッセージ表示のOK」を押して「処理を続行しますのキャンセル」を押しても ユーザーフォーム5に戻ることはなくユーザーフォーム4に 進んでしまう始末です。 毎度拙い質問文で申し訳ございませんが どうか皆様のお知恵をお借りできないでしょうか。 ※コードはコマンドボタン1(次へ)に書いてあります。 ---------------------------------------------------------------------------------- Private Sub CommandButton1_Click() Dim myMSG As String Dim i As Integer For i = 1 To 14 If Me.Controls("OptionButton" & i).Value = True Then myMSG = Me.Controls("OptionButton" & i).Caption End If If (OptionButton1 Or OptionButton2 Or OptionButton3 Or OptionButton4 Or OptionButton5 Or OptionButton6 Or OptionButton7) = False Then MsgBox ("作成する書類を選択して下さい") Me.Hide UserForm5.Show End If If (OptionButton8 Or OptionButton9 Or OptionButton10 Or OptionButton11 Or OptionButton12 Or OptionButton13 Or OptionButton14) = False Then MsgBox ("支社を選択して下さい") Me.Hide UserForm5.Show End If Next i intRtn = MsgBox(myMSG & vbCrLf & "と" & myMSG & "支社" & vbCrLf & "が選択されています。" & vbLf & _ "お客様情報に移動します。", _ vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox ("処理をキャンセルしました。") Me.Hide UserForm5.Show End If intRtn = MsgBox("処理を続行します。", vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") Unload UserForm5 UserForm4.Show If intRtn <> vbOK Then MsgBox ("処理をキャンセルしました。") Me.Hide UserForm5.Show End If End Sub Private Sub UserForm5_QueryClose(Cancel As Integer, CloseMode As Integer) 'Formが閉じるとき If CloseMode = 0 Then '×ボタンを押された場合 End 'プログラムの実行を終了 End If End Sub

  • エクセルVBAオプションボタンの選択画面に戻りたい

    皆さんこんにちは。 エクセルVBAの初心者です。 選択画面に戻るためのコードが足りていない感じなのですが・・ ご教授をお願いします。 ※エクセル2013を使用しています。 ユーザーフォーム1で作成書類を5種類から選択するようにしました。 選択後、「次へ」のボタンを押すと 『○○が選択されています。支社選択画面に移動します。』という メッセージが出るようにコードを作りました。 「OK」を押せば次の選択画面が開くように今後作っていく予定なのですが 「キャンセル」を押すとユーザーフォーム1が画面から消えるようになってしまっています。 やりたい事は「キャンセル」を押し『処理をキャンセルしました。』と メッセージが出た後に 最初のユーザーフォームで作成書類を選択し直すところに戻りたいのです。 私が作成したコードを記載しますので どこがどう間違っているのか、何が足りないのか ご教授いただければ幸いです。 ----------------------------------------------------- Private Sub CommandButton1_Click() Dim myMSG As String Dim i As Integer For i = 1 To 5 If Me.Controls("OptionButton" & i).Value = True Then myMSG = Me.Controls("OptionButton" & i).Caption End If Next i intRtn = MsgBox(myMSG & vbCrLf & "が選択されています。" & vbLf & _ "支社選択画面に移動します。", _ vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox "処理をキャンセルしました。" End End If intRtn = MsgBox("処理を続行します。", vbOKCancel + vbExclamation + vbDefaultButton2, _ "作成書類選択") If intRtn <> vbOK Then MsgBox "処理をキャンセルしました。" End End If End Sub

  • Excel2007 VBA シート上のオプションボタン

    Excel2007のVBAで質問があります。 シート上に複数(90個)のオプションボタンが設置しているシートが有りコマンドボタンが押されたときに どのオプションボタンが選択されているか判断したいのですが、 IF文で一つ一つ下記のように書くと個数が多いたムダに長いロジックになります。 If Worksheets("Sheet1").OptionButton1.Value Then chk_f = 1 end If If Worksheets("Sheet1").OptionButton2.Value Then chk_f = 2 end If         :         : ユーザーフォームに設置しているオプションボタンは、下記のようにFor文で回せるのは判っているのですが、 For i = 1 To 90 If Me.Controls("OptionButton" & i).Value Then chk_f = i exit for End If Next シート上のオプションボタンでも同様の事は可能でしょうか? もしなければオプションボタンとセルをリンクさせてそのセルをFor文で回して確認していく方法が出来るかなと考えています。

  • VBAでエラー時の処理について

    入力画面には3つのTextBoxあり、すべてを入力したら「記入」ボタンをクリックします。 その時、TextBox2とTextBox3の合計がTextBox1の値と一致するか判定します。 一致した場合は、その値を選択したセルに表示し、一致しなかった場合は、メッセージを表示させ、メッセージの「OK」ボタンをクリックすると「記入」ボタンがクリックされる前の状態(UserForm1の入力項目にデータが入力されている状態)に戻したいのですが、どのようにしたらよいのでしょうか。 現在は、下記のようなかんじになっています。 Private Sub CommandButton1_Click()   Sum = 0  For N = 1 To 2  If Controls("TextBox" & N).Text = "" Then   RepMsg = MsgBox("値を入力して下さい。", vbOKOnly + vbExclamation, "入力確認")   『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』  Else   Sum = Val(Controls("TextBox" & N).Text) + Sum  End If  Next N  If Val(TextBox1.Text) <> Sum Then   RepMsg = MsgBox("合計が一致しません。", vbOKOnly + vbExclamation, "合計確認")   If RepMsg = vbOK Then    『? 「記入」ボタンがクリックされる前の画面(UserForm1)に戻る』   End If  End If ( 表示 ) End Sub

  • エクセルVBAで

    お世話になります。 エクセルVBAで簡易プログラムを作成しています。 その中でユーザーフォームを作り、チェックボックスで 6項目からどれか一つ選択する様な仕組みを作っています。 利用者が二つ以上選択(チェック)出来ない様にしたいの ですが、どの様にすれば良いでしょうか。 ちなみに今の記述は下記の様になります。 ご教授下さいます様、宜しくお願い致します。         記 If CheckBox1 = False Then If CheckBox2 = False Then If CheckBox3 = False Then If CheckBox4 = False Then If CheckBox5 = False Then If CheckBox6 = False Then MsgBox "どれか選択して下さい!" GoTo err_jmp Else: mytoki = "3年前から" End If Else: mytoki = "2年前から" End If Else: mytoki = "1年前から" End If Else: mytoki = "半年前から" End If Else: mytoki = "1週間前から" End If Else: mytoki = "昨日から" End If

  • エクセルVBAのオプションボタンがうまくいきません 

    エクセルのVBAでフォームをつくり 3つのオプションボタンを配置し チェックした項目のとき、指定したセルに「レ」の印を書き込ませたいのですが、うまくいきません。 同じフォーム内のテキストボックスやコンボボックスの内容はうまくセルに書き込めるのですが・・・ オプションボタンのグループは設定してあります。 下のように記述したのですが、なぜ思うように動作しないか教えてください。 If オプション(3) = True Then ActiveCell.Value = "レ" ElseIf オプション(1) = True Then Range("H21").Value = "レ" ElseIf オプション(2) = True Then Range("H23").Value = "レ" End If

  • エクセル IF について!

    UserForm上にTextBoxとコマンドボタンがあり、TextBoxに数字を入れコマンドボタンをクリックすると'A.xlsをセットしてAシートの使用行を格納し検索して他のTextBoxにも反映させていくやり方でマクロを記述しています。そこでTextBoxに入力した数字がない場合はMsgBox”この数字はありません”という形にしたいのですが・・・どのようにすれば良いのか教えて下さい。 If Me.Controls("TextBox1" & Cnt).Value = "" Then MsgBox "呼出したい数字を入力して下さい" Exit Sub End If Set wbMyBook = Workbooks(ThisWorkbook.Name) If MsgBox("以前の記録を呼び戻しますか?", vbOKCancel) = vbOK Then Application.ScreenUpdating = False strMyBookPath = ThisWorkbook.Path If Dir(strMyBookPath & "\" & k1Name) <> "" Then 'あった場合そのブックが空いているか確認する。 flag = False For Each wb In Workbooks '開いていればTrue,開いていなければFalseを設定 If wb.Name = k1Name Then flag = True Exit For End If Next wb 'ブックが開いていなかった場合、ブックを開ける。 If flag = False Then Workbooks.Open strMyBookPath & "\" & k1Name End If Set k1 = Workbooks(k1Name) Set SH1 = k1.Worksheets("Sheet1") Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If lngYcnt_K = SH1.UsedRange.Rows.Count flag = False For lng = 1 To lngYcnt_K If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then TextBox3.Value = SH1.Cells(lngNumber, 2) '氏名 End If If SH1.Cells(lngNumber, 3) = "男" Then OptionButton1.Value = True ElseIf SH1.Cells(lngNumber, 3) = "女" Then OptionButton2.Value = True Else OptionButton1.Value = True OptionButton2.Value = False End If MsgBox " 記録を呼び戻しました" Else MsgBox"確認必要"⇒ここにもし数字が違っていたら表示させたいのですが・・・ End If MsgBox " 以前に記録しましたか?" Application.DisplayAlerts = False k1.Close saveChanges:=True Application.DisplayAlerts = True '-------------------------------------------------------------------------- '画面更新ON Application.ScreenUpdating = False End Sub

専門家に質問してみよう