今私が作成しているプログラムで、
「PictureBoxに貼り付けてあるコントロールのみを
For Each...Next文で探して処理する」
というような事をしています。それで、
For Each オブジェクト名 In Me
・・・・・
Next
というようにしているんですが、これだとPictureBox以外のものも
処理していて対処法を探して居ます。
Inの後をPictureBoxにするとエラーになりお手上げ状態です。
どなたかよい方法がありましたら、教えてください。
はずしてましたらごめんなさい。
こんなのはどうでしょう
Private Sub test()
Dim obj As Object
For Each obj In Me
Debug.Print TypeName(obj) '<---- PictureBoxの時のみ処理
Next
End Sub
すいません。説明が下手なもので誤解を与えたかもしれません。
対象はPictureBoxではなくて、PictureBoxに張り付けられている
コントロール、つまりContainer=PictureBoxになっているコントロールです。
最初は If オブジェクト.Container = PictureBox Then ・・・・
という条件式を書き加えたのですが、
そこでエラーが発生して、実行できませんでした。
そのコンテナをTypeNameで見るのはダメなんでしょうか?
編集 削除なるほど、TypeNameで見るということが出来たのですか。
この方法で解決できそうです。ありがとうございます。
ところでスレ違いなのかもしれませんが、質問があります。
For Eachでループしている時、If Obj.Index = XXX Then で調べると
コントロール配列でないものはその時点でエラーになります。
もしコントロール配列かどうか調べる方法があれば、
エラーが無くなるのですが、もしよろしければ教えてください。
> 最初は If オブジェクト.Container = PictureBox Then ・・・・
こういう時は、
If .Container = PictureBox Then
ではなく、
'PictureBoxに貼り付けられている物を探す
If TypeOf .Container Is PictureBox Then
または、
'Picture1に貼り付けられている物を探す
If .Container Is Picture1 Then
です。
> もしコントロール配列かどうか調べる方法があれば、
Dim Ctrl As VB.Control
For Each Ctrl In Me
If TypeName(Me(Ctrl.Name)) = "Object" Then
Debug.Print Ctrl.Name; "(" & CStr(Ctrl.Index) & ")は";
Debug.Print TypeName(Ctrl); "のコントロール配列です。"
Else
Debug.Print Ctrl.Name; "は";
Debug.Print TypeName(Ctrl); "コントロールです。"
End If
Next
なお、
TypeName(Me(Ctrl.Name))
の替わりに、
TypeName(Ctrl.Parent(Ctrl.Name))
という感じでもOKかと。
ありがとうございます。
とても勉強になりました。おかげさまで問題解決できそうです。
今後、また質問する機会がありましたらお願いします。