アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (15件中1~10件)

どこかのシートにON・OFFの状態を残すようにして、条件に合致した場合だけ


そのシートの情報を読み込めばよろしいのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/23 14:18

こんにちは。



こうすればどうでしょうか?

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
    • good
    • 0
この回答へのお礼

さっそくありがとうございます。

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

お礼日時:2006/03/23 17:04

>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
    • good
    • 0
この回答へのお礼

さっそくありがとうございます。
> これらのオプションボタンを押す時には条件は整っているのですよね?

どのオプションボタンを押したかで、条件が整うのです。仮にC1セルの値が「TRUE」の時に3番目のオプションボタンを押されたら「キャンセル」させるといった具合です。

お礼日時:2006/03/23 17:07

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/23 17:11

s_husky です。



回答を外しましたので訂正!

入力は手動。
キャンセルはコマンドボタンのようです。
ならば、多少、変更が必要です。

Private Sub OptionButton1_Click()
  UpdateOption 1
End Sub

Private Sub OptionButton2_Click()
  UpdateOption 2
End Sub
 |
 |
Private Sub OptionButton7_Click()
  UpdateOption 7
End Sub

Private Sub cmdCancel_Click()
  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
  Dim isCancel     As Boolean

  isCancel = intIndex = 0
  intIndex = IIf(isCancel, OldIndex(1), intIndex)
  If isCancel Then
    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)
  End If
  OldIndex(1) = OldIndex(0)
  OldIndex(0) = intIndex
End Sub
    • good
    • 0

こんにちは。



>Sub OPRecoverを走らせましたが、オプションボタンは元には戻りませんでした。
大方、それは、モジュールレベル変数が抜けているのだと思います。

Private Ops() As Long '←これ

ただし、他のプロシージャが同一のモジュールにない場合は、Public にしてくださいね。
    • good
    • 0
この回答へのお礼

> Private Ops() As Long '←これ

いいえ、忘れていません。同一モジュールの一番上にあります。
でも、考えたんですが、各オプションボタンにSub OPValueStock()を登録しても、それで保存されるのはオプションボタンを押した状態での配列ですよね?押す前の状態は保存されないのでは?(よくわかってもないのにすみません)

お礼日時:2006/03/23 17:52

エクセルは門外漢ですが。


フォームのオプションボタンをはじめて使いました。。。

Option Explicit

Dim OptionIndex As Integer

Private Function CheckCondition() As Boolean
'キャンセルする条件の場合 True を返してね。
CheckCondition = False
End Function

Private Sub SetOption(Idx As Integer, sw As Boolean)
Sheet2.Shapes("Opt" & Idx).ControlFormat.Value = sw
If sw Then
OptionIndex = Idx
Else
OptionIndex = 0
End If
End Sub

Private Sub CheckOption(Idx As Integer)
If Not CheckCondition Then
OptionIndex = Idx
Else
If OptionIndex <> 0 Then
SetOption OptionIndex, True
Else
SetOption Idx, False
End If
End If
End Sub

Public Sub Opt1_Click()
CheckOption 1
End Sub

Public Sub Opt2_Click()
CheckOption 2
End Sub
'・・・・・・
Public Sub Opt7_Click()
CheckOption 7
End Sub
    • good
    • 0

こんばんは。



>でも、考えたんですが、各オプションボタンにSub OPValueStock()を登録しても、それで保存されるのはオプションボタンを押した状態での配列ですよね?押す前の状態は保存されないのでは?

まったく、押されていない、すべてオフの状態では、登録をしたところで、全部オフです。

しかし、もしも、すでに、押されている状態を取得するのでしたら、Sheet_Activate イベントやWorkbook_Open イベントで取ります。

もし、固定状態でしたら、最初から、配列で、どれか1つに、1を代入すればよいわけです。

後は、配列の中身を、ローカルウィンドウで確保されているかみてください。
On は、1として入っているはずです。
    • good
    • 0

#7です。



>Private Sub SetOption(Idx As Integer, sw As Boolean)
>Sheet2.Shapes("Opt" & Idx).ControlFormat.Value = sw

>Private Sub SetOption(Idx As Integer, sw As Boolean)
ActiveSheet.Shapes("Opt" & Idx).ControlFormat.Value = sw

にしてください。ゴメン
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちょっとわたしには手におえませんでした。ごめんなさい。

お礼日時:2006/03/24 11:27

s_husky です。



ルーチンとコードの記述内容は同じです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちょっとわたしには手におえませんでした。ごめんなさい

お礼日時:2006/03/24 11:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!