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で値を取得できるのですが。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
新しいアルゴリズムを思いつきました。
コントロール配列って、たしか、同じ名前を共有しますよね。
だから、For Each ・・の中で、Control.Name を参照して、同じ名前が 2>= 出てきたら・・・と言うのは、いかがですか?
Masato_aさん、再度のご回答どうもありがとうございます。
なるほど!全てのオブジェクトの数だけ配列を用意してカウントする方法ですね。For Each文でオブジェクトを取得した場合、コントロール配列は必ずしも連続して取得できないので単純なコントロールブレイクではだめそうですが、全てのオブジェクトに対してカウントすれば確かによさそうですね。早速試してみます。
処理スピードとメンテナンスの方法等から総合的に判断して、こちらの方法をとるか、On Errorでの処理を取るか、一つ一つ場合分けするかを検討します。
どうもご回答ありがとうございました。
No.3
- 回答日時:
ANo.#1に
>そうですね。なるべくなら On Error文を使いたくないんですよ。・・・
とありましたので、難しいことは分かりませんが tag にコントロール配列だという印(しるし)をつけたらどうですかね。スマートかどうかは判断しかねますが簡明にはなります。
On Error GoTo 0 ですが、エラー判定するべき箇所が終わったのでエラー処理ルーチンを無効にする意味で書きました。この後、どのような処理を書くかわかりませんので。エラー判定をずっと引きずりたくない意味です。書き方としては個人的な癖かもしれません。現プロシージャは終わってしまうので不要?でしょうか。
nishi6さん、早々のレスポンスありがとうございます。
実は最初tagに目印をつけようかと思ったのですが、既にtagは他の目的に使っていまして、桁を増やしたりしたくはないなと考えておりました。ちょっと修正箇所が多くなりそうなので。
あの・・・、「スマート」とは言葉が悪く、良識を疑われても仕様がない表現でした。謹んでお詫び申し上げます。もちろんMasato_aさんやnishi6さんの方法を悪く言うつもりはありませんでした。どうぞお気を悪くなさらないでください。
On Error GoTo 0 の使い方は存じませんでした。ありがとうございます。
矢張り、Controlで取得した場合、IsArray関数で配列とみなされないのは仕様なんですかね。
再度のご回答どうもありがとうございました。
No.2
- 回答日時:
普通に調べてエラーが起きたら何もしないのは?
下記ではコントロール配列だけ<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の行き先がわかりません。再びご回答を賜りたく存じます。
ご回答どうもありがとうございました。
No.1
- 回答日時:
無理やりインデックスを参照して見て、Err.Numberを使って判定するのって、嫌いですか?
Masato_aさん、ご回答どうもありがとうございます。
そうですね。なるべくなら On Error文を使いたくないんですよ。On Errorで飛ばして、そこでErr.Numberで判断するのは、処理的には変わらないのですが、気の持ちようというか、他にスマートな方法がないかなーって思ってしまいます。
フォームにオブジェクトがたくさんあるので、場合分けするのも大変なんですが、どうしようもなくなったら、On Errorか、一つ一つ聞いていくかにすると思います。
ご回答どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- 英語 The P2s and P4s of bilateral mandible were extract 1 2022/12/11 18:09
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- Visual Basic(VBA) 配列にしたセル範囲でのコメントがあるかどうかを取得するコードの書き方 2 2022/09/17 05:09
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
変数を動的に作るには?
-
遅延バインディングを使用でき...
-
EXCEL VBA で、0から?1から?
-
C言語 重複しない4ケタの乱数...
-
動的配列が存在(要素が有る)か...
-
javaプログラムについて
-
VBで作った乱数を一度も重複さ...
-
ジャグ配列とは
-
配列にある重複要素を削除した...
-
ログデータを表示するグラフに...
-
VB.net 引数で配列変数を渡す際...
-
VBでbyte配列型のインスタンス...
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
空き番号探し
-
VBA 配列数式的に一括してR...
-
五目並べのプログラムを配列と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
動的配列が存在(要素が有る)か...
-
VB.net 引数で配列変数を渡す際...
-
遅延バインディングを使用でき...
-
VBで作った乱数を一度も重複さ...
-
複数のテキストボックスに同じ...
-
配列の要素数を超えた参照のコ...
-
C言語 重複しない4ケタの乱数...
-
For文と配列
-
C#の質問
-
VBでbyte配列型のインスタンス...
-
Excel VBAで配列の途中から(X)M...
-
マップチップの当たり判定の出し方
-
ジャグ配列とは
-
五目並べのプログラムを配列と...
-
10進数を4桁のバイト配列に格納...
おすすめ情報