[[20150910110926]] 『ユーザーフォームのフレーム内のチェックボックス』(節) ページの最後に飛ぶ

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

 

『ユーザーフォームのフレーム内のチェックボックス』(節)

ユーザーフォームのフレーム内にあるチェックボックスの、選択したチェックボックス全てをセルに書き出すコードを記述したいです。

初めはユーザーフォームにチェックボックスとコマンドボタンを置いて、下記のようなコードを記述していました。

Sub Mcl()

    Dim c As Object, cnt As Long, Ar() As String

    For Each c In Me.Controls
        If c.Name Like "CheckBox*" And c = True Then
            ReDim Preserve Ar(cnt)
            Ar(cnt) = c.Caption
            cnt = cnt + 1
        End If
    Next c
    Cells(15, 5) = Join(Ar, "、")
End Sub

チェックボックスの数が多いのでフレームを使って区切ったのですが、そうするとこのコードでは動きません。どのように書き換えたら良いのでしょうか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >If c.Name Like "Frame1.CheckBox*" And c = True Then

 したことがない処理なので間違ってるかもしれませんが、
 ↓にしたらどうなりますか?

 If c.Name Like "Frame*.CheckBox*" And c = True Then
(カリーニン) 2015/09/10(木) 11:16

>カリーニンさん

因数の数が一致していません。または不正なプロパティを指定しています。
というエラーが出ました。
(節) 2015/09/10(木) 12:01


 まず、コントロールの「名前」は、それが Frame 等のコンテナ上に配置されていようが、ユーザーフォーム上に直置きされていようが
 たとえば "CheckBox1" です。"Frame1.CheckBox1" ではありません。

 オブジェクトとしては、「正式には」Frame1.CheckBox1 ですが。(単に CheckBox1 でも参照できます)

 次に、開発を進めていくうちに、コントロールのオブジェクト名を初期値の CheckBox○ から、任意のわかりやすい名前に
 変更する場合もあるかもしれません。
 なので、確実に チェックボックスだとわかる情報で判断したほうがいいですね。以下、参考コードです。

 ユーザーフォーム上のすべてのチェックボックスなら

    For Each c In Controls
        If TypeName(c) = "CheckBox" Then MsgBox c.Name
    Next

 たとえば Frame1 上のチェックボックスだけなら

    For Each c In Frame1.Controls
        If TypeName(c) = "CheckBox" Then MsgBox c.Name
    Next

 ところで、コンテナ上に膨大な数のコントロールを配置すると、オートメーションエラーを誘発するリスクが
 高くなります。見た目で囲みたいということであれば Frame ではなく、Label を配置して、その上に
 CheckBox をおくほうがいいですよ。

(β) 2015/09/10(木) 12:07


 既に回答がついてますが、そのままアップします。

 と思ったらOptionButtonででゃなくCheckBoxでしたね。
 考え方は同じだと思います。

    Dim c As Object, cnt As Long, Ar() As String
    cnt = -1

    For Each c In Me.Controls
      If TypeName(c) = "OptionButton" Then
         If c.Parent.Name Like "Frame*" Then
            If c.Value = True Then
               cnt = cnt + 1
               ReDim Preserve Ar(cnt)
               Ar(cnt) = c.Caption
            End If
        End If
      End If
    Next c
    MsgBox cnt
    Cells(15, 5) = Join(Ar, "、")
(カリーニン) 2015/09/10(木) 12:10

コメント返信:

[ 一覧(最新更新順) ]


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