- ベストアンサー
コントロールが配列かどうかを知るには?
Visual Basic6.0(SP5)で伺いたいことがあります。 フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。 Dim Control As Object For Each Control In Form1.Controls If TypeOf Control Is Text Then End If Next Control このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。 Control.Indexの値を参照しようとしても、コントロール配列でない場合は 「配列ではないオブジェクトです」とエラーになります。 IsArray関数でもFalseになってしまいます。 何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
新しいアルゴリズムを思いつきました。 コントロール配列って、たしか、同じ名前を共有しますよね。 だから、For Each ・・の中で、Control.Name を参照して、同じ名前が 2>= 出てきたら・・・と言うのは、いかがですか?
その他の回答 (3)
- nishi6
- ベストアンサー率67% (869/1280)
ANo.#1に >そうですね。なるべくなら On Error文を使いたくないんですよ。・・・ とありましたので、難しいことは分かりませんが tag にコントロール配列だという印(しるし)をつけたらどうですかね。スマートかどうかは判断しかねますが簡明にはなります。 On Error GoTo 0 ですが、エラー判定するべき箇所が終わったのでエラー処理ルーチンを無効にする意味で書きました。この後、どのような処理を書くかわかりませんので。エラー判定をずっと引きずりたくない意味です。書き方としては個人的な癖かもしれません。現プロシージャは終わってしまうので不要?でしょうか。
お礼
nishi6さん、早々のレスポンスありがとうございます。 実は最初tagに目印をつけようかと思ったのですが、既にtagは他の目的に使っていまして、桁を増やしたりしたくはないなと考えておりました。ちょっと修正箇所が多くなりそうなので。 あの・・・、「スマート」とは言葉が悪く、良識を疑われても仕様がない表現でした。謹んでお詫び申し上げます。もちろんMasato_aさんやnishi6さんの方法を悪く言うつもりはありませんでした。どうぞお気を悪くなさらないでください。 On Error GoTo 0 の使い方は存じませんでした。ありがとうございます。 矢張り、Controlで取得した場合、IsArray関数で配列とみなされないのは仕様なんですかね。 再度のご回答どうもありがとうございました。
- nishi6
- ベストアンサー率67% (869/1280)
普通に調べてエラーが起きたら何もしないのは? 下記ではコントロール配列だけ<Debug.Print myCtrl.Name>に入っています。 <Err.Clear: On Error GoTo 0>とかはこんな使い方でした?年かな?だいぶ忘れてきました。 Private Sub Form_Load() Dim myCtrl As Control Dim CtrlFlg As Boolean On Error GoTo ErrorHandler For Each myCtrl In Form1.Controls CtrlFlg = (myCtrl.Index >= 0) If CtrlFlg = True Then Debug.Print myCtrl.Name End If Next Err.Clear: On Error GoTo 0 Exit Sub ErrorHandler: CtrlFlg = False Resume Next End Sub
お礼
nishi6さん、どうもご回答ありがとうございます。 Masato_aさんのお礼にもお答えいたしましたが、On Error文で処理するのは最終手段にしようと思います。 なぜコントロールを使用すると、コントロール配列はIsArray関数で識別できないのでしょうかね?もちろんVarType 関数でもvbArrayは返しませんでした。 それと質問なのですが、 > Err.Clear: On Error GoTo 0 の後半部分の On Error GoTo 0 とはどのような処理なのでしょうか? たった今確認しましたところ、うまく動きましたが、GoTo 0の行き先がわかりません。再びご回答を賜りたく存じます。 ご回答どうもありがとうございました。
- Masato_a
- ベストアンサー率21% (13/60)
無理やりインデックスを参照して見て、Err.Numberを使って判定するのって、嫌いですか?
お礼
Masato_aさん、ご回答どうもありがとうございます。 そうですね。なるべくなら On Error文を使いたくないんですよ。On Errorで飛ばして、そこでErr.Numberで判断するのは、処理的には変わらないのですが、気の持ちようというか、他にスマートな方法がないかなーって思ってしまいます。 フォームにオブジェクトがたくさんあるので、場合分けするのも大変なんですが、どうしようもなくなったら、On Errorか、一つ一つ聞いていくかにすると思います。 ご回答どうもありがとうございました。
お礼
Masato_aさん、再度のご回答どうもありがとうございます。 なるほど!全てのオブジェクトの数だけ配列を用意してカウントする方法ですね。For Each文でオブジェクトを取得した場合、コントロール配列は必ずしも連続して取得できないので単純なコントロールブレイクではだめそうですが、全てのオブジェクトに対してカウントすれば確かによさそうですね。早速試してみます。 処理スピードとメンテナンスの方法等から総合的に判断して、こちらの方法をとるか、On Errorでの処理を取るか、一つ一つ場合分けするかを検討します。 どうもご回答ありがとうございました。