• ベストアンサー

エクセルVBA/フォームのオプションボタンを元に戻す

ワークシート上に、フォームのオプションボタンが7個貼ってあります。 名前はOP1~OP7とします。 ある一定の条件に合致した場合、押されたオプションボタンがxlonになるのをキャンセルし、前にオンになっていたオプションを再度xlonにしたいのですが、Appication.Undoではエラーになってしまいました。 どうやったら前の状態に戻せるのでしょうか?

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

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.14

こんにちは。 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にする? 以上です。  

merlionXX
質問者

お礼

ご丁寧にありがとうございました。 > 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

merlionXX
質問者

補足

すみません、あとひとついいですか? ActiveSheet.OptionButtons(n) ですが、現在はOption Button 1~7に、それぞれOpt1~Opt7の名前を付けていますので問題ないと思いますが、これが仮にOption Button 1~7という規則的ならびではなかったものをOpt1~Opt7の名前をつけていたとしたらやはり使えないんでしょうねぇ?

その他の回答 (14)

noname#22222
noname#22222
回答No.4

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

merlionXX
質問者

お礼

すみません、コントロールツールボックスのOptionButtonではなく、フォームのオプションボタンなんです。

noname#123709
noname#123709
回答No.3

>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

merlionXX
質問者

お礼

さっそくありがとうございます。 > これらのオプションボタンを押す時には条件は整っているのですよね? どのオプションボタンを押したかで、条件が整うのです。仮にC1セルの値が「TRUE」の時に3番目のオプションボタンを押されたら「キャンセル」させるといった具合です。

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

こんにちは。 こうすればどうでしょうか? 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

merlionXX
質問者

お礼

さっそくありがとうございます。 ためしに新しいシートにフォームのオプションボタンを7個配置し、それぞれにSub OPValueStockを設定しました。 オプションボタンを押したのち、Sub OPRecoverを走らせましたが、オプションボタンは元には戻りませんでした。やりかたがまずいのでしょうか?

noname#123709
noname#123709
回答No.1

どこかのシートにON・OFFの状態を残すようにして、条件に合致した場合だけ そのシートの情報を読み込めばよろしいのでは?

merlionXX
質問者

お礼

早速ありがとうございます。 VBAはオプションボタンから作動させたいのです。ところが、オプションボタンのリンク先セルの値(1~7)はオプションボタンをクリックすると変わってしまいますので前の値を保存できないのです。(泣)

関連するQ&A