- 締切済み
VBA EXCEL optionbuttonの選択
現在オプションボタンにて設定下記のようにしています。 オプションボタンをいくつか設置しており、どれか選択すると下記のコードへ飛んできます。 どれか選択すると、enabledをtrueにし、OKボタンをクリックできる。そしてどのオプション ボタンを選択したのか他のモジュールから確認する為tagにその痕跡を残すように設定しています。 Public Sub OptionButton1_Click() 'オプションボタン選択動作。OKボタンを有効へ Cmd_ok.Enabled = True OptionButton1.Tag = True End Sub Public Sub OptionButton2_Click() 'オプションボタン選択動作。OKボタンを有効へ Cmd_ok.Enabled = True OptionButton2.Tag = True End Sub Public Sub OptionButton3_Click() 'オプションボタン選択動作。OKボタンを有効へ Cmd_ok.Enabled = True OptionButton3.Tag = True End Sub ****************** そして下記のコードでどのオプションボタンが選択されたのか確認しています。 For i = 1 To 3 If UserForm1.Controls("OptionButton" & i).Tag = True Then xxx = i End If Next i ******************** 一番上にある『OptionButton1.Tag = True』と設定しているものを選択されたオプションボタン からみて相対的な表現に変更できないでしょうか? 意味としては『現在選択されているオプションボタンのtag = true』といった表現です。 現状でも目的は果たせますが、これからボタンが複数になった場合、オプションボタンのオブジェクト名を変更しなくなった時に手間がしないようにする事が目的です。 もしくはもっとスマートなコードがあれば歓迎です。 ご指導お願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
実験的なコード。 //UserForm1 Dim myClass() As Class1 Dim colControls As Collection Private Sub UserForm_Initialize() Dim cntl As Object Dim i As Long Set colControls = New Collection For Each cntl In Me.Controls If TypeOf cntl Is MSForms.OptionButton Then ReDim Preserve myClass(i) Set myClass(i) = New Class1 myClass(i).Opb = cntl colControls.Add myClass(i).Opb myClass(i).Index = i + 1 i = i + 1 End If Next cntl End Sub '//Class1 Private WithEvents clOptionButton As MSForms.OptionButton Private mIntIndex As Integer Public Property Get Opb() As MSForms.OptionButton Set clOpButton = clOptionButton End Property Public Property Let Opb(ByVal clNewOptionButton As MSForms.OptionButton) Set clOptionButton = clNewOptionButton End Property Private Sub clOptionButton_Click() MsgBox "クリックしたものは、" & clOptionButton.Caption & " " & mIntIndex End Sub Public Property Get Index() As Integer Index = mIntIndex End Property Public Property Let Index(ByVal intNewValue As Integer) mIntIndex = intNewValue End Property
- Wendy02
- ベストアンサー率57% (3570/6232)
たぶん、ご質問者さんは、回答者の書いている内容を読んでいるか分かりませんので、最初に書かせていただきます。 自力で一歩一歩解決しようと努力すべきだと思います。その努力している人の掲示板の質問は、それなりに雰囲気やマナーの対応にも現れてくると思います。ご質問者さんのご質問には、私は、これで、4度目の回答です。お礼率が非常に悪いようです。回答者も人間です。マナーの悪さは覚えられます。誰であろうが、マトモの回答なら、その後、どんな状態なのか、きちんと教えてください。回答者も質問者と同様に、相手の反応によって学ぶことが多いからです。 今のようなマナーを繰り返しますと、つまらないレスしかつかないことになる可能性が強いです。他の掲示板では相手されなくなります。今からでも、遅くありません。締めても、お礼は書き込めます。回答者には、それぞれの専門性があるので、よほどのマヌケな人でない限りは、質問の種類を選んでいますから、同じ人が回答したり見ている可能性が高いです。 ご質問者さんは、通してみると、全体的に質問内容のレベルのバランスが取れていないようです。現在の状態では、回答された内容が、どれひとつとして生きていないのではないかと思ってしまいます。時々、自分の実力に合わない質問をして、初級レベルを知らないことに指摘される人がいます。 今回、VBAをまったく知らない人の回答がついていますが、ここの掲示板は、そもそも、この程度だと思います。でも、ここで続けるなら、どこかで、特定の回答者を信頼していくしかないと思うのです。良い回答を得るには、熱心さが大事だと思います。 さて、質問に書かれたコードは、UserForm上で使うものだとするなら、ローカルモジュールですから、Public キーワードは付きません。こういうルールは基本的に守らなくてはなりません。 >Public Sub OptionButton1_Click() >'オプションボタン選択動作。OKボタンを有効へ もともと、OptionButtonのValueは、True/False ですから、そのまま、ループさせればよいだけです。Tagは、本来、任意のCommandButton コントロールを取り付けたときに、FindControlで検索するのを助けるためにしたような気がします。Tag に何を入れようとしても構わないけれども、基本的に文字列のはずです。通常は、ひとつ、サブルーチンマクロを作って、オブジェクト名から数値などを出すというのが、一般的です。 >オプションボタンのオブジェクト名を変更しなくなった時に オブジェクト名を変更したくなったという意味でしょうか?(変える場合には、必ず、右端は必ず数値にして置けばよいはずです。そういうルール付けが必要です。) 'CommandButton * 1 'TextBox * 1 'OptionButton 任意の数 Dim buf As String Private Sub UserForm_Initialize() CommandButton1.Enabled = False End Sub Private Sub OptionButton1_Click() Call TestMsg(Me.ActiveControl) End Sub 'オブジェクト名を変えて、同じものを並べる Sub TestMsg(obj As Control) CommandButton1.Enabled = True buf = "" MsgBox "選択されているオプションボタンは、" & obj.Name buf = obj.Name End Sub Private Sub CommandButton1_Click() If buf <> "" Then TextBox1.Text = buf Else MsgBox "現在、記録が保続されていません。", vbCritical End If CommandButton1.Enabled = False End Sub 他では、Mougなどで紹介されているインスタンスを置くという方法があります。しかし、同じUserForm上のイベントで、インスタンスを置いて、別のイベントを作るのは、なんとなくワザにこだわっている気がします。それと、将来にも(VB.Net)にも、インスタンスを設ける以外に、コントロール配列などはないと思ったほうがよいですね。 次のレスに、インスタンスの作り方を書いておきます。大げさなコードのバカバカしさで、こういうものは、手を出さないほうがよいです。
- samtomsan
- ベストアンサー率55% (1060/1897)
option buttonをコントロール配列にされたらいかがでしょうか。 クリックの処理は1つになりますし、その中で xxx = i も行なえば良いかと。 Private Sub Option1_Click(Index As Integer) Cmd_ok.Enabled = True xxx = Index End Sub