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

解決


ジュオン  2004-08-18 23:37:38  No: 85138

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


Sinya  2004-08-18 23:48:31  No: 85139

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

こんなのはどうでしょう

Private Sub test()

    Dim obj As Object

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

End Sub


ジュオン  2004-08-19 00:00:27  No: 85140

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


nanashi  2004-08-19 00:26:16  No: 85141

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


ジュオン  2004-08-19 00:41:30  No: 85142

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

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


魔界の仮面弁士  2004-08-19 01:53:36  No: 85143

> 最初は 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 19:24:38  No: 85144

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加