[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームのフレーム内のチェックボックス』(節)
ユーザーフォームのフレーム内にあるチェックボックスの、選択したチェックボックス全てをセルに書き出すコードを記述したいです。
初めはユーザーフォームにチェックボックスとコマンドボタンを置いて、下記のようなコードを記述していました。
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.