- 締切済み
ExcelのVBAで、変数の型の種類の調べ方
Asキーワードで、変数の型を調べる方法を教えてください。 CommandBarのCommandBarButtonのStateの状態を変更させようとして次のようなSubを作りました。 Sub testCommandBar() Dim MyCommandBar As CommandBar Dim MyControl As CommandBarButton Set MyCommandBar = Application.CommandBars("test") For Each MyControl In MyCommandBar.Controls MyControl.State = msoButtonMixed MyControl.State = msoButtonDown MyControl.State = msoButtonUp Next End Sub しかし、コントロールにボタンとコンボボックスを配置すると、ローカルウィンドで、型を見てもCommandBarButtonと、CommandBarComboBoxと型が分かれているため、当然上記のままだとエラーになります。で、安易にObject型(最上位)にするのではなくもうひとつ上のCommandBarButtonと、CommandBarComboBox共通の型ってどうやって調べればいいのでしょうか? たとえば、「Sheet1」と「Sheet2」の型の上位といえば「WookSheet」のように??(←これが正しいかも自信がないですが) 自分では、「Sheets」「WookSheet」「SheetXX」はそれぞれ型が違うってのは理解しているつもりです。(XXは数字) よろしくお願いいたします。 ついでに、上記のコードだと、ボタンだけの配置で、ステップインで実行させても、ボタンの状態が変化しません。別の質問でと思ったのですが、あつかましく教えていただければ幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >安易にObject型(最上位)にするのではなくもうひとつ上のCommandBarButtonと、CommandBarComboBox共通の型ってどうやって調べればいいのでしょうか? 「何のために、データ型を入れるのか?」という問題をどうのように考えますか。 それは、基本的には、データ型を指定することで、メモリの損失を防ぐことですね。 では、「何のために、固有データ型を入れるのか?」と聞かれたら、 本来は、単に、インテリセンスを使うためにだけしか存在していない、と私は思うのです。 インテリセンス(プロパティ等を思い出せない人のための補助機能)であって、それ自体の有効性というのは、総称データ型の Object 型、String 型、Long型、Double型・・・と同等です。 固有データ型を指定すれば、プロパティやメソッドのあるなしを、コンパイル時に発見できるわけで、実行時エラーをしないで済みます。そうした利点はあります。 >CommandBarButtonと、CommandBarComboBox共通の型 基本的なオブジェクトの概念の問題で、共通の型は、Object 型しかありません。 >安易にObject型(最上位)にするのではなく 安易?良く分かりません。この場合の For Each MyControl In MyCommandBar.Controls VBAの基本的なことですが、For Each の ループの個別のアイテムは、この場合のMyControl に入るものは、Object型 か Variant 型しかありません。それ以外で、ループしたら、実行時エラーがおきる可能性があります。まさか、On Error Resume Next を付けるのはおかしいですからね。 それに、.State プロパティとは関係ありません。State プロパティで返されるものは、ボタンの状態ですが、 >MyControl.State = msoButtonMixed >MyControl.State = msoButtonDown >MyControl.State = msoButtonUp 3つ並べるのは意味がありませんし、CommandBarButtonのState プロパティは、変更できるものとそうでないものがあります。それに、組み込みコマンドバーの場合は、値の取得のみです。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは Dim MyControl As CommandBarControl ということでしょうか? If MyControl.Type = msoControlButton Then とか 条件分岐した方が良いかも・・・。 .Stateプロパティの指定できないコントロールもありますから。 CommandBarControlで宣言すれば動くようですよ。 申し訳ないけど、 As CommandBarButtonって扱ったことないので 私はわかりません。 CommandBarを編集する間は、 ウォッチウィンドウで、モジュール=(すべてのモジュール)を指定して、 常時、プロパティを監視しながら作業すると 少しはは楽に作業できるかと思います。 思い通りに書ける人なら不要だろうけれど、 デバッグ以前に確認しながら書くことが 私の場合は多いので。 見当違いな答えになってなきゃいいけど(^^;) タイトルにある?の調べ方。 オブジェクトブラウザで「CommandBar」検索するとか CommandBarをドラッグしてF1キーとか、で クラスの階層表にたどり着けるかと。
- fumufumu_2006
- ベストアンサー率66% (163/245)
こんなのではどうでしょうか? Sub testCommandBar() Dim MyCommandBar As CommandBar Dim MyControl As CommandBarControl Set MyCommandBar = Application.CommandBars("test") For Each MyControl In MyCommandBar.Controls Select Case MyControl.Type Case msoControlButton 'buttonのコントロールの処理 MyControl.State = msoButtonMixed '例えば Case msoControlPopup 'popupのコントロールの処理 Case Else 'その他のコントロールの処理 End Select Next End Sub または、 Sub testCommandBar() Dim MyCommandBar As CommandBar Dim MyControl As CommandBarControl Set MyCommandBar = Application.CommandBars("test") For Each MyControl In MyCommandBar.Controls Select Case MyControl.Type Case msoControlButton 'buttonのコントロールの処理 Dim myButton As CommandBarButton Set myButton = MyControl myButton.State = msoButtonMixed '例えば Case msoControlPopup 'popupのコントロールの処理 Dim myPopup As CommandBarPopup Set myPopup = MyControl myPopup.Caption = "popup" '例えば Case Else 'その他のコントロールの処理 End Select Next End Sub 下ならVBEの入力支援が機能します。 >ついでに、上記のコードだと、ボタンだけの配置で、ステップインで実行させても、ボタンの状態が変化しません。 については、同じコントロールに対して >MyControl.State = msoButtonMixed >MyControl.State = msoButtonDown >MyControl.State = msoButtonUp と行っているので、最後のMyControl.State = msoButtonUpだけが有効になっているのではないでしょうか。 たとえば a=1 a=2 a=3 msgbox a としているような気がします。