[[20130301075727]] 『オプションボタンのチェック状況を一発で取得』(カシスソーダ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オプションボタンのチェック状況を一発で取得』(カシスソーダ)

 こんにちは、よろしくお願いいたします。

 ウィンドウズ: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
(ハモ)

ハモさんの回答にヒントをいただいて前提は同じですが、一旦 Frame 外の Textbox 等に
値をセットしてからでも OKのようです。(2007です)

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.