プロが教える店舗&オフィスのセキュリティ対策術

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で値を取得できるのですが。

よろしくお願いします。

A 回答 (4件)

新しいアルゴリズムを思いつきました。


コントロール配列って、たしか、同じ名前を共有しますよね。

だから、For Each ・・の中で、Control.Name を参照して、同じ名前が 2>= 出てきたら・・・と言うのは、いかがですか?
    • good
    • 0
この回答へのお礼

Masato_aさん、再度のご回答どうもありがとうございます。
なるほど!全てのオブジェクトの数だけ配列を用意してカウントする方法ですね。For Each文でオブジェクトを取得した場合、コントロール配列は必ずしも連続して取得できないので単純なコントロールブレイクではだめそうですが、全てのオブジェクトに対してカウントすれば確かによさそうですね。早速試してみます。

処理スピードとメンテナンスの方法等から総合的に判断して、こちらの方法をとるか、On Errorでの処理を取るか、一つ一つ場合分けするかを検討します。

どうもご回答ありがとうございました。

お礼日時:2001/08/05 22:07

ANo.#1に


>そうですね。なるべくなら On Error文を使いたくないんですよ。・・・
とありましたので、難しいことは分かりませんが tag にコントロール配列だという印(しるし)をつけたらどうですかね。スマートかどうかは判断しかねますが簡明にはなります。

On Error GoTo 0 ですが、エラー判定するべき箇所が終わったのでエラー処理ルーチンを無効にする意味で書きました。この後、どのような処理を書くかわかりませんので。エラー判定をずっと引きずりたくない意味です。書き方としては個人的な癖かもしれません。現プロシージャは終わってしまうので不要?でしょうか。
    • good
    • 0
この回答へのお礼

nishi6さん、早々のレスポンスありがとうございます。

実は最初tagに目印をつけようかと思ったのですが、既にtagは他の目的に使っていまして、桁を増やしたりしたくはないなと考えておりました。ちょっと修正箇所が多くなりそうなので。

あの・・・、「スマート」とは言葉が悪く、良識を疑われても仕様がない表現でした。謹んでお詫び申し上げます。もちろんMasato_aさんやnishi6さんの方法を悪く言うつもりはありませんでした。どうぞお気を悪くなさらないでください。

On Error GoTo 0 の使い方は存じませんでした。ありがとうございます。

矢張り、Controlで取得した場合、IsArray関数で配列とみなされないのは仕様なんですかね。

再度のご回答どうもありがとうございました。

お礼日時:2001/08/04 23:09

普通に調べてエラーが起きたら何もしないのは?


下記ではコントロール配列だけ<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
    • good
    • 0
この回答へのお礼

nishi6さん、どうもご回答ありがとうございます。

Masato_aさんのお礼にもお答えいたしましたが、On Error文で処理するのは最終手段にしようと思います。

なぜコントロールを使用すると、コントロール配列はIsArray関数で識別できないのでしょうかね?もちろんVarType 関数でもvbArrayは返しませんでした。

それと質問なのですが、
>  Err.Clear: On Error GoTo 0
の後半部分の On Error GoTo 0 とはどのような処理なのでしょうか?
たった今確認しましたところ、うまく動きましたが、GoTo 0の行き先がわかりません。再びご回答を賜りたく存じます。

ご回答どうもありがとうございました。

お礼日時:2001/08/04 22:38

無理やりインデックスを参照して見て、Err.Numberを使って判定するのって、嫌いですか?

    • good
    • 0
この回答へのお礼

Masato_aさん、ご回答どうもありがとうございます。

そうですね。なるべくなら On Error文を使いたくないんですよ。On Errorで飛ばして、そこでErr.Numberで判断するのは、処理的には変わらないのですが、気の持ちようというか、他にスマートな方法がないかなーって思ってしまいます。

フォームにオブジェクトがたくさんあるので、場合分けするのも大変なんですが、どうしようもなくなったら、On Errorか、一つ一つ聞いていくかにすると思います。

ご回答どうもありがとうございました。

お礼日時:2001/08/04 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!