[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オプションボタンのチェック状況を一発で取得』(カシスソーダ)
こんにちは、よろしくお願いいたします。
ウィンドウズ:XP SP3 Excel:2002 です。
ユーザーフォームに配置してある複数のオプションボタンのどれにチェックが 入っているか「一発」で取得する方法を探しています。オプションボタンは ユーザーフォーム起動時にマクロで配置したものです。
たとえば、下記のようにオプションボタンをループでTrueか否かを判定して いく方法ですと一応取得できます。
'ユーザーフォームモジュール Dim mydate As Date
Private Sub CommandButton1_Click() Dim i As Integer Dim num As Integer num = 42 For i = 1 To num If Me.Controls("OptionButton" & i + 7).Value = True Then mydate = DateAdd("d", i - 1, kaidate) Exit For End If Next i MsgBox mydate End Sub
Private Sub UserForm_Initialize() kaidate = DateSerial(Year(Date), Month(Date), 1) End Sub
また、クラスを使ってオプションボタンにイベントマクロを割り付けておくと オプションボタンのクリックでどのオプションボタンにチェックが入ったかを 取得できます。
今回の質問は、ループやイベントの割付けをすることなくコマンドボタンなど からどのオプションボタンにチェックが入っているかを取得する方法です。
もし方法がありましたらご教示頂きますと幸甚です。
一応クラスを使ってのイベントマクロ割付けやループでのチェック状況の取得 方法はわかってますので、一発で取得する方法は無い、ということでしたら イベントマクロ割付などで対応します。今回の質問の趣旨は「一発」で取得す る方法はあるか否か、あるならその方法を教えていただきたい、といことです。
よろしくお願いいたします。
Dim iNum As Long
Private Sub OptionButton1_Click() iNum = 1 End Sub
Private Sub OptionButton2_Click() iNum = 2 End Sub
しかし、このようにだらだらとコードを書きたくないから現状のコントロールを
見る方法にしているのだろうから、いかがなものだろうか?
(???)
こんにちは もし、フレームに入っているなら こんなかんじ? Option Explicit
Private Sub Frame1_Click() Dim OptButton As Object For Each OptButton In Frame1.Controls If OptButton Then MsgBox OptButton.Name Next End Sub (ハモ)
Private Sub CommandButton1_Click()
MsgBox Frame1.ActiveControl.Name End Sub
(Cod)
趣旨からいえば、クラスモジュールを使う方法ですね!! 一発でわかるようなプロパティはありませんねえ!!
クラスモジュールを使って、Optionbuttonのイベントをユーザーフォームに記述する方法 既に分かっておられるようなので 検討してみてください
リストボックスを使う方法もありますね!! オプションボタンのような形状が設定で可能ですよね!! これだったら、Listindexプロパティで一発ですけど・・・。
ichinose
コードでループさせたくなく、しかもクラスで一発取得でもなく、 たとえば、OptionButtons(Value:=True)といった取得ができないか? ということ?
それは、ないねぇ。(自信度 99.8%)
(ぶらっと)
???さん、ハモさん、Codさん、ichinoseさん、ぶらっとさん、ご回答ありがとうございます。
>コードでループさせたくなく、しかもクラスで一発取得でもなく、 >たとえば、OptionButtons(Value:=True)といった取得ができないか? ということ?
まさにそういう感じです。
>ハモさんの回答にヒントをいただいて前提は同じですが、一旦 Frame 外の Textbox 等に >値をセットしてからでも OKのようです。(2007です)
>Private Sub CommandButton1_Click()
> MsgBox Frame1.ActiveControl.Name >End Sub
Codさんのご回答を参考にフレームの中にオプションボタンを配置してみました。 フレームの中にはオプションボタンのみを2つ配置し、1つ目をTrueにし、2つ目 にフォーカスを当てる、という状態でコマンドボタンからオプションボタンの 状態を取得してみました。
すると、Trueになっている方ではなくフォーカスが当っている方を取得しました。
手動でオプションボタンをクリックする場合は、
Trueになっている=フォーカスが当っている
になりますので問題ありません。
おかげさまで解決しました。 ご回答ありがとうございました。
↓が試したコードです。
'手動で配置したコマンドボタンのイベント Private Sub CommandButton1_Click() 'フレーム1のアクティブコントロールのキャプションを取得 MsgBox Me.Controls("Frame" & 1).ActiveControl.Caption End Sub
'ユーザーフォーム起動時にフレーム2つを配置、各フレーム内に 'オプションボタンを2つづつ配置 Private Sub UserForm_Initialize() Dim myco As Control Dim mycoB As Control Dim opwd As Single Dim opht As Single Dim frwd As Single Dim frht As Single Dim xsa As Single Dim ysa As Single frwd = 70 frht = 30 xsa = 5 ysa = 10 opwd = (frwd - xsa) / 2 opht = frht '1つ目のフレーム Set myco = Me.Controls.Add("Forms.Frame.1", , True) With myco .Left = 20 .Top = 50 .Height = frht .Width = frwd End With Set mycoB = myco.Controls.Add("Forms.OptionButton.1", , True) With mycoB .Left = 0 .Top = 0 .Height = opht .Width = opwd .Font.Bold = True .Caption = 1 .TextAlign = fmTextAlignCenter .Font.Size = 12 .BackColor = vbWhite .ForeColor = vbRed End With Set mycoB = Nothing Set mycoB = myco.Controls.Add("Forms.OptionButton.1", , True) With mycoB .Left = opwd + xsa .Top = 0 .Height = opht .Width = opwd .Font.Bold = True .Caption = 2 .TextAlign = fmTextAlignCenter .Font.Size = 12 .BackColor = vbWhite .ForeColor = vbBlue End With Set mycoB = Nothing Set myco = Nothing '2つ目のフレーム Set myco = Me.Controls.Add("Forms.Frame.1", , True) With myco .Left = 20 .Top = 50 + frht + ysa .Height = frht .Width = frwd End With Set mycoB = myco.Controls.Add("Forms.OptionButton.1", , True) With mycoB .Left = 0 .Top = 0 .Height = opht .Width = opwd .Font.Bold = True .Caption = 3 .TextAlign = fmTextAlignCenter .Font.Size = 12 .BackColor = vbWhite .ForeColor = vbRed End With Set mycoB = Nothing Set mycoB = myco.Controls.Add("Forms.OptionButton.1", , True) With mycoB .Left = opwd + xsa .Top = 0 .Height = opht .Width = opwd .Font.Bold = True .Caption = 4 .TextAlign = fmTextAlignCenter .Font.Size = 12 .BackColor = vbWhite .ForeColor = vbBlue End With Set mycoB = Nothing Set myco = Nothing 'オプションボタン1 With Me.Controls("OptionButton" & 1) 'Trueにする .Value = True '.SetFocus End With 'オプションボタン2 With Me.Controls("OptionButton" & 2) '.Value = True 'フォーカスを当てる .SetFocus End With 'オプションボタン3 With Me.Controls("OptionButton" & 3) 'Trueにする .Value = True '.SetFocus End With 'オプションボタン4 With Me.Controls("OptionButton" & 4) '.Value = True 'フォーカスを当てる .SetFocus End With End Sub
(カシスソーダ)
一応Listboxでオプションボタン風の例
新規ブックにて、ユーザーフォームを一つのみ作成してください(UserForm1 コントロールなし)。
Userform1のモジュールに '============================================================================= Option Explicit Private WithEvents lstbx As MSForms.ListBox Private lbl As MSForms.Label Private Sub lstbx_Change() lbl.Caption = lstbx.Value & "が選択されました" End Sub '============================================================================= Private Sub UserForm_Initialize() With Me .Width = 450 .Height = 450 .BackColor = &H8000000F With .Controls.Add("Forms.Frame.1") .Left = 48 .Top = 48 .Width = 366 .Height = 80 .Caption = "好み" .BackColor = &H8000000F Set lstbx = .Controls.Add("Forms.ListBox.1") With lstbx .Left = 12 .Top = 6 .Width = 324 .Height = 70 .BackColor = &H8000000F .SpecialEffect = 0 .ListStyle = 1 .List() = Array("前田敦子", "大島優子", "キンタロウ") .Font.Size = 16 End With
End With Set lbl = .Controls.Add("Forms.Label.1") With lbl .Left = 48 .Top = 252 .Width = 276 .Height = 24 .Font.Size = 16 End With End With end Sub
標準モジュールに
Option Explicit Sub test() UserForm1.Show End Sub
ichinose
ichinoseさん、再度のご教示ありがとうございます。
ListBoxのスタイルを1のfmListStyleOptionにする方法ですね。
これはListBoxの高さを変えないおまじないをしたいとき?に 使ってました。また、選択していることを強調したいときにも わかりやすいので重宝してます。
[[20130212233426]] 『リストボックスの高さを固定するには?』
今回は、オプションボタンを複数行・列配置したいのでリスト ボックスは使いませんでした。
オプションボタンは一つをクリックしたら他のオプションボタン のチェックが外れるのでエクセルの方でどのオプションボタンに チェックが入っているのかという情報を持っているのでは?という のがそもそものきっかけでもあります。
今回の質問で回答者の皆様から頂いたご教示はユーザーフォーム でのマクロ開発の可能性をを大きく広げてくれるものになりました。
ありがとうございました。
(カシスソーダ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.