- ベストアンサー
エクセルVBA/フォームのオプションボタンを元に戻す
ワークシート上に、フォームのオプションボタンが7個貼ってあります。 名前はOP1~OP7とします。 ある一定の条件に合致した場合、押されたオプションボタンがxlonになるのをキャンセルし、前にオンになっていたオプションを再度xlonにしたいのですが、Appication.Undoではエラーになってしまいました。 どうやったら前の状態に戻せるのでしょうか?
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Application.Callerとは何とお洒落な。。(^o^) ------------------------------------------------------------------ Public myOpValues(7) As Integer 'これmyOpValues(7) ってどういう意味ですか? ●ひとつ前の7個のオプションボタンの状態を保持するための配列 ------------------------------------------------------------------- If n <> OpNo And myOpValues(n) = 1 Then 'このmyOpValues(N) はなんですか? ●配列myOpValues()にはひとつ前のオプションボタンの状態が入っているので元に戻すためにそこをチェックしています --------------------------------------------------------------- ActiveSheet.OptionButtons(n).Value = 1 ●そしてここで元の状態に戻しています ---------------------------------------------------------------- myOpValues(N) = 0 'このmyOpValues(N)=0 はどんな意味ですか? ●現在のオプションボタンの状態を配列に再設定する為に先ず、Offにしているだけです。 ------------------------------------------------------------ If N = OpNo Then myOpValues(N) = 1 ●そしてここでいまクリックされたオプションボタンの状態"On"を配列に保持 ----------------------------------------------------------- ということになりますがある別の場合も考えていたのでちょと分かり難いコードになりました。 そこで単純に補足のようなことでよければ以下のようにシンプルにすることもできますね。 ========================================================= Sub OpCheck(OpNo) Dim N As Integer If ActiveSheet.CheckBoxes("CCK" & OpNo).Value <> 1 Then MsgBox "そこは選べないわよ。", vbCritical, "Sorry!!" For N = 1 To 7 ActiveSheet.OptionButtons(N).Value = myOpValues(N) Next N End If For N = 1 To 7 myOpValues(N) = ActiveSheet.OptionButtons(N).Value Next N End Sub ============================================================ それから、こんな時はどうするのでしょう。 例えば、CCK3にチェック、OP3がONの状態の時、CCK3のチェックを外した場合、OP3はONのまま?それともOFFにする? 以上です。
その他の回答 (14)
1、CommandButton1_Click() ----> 1 ON 2、CommandButton2_Click() ----> 3 ON 3、CommandButton3_Click() ----> 1 ON キャンセルの場合 UpdateOption 0 というルールです。 Private Sub CommandButton1_Click() MsgBox "1=True" UpdateOption 1 End Sub Private Sub CommandButton2_Click() MsgBox "3=True" UpdateOption 3 End Sub Private Sub CommandButton3_Click() MsgBox "キャンセル" UpdateOption 0 End Sub Public Sub UpdateOption(ByVal intIndex As Integer) On Error Resume Next Static OldIndex(1) As Integer Dim OptionsValues(7) As Boolean intIndex = IIf(intIndex = 0, OldIndex(1), intIndex) OptionsValues(OldIndex(1)) = False OptionsValues(intIndex) = True Me.OptionButton1.Value = OptionsValues(1) Me.OptionButton2.Value = OptionsValues(2) Me.OptionButton3.Value = OptionsValues(3) Me.OptionButton4.Value = OptionsValues(4) Me.OptionButton5.Value = OptionsValues(5) Me.OptionButton6.Value = OptionsValues(6) Me.OptionButton7.Value = OptionsValues(7) OldIndex(1) = OldIndex(0) OldIndex(0) = intIndex Workbooks("sheet1").Refresh End Sub
お礼
すみません、コントロールツールボックスのOptionButtonではなく、フォームのオプションボタンなんです。
>VBAはオプションボタンから作動させたいのです これらのオプションボタンを押す時には条件は整っているのですよね? 単純に下記のような物をオプションボタン全てに登録したのではダメですか? C1の値が1になると実質オプションの切り替えが利かなくなります。 Sub OpChk() If Range("C1").Value = 1 Then Range("A1").Value = Range("B1").Value Else Range("B1").Value = Range("A1").Value End If End Sub
お礼
さっそくありがとうございます。 > これらのオプションボタンを押す時には条件は整っているのですよね? どのオプションボタンを押したかで、条件が整うのです。仮にC1セルの値が「TRUE」の時に3番目のオプションボタンを押されたら「キャンセル」させるといった具合です。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 こうすればどうでしょうか? OptionButton のOnAction にマクロを置いて、On/Off を確保させ、他のマクロで、戻させます。 なお、なるべく、ActiveSheetではなく、明示的なシート名のほうがよいです。 Private Ops() As Long Sub OPValueStock() 'オプションボタンの値を確保 Dim i As Integer With ActiveSheet ReDim Ops(1 To .OptionButtons.Count) For i = 1 To .OptionButtons.Count Ops(i) = .OptionButtons(i).Value Next End With End Sub Sub OPRecover() 'オプションボタンの値を戻す Dim j As Long Dim i As Integer On Error GoTo EndLine j = UBound(Ops()) With ActiveSheet For i = 1 To .OptionButtons.Count If Ops(i) = 1 Then .OptionButtons(i).Value = 1 End If Next End With EndLine: End Sub
お礼
さっそくありがとうございます。 ためしに新しいシートにフォームのオプションボタンを7個配置し、それぞれにSub OPValueStockを設定しました。 オプションボタンを押したのち、Sub OPRecoverを走らせましたが、オプションボタンは元には戻りませんでした。やりかたがまずいのでしょうか?
どこかのシートにON・OFFの状態を残すようにして、条件に合致した場合だけ そのシートの情報を読み込めばよろしいのでは?
お礼
早速ありがとうございます。 VBAはオプションボタンから作動させたいのです。ところが、オプションボタンのリンク先セルの値(1~7)はオプションボタンをクリックすると変わってしまいますので前の値を保存できないのです。(泣)
- 1
- 2
お礼
ご丁寧にありがとうございました。 > CCK3にチェック、OP3がONの状態の時、CCK3のチェックを外した場合、OP3はONのまま?それともOFFにする? これは下記のコードで対処済みなんです。 Sub CCK_Click() Dim x As Integer x = Right(Application.Caller, 1) With ActiveSheet If .CheckBoxes("CCK" & x).Value = 1 Then Exit Sub If .OptionButtons("Opt" & x).Value = xlOn Then MsgBox "これははずしちゃだめ!", vbCritical, "Sorry!!" .CheckBoxes("CCK" & x).Value = 1 End If End With End Sub
補足
すみません、あとひとついいですか? ActiveSheet.OptionButtons(n) ですが、現在はOption Button 1~7に、それぞれOpt1~Opt7の名前を付けていますので問題ないと思いますが、これが仮にOption Button 1~7という規則的ならびではなかったものをOpt1~Opt7の名前をつけていたとしたらやはり使えないんでしょうねぇ?