[[20201009110958]] 『VBAでラジオボタンの空白がないかチェックする方磨x(towato) ページの最後に飛ぶ

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

 

『VBAでラジオボタンの空白がないかチェックする方法 』(towato)

4つのラジオボタンを1グループとして処理しています。
全部チェックされていたら、実行用のマクロへ。(まだ未作成)
1つのグループでも空白があったら、エラーメッセージの表示
【空白があります】と表示をさせたいのです。

まずはエラーのマクロを作成したいため調べ
https://www.239-programing.com/excel-vba/ufm/ufm028.html
上記のサイトが参考になるのかなと思ったのですが、
グループわけのエラーが分からず躓いてしまったため相談させて頂きました。

Private Sub UserForm_Initialize()
'グループわけ 

   OptionButton1.GroupName = "Agroup"
   OptionButton2.GroupName = "Agroup"
   OptionButton3.GroupName = "Agroup"
   OptionButton4.GroupName = "Agroup"

   OptionButton5.GroupName = "Bgroup"
   OptionButton6.GroupName = "Bgroup"
   OptionButton7.GroupName = "Bgroup"
   OptionButton8.GroupName = "Bgroup"

   OptionButton9.GroupName = "Cgroup"
   OptionButton10.GroupName = "Cgroup"
   OptionButton11.GroupName = "Cgroup"
   OptionButton12.GroupName = "Cgroup"

   OptionButton13.GroupName = "Dgroup"
   OptionButton14.GroupName = "Dgroup"
   OptionButton15.GroupName = "Dgroup"
   OptionButton16.GroupName = "Dgroup"

End sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 >グループわけのエラーが分からず
グループわけのエラーとは?
(はまちゃん) 2020/10/09(金) 11:58

 こんな感じに組めば良いんじゃないですか?
 ベタだけど。

 Dim flg As Boolean

 Agroup = Array("OptionButton1", "OptionButton2")
 Bgroup = Array("OptionButton3", "OptionButton4")

 For Each oo In Agroup
    If Me.Controls(oo) = False Then
       cnt = cnt + 1
    End If
 Next
 If cnt = UBound(Agroup) + 1 Then
   ans = ans & "Agroup "
   flg = True
 End If

 cnt = 0
 For Each oo In Bgroup
    If Me.Controls(oo) = False Then
       cnt = cnt + 1
    End If
 Next
 If cnt = UBound(Bgroup) + 1 Then
   ans = ans & "Bgroup "
   flg = True
 End If

 If flg = True Then
   MsgBox ans & "無選択"
 End If

 変数の宣言は、追加してください。

(Why) 2020/10/09(金) 12:00


 UserFormでOptionButtonを使うときは、Frameと組み合わせるといいですよ。

 ・Frameの中にいれた OptionButtonは、GroupNameプロパティをつけなくても連動します。
 ・Frameの中のコントロールコレクションでループできる。
 ・Frameでグループ化した Optionボタンを視覚化できる。
 ・Frameの枠がうるさかったら、SpecialEffectプロパティで枠を見せなくすることもできる。

    Private Sub CommandButton1_Click()
        MsgBox isCheckedGroupA
    End Sub

    Function isCheckedGroupA()
        Dim c As Control
        For Each c In Me.Frame1.Controls
            If c.Value Then isCheckedGroupA = True: Exit Function
        Next
        isCheckedGroupA = False
    End Function
(´・ω・`) 2020/10/09(金) 12:55

>>はまちゃんさま
エラーという言葉が分かりづらくて申し訳ないです。
個々の選択したときの選択されていない時のメッセージの出し方はわかったのですが、
複数分けた際、Agroup選択されているか、Bgroup選択されてない、Cgroup選択されていた時に
選択漏れがあるよ、というメッセージを出したかったのです。。。

>>Why様
ありがとうございます。コード参考にさせて頂きます。

>>(´・ω・`)
詳しく教えて頂き助かりました。早速Frameとあわせて実行してみました。
私の予想通りの動きでとてもうれしいのですが、1つ質問があります。

次の処理へ進むマクロを差し込みたいとおもったのですが(暫定としてRange("A1").Select)
Trueの時にTrueの表示しないようにしたいのですが可能でしょうか?

(towato) 2020/10/09(金) 16:25


 質問の意味が汲み取れません
 >Trueの表示しない
 どこに表示しているのですか?
(´・ω・`) 2020/10/09(金) 17:00

Functionプロシージャに返り値をもうけて、
その返り値で条件分岐してはいかがでしょうか。

Private Sub CommandButton1_Click()

    Dim frmName As Frame

    If chkOpButton(Me, frmName) = False Then
        MsgBox frmName.Caption & "選択漏れあり"
        Exit Sub    '処理を抜ける
    End If

    '次の処理

End Sub

Function chkOpButton(ByRef myForm As UserForm, ByRef myFrame As Frame) As Boolean

    Dim c As Control
    Dim c2 As Control

    For Each c In myForm.Controls
        If TypeName(c) = "Frame" Then
            For Each c2 In c.Controls
                If TypeName(c2) = "OptionButton" Then
                    If c2.Value = True Then Exit For
                End If
            Next
            If c2 Is Nothing Then Exit For
        End If
    Next

    If c Is Nothing Then
        chkOpButton = True
    Else
        Set myFrame = c
    End If
End Function
(まっつわん) 2020/10/11(日) 20:40

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.