プロが教えるわが家の防犯対策術!

エクセルのユーザーフォームにてトグルボタンを使用しています。
トグルボタンの使用方法は『あり』と『なし』になります。
『あり』を押したときは『なし』を戻して、『あり』を押した状態にし
『なし』を押したときは『あり』を戻して、『なし』を押した状態にすると言うような
標準的な使い方だと思う形にしています。

問題はユーザーフォーム1個目に関しては問題なく上記内容で動くのですが、
それを丸々コピーした2個目のユーザーフォームは『なし』が押された状態から『あり』を押すと
『なし』は戻るのですが『あり』が押した状態になりません。その後『あり』をもう一度押すと
『あり』が押した状態になります。『なし』でも『あり』でも結局はシングルクリック2回必要になっています。

VB自体の構文やボタン名は1個目のユーザーフォームと全く同じにしているのに、1個目は出来て
2個目は出来ないと言うのがよくわかりません。
何か対応策があれば教えていただきたいです。

一応下記にそのVBを載せておきます。
よろしくお願いいたします。

Private Sub ToggleButton1_Click()
If flag = 1 Then Exit Sub
If ToggleButton1 = True Then
ToggleButton1.BackColor = RGB(0, 255, 0)
Else
ToggleButton1.BackColor = "&H8000000F"
End If
Call Test(1)
End Sub
'========================================
Private Sub ToggleButton2_Click()
If flag = 1 Then Exit Sub
If ToggleButton1 = True Then
ToggleButton1.BackColor = RGB(0, 255, 0)
Else
ToggleButton1.BackColor = "&H8000000F"
End If
Call Test(2)
End Sub
'========================================
Private Sub test(ByVal j As Variant)
flag = 1
For i = 1 To 2
If i <> j Then
Controls("ToggleButton" & i).Value = False
Controls("ToggleButton" & i).BackColor = "&H8000000F"
End If
Next
flag = 0
End Sub

A 回答 (4件)

flagを定義している場所はどこですか。


又、どのように定義していますか。
    • good
    • 0

両方を表示したとして2の方を弄って挙動がおかしい時、1のコントロールはどうなってますか?


コピペでコントロール名が同じだからじゃないですかね?
確かExcelは通しで番号はつかなかったような???
    • good
    • 0

No.2です。



初級レベルなジジィですから間違っているかもですが、双方のコードのコントロールの前に

Me.ToggleButton1 ~

としてみるとどうかな?
    • good
    • 0

こんにちは、


自己解決へのヒントとしては、
ブレークポイントを作り、ステップ実行で確認してみる事を勧めます。
2回目の時
flag = 1 で代入した値が _Click の  flagの値が Emptyになっていませんか?(変数宣言がないと推測してVariantでEmpty)
Emptyなら原因はflagの変数宣言がモジュールレベル変数になっていない為と推測できます。

そのため、If flag = 1 Then Exit Sub で抜けないのでtest(j)が繰り返し呼ばれ、Call Test(1)Call Test(2) (i=1 とi=2) が実行されてしまいます。

あと、両方のボタンに同じコードがありますが、同じ処理で良いのなら
test(j)に入れても良いのではないかと思います。

余談ですが、
面倒でもExcel VBAの場合、エディタオプションの変数宣言を強制するにチェックを入れて使われた方が良いです。
モジュール初めに Option Explicit です
    • good
    • 3

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