For Eachのチェック範囲について

解決


ジュオン  2004-08-18 14:37:38  No: 85138  IP: [192.*.*.*]

今私が作成しているプログラムで、
「PictureBoxに貼り付けてあるコントロールのみを
  For Each...Next文で探して処理する」
というような事をしています。それで、
For Each オブジェクト名 In Me
   ・・・・・
Next
というようにしているんですが、これだとPictureBox以外のものも
処理していて対処法を探して居ます。
Inの後をPictureBoxにするとエラーになりお手上げ状態です。
どなたかよい方法がありましたら、教えてください。

編集 削除
Sinya  2004-08-18 14:48:31  No: 85139  IP: [192.*.*.*]

はずしてましたらごめんなさい。

こんなのはどうでしょう

Private Sub test()

    Dim obj As Object

    For Each obj In Me
        Debug.Print TypeName(obj)  '<---- PictureBoxの時のみ処理
    Next

End Sub

編集 削除
ジュオン  2004-08-18 15:00:27  No: 85140  IP: [192.*.*.*]

すいません。説明が下手なもので誤解を与えたかもしれません。
対象はPictureBoxではなくて、PictureBoxに張り付けられている
コントロール、つまりContainer=PictureBoxになっているコントロールです。
最初は If オブジェクト.Container = PictureBox Then ・・・・
という条件式を書き加えたのですが、
そこでエラーが発生して、実行できませんでした。

編集 削除
nanashi  2004-08-18 15:26:16  No: 85141  IP: [192.*.*.*]

そのコンテナをTypeNameで見るのはダメなんでしょうか?

編集 削除
ジュオン  2004-08-18 15:41:30  No: 85142  IP: [192.*.*.*]

なるほど、TypeNameで見るということが出来たのですか。
この方法で解決できそうです。ありがとうございます。

ところでスレ違いなのかもしれませんが、質問があります。
For Eachでループしている時、If Obj.Index = XXX Then で調べると
コントロール配列でないものはその時点でエラーになります。
もしコントロール配列かどうか調べる方法があれば、
エラーが無くなるのですが、もしよろしければ教えてください。

編集 削除
魔界の仮面弁士  2004-08-18 16:53:36  No: 85143  IP: [192.*.*.*]

> 最初は 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かと。

編集 削除
ジュオン  2004-08-19 10:24:38  No: 85144  IP: [192.*.*.*]

ありがとうございます。
とても勉強になりました。おかげさまで問題解決できそうです。
今後、また質問する機会がありましたらお願いします。

編集 削除