- ベストアンサー
変数をコントロール型で使用する方法
変数にコントロール型というものがあるのを見かけたことがあります。 しかしいざ使おうとすると、以下のようなエラーが発生します。 コントロール名を入れようとした場合 ------> 型が一致しません アクティブなコントロールを取得しようとした場合 -----> オブジェクト変数、またはWithブロック変数が設定されていません ネットで使い方を検索しても上手くヒットしないので、大変恐縮なのですが 使い方を教えていただけませんでしょうか? どのような使い方をすればよいかわかりません。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
dim XXX As CommandButton Set XXX = CmdButn1 Form1上にCommandButtonであるCmdButn1が貼り付けられているならそれは可能です。 この例だと使い道が見えないと思うので、使い道を。 Form1上にコントロール配列のCommand(0)を貼り付けます。 Private Cmds(3, 5) As CommandButton Private Sub Form_Load() On Error Resume Next Dim N As Long, M As Long, T As Long For N = 0 To 2 For M = 0 To 4 T = N * 3 + M Load Command(T) Set Cmds(N, M) = Command(T) Cmds(N, M).Left = N * 1500 Cmds(N, M).Top = M * 400 Cmds(N, M).Show Next M Next N End Sub こうすると、仮想2次元配列のコマンドボタンが出来上がります。 (動作確認してないです(汗))。
その他の回答 (2)
- haporun
- ベストアンサー率40% (230/562)
Control型というのは、型が特定できないようなコントロールを関数が受け取りたいとき、たとえば、コントロールは何でもいいがCaptionというプロパティを何かに設定したいようなときに使います。 Sub SetCaption(X As Control) X.Caption = "なにか" End Sub Sub Form_Load() SetCaption Command1 SetCaption Label1 End Sub みたいな。 この場合、Control型でなくても、Object型やVariant型でも構いません。 単にControl型の変数を宣言しても、なんのコントロールかわからないし、どこにも配置されていないので、 オブジェクト変数、またはWithブロック変数が設定されていません というメッセージが出るのです。 ちなみに、関数の引数として渡さない場合は、 Dim X As Control Set X = Label1 などとすると、XがLabel1と同様にふるまうようになります。 XのCaptionを変更すると、Label1のCaptionが変更されるのです。 関数の引数として使う場合も、関数内で一時的に使う場合も、コントロールの型がわかっている場合は、明示的にそのコントロールの型で宣言してください。 Control型、Object型、Variant型は任意のコントロールやオブジェクトの参照を格納できますが、処理速度は非常に遅くなります。 それは、そのオブジェクト内のメソッドやプロパティにアクセスする場合、実行時に、そのオブジェクトの型を文字列を使って調べなければならないからです。 さらに、そのオブジェクトが指定されたメソッドまたはプロパティを持っているか、これもまた文字列を使って調べなければなりません。 明示的な型宣言をした場合、名前の解決はコンパイル時に行われるので、実行時にそれに時間を取られることはありません。 普通にプログラムをしていて、Control型に出会うことは、滅多にありません。
補足
ご丁寧なご説明ありがとうございます。 まことに恐縮ですが、質問させてください。 dim XXX As CommandButton dim YYY As TextBox 等の場合も、Set XXX = CmdButn1 という風になるのでしょうか?
- bin-chan
- ベストアンサー率33% (1403/4213)
具体的には何のコントロールですか? as objectで宣言すればOKなような気がします。
お礼
お返事、ありがとうございました。 わざわざ、サンプルコードもいただきまして とても感謝いたします。 助かりました。ありがとうございました。