重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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は数字)
よろしくお願いいたします。
ついでに、上記のコードだと、ボタンだけの配置で、ステップインで実行させても、ボタンの状態が変化しません。別の質問でと思ったのですが、あつかましく教えていただければ幸いです。

A 回答 (3件)

こんにちは。



>安易に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 プロパティは、変更できるものとそうでないものがあります。それに、組み込みコマンドバーの場合は、値の取得のみです。
    • good
    • 0

 


こんにちは

Dim MyControl As CommandBarControl

ということでしょうか?

If MyControl.Type = msoControlButton Then
とか
条件分岐した方が良いかも・・・。
.Stateプロパティの指定できないコントロールもありますから。


CommandBarControlで宣言すれば動くようですよ。
申し訳ないけど、
As CommandBarButtonって扱ったことないので
私はわかりません。


CommandBarを編集する間は、
ウォッチウィンドウで、モジュール=(すべてのモジュール)を指定して、
常時、プロパティを監視しながら作業すると
少しはは楽に作業できるかと思います。

思い通りに書ける人なら不要だろうけれど、
デバッグ以前に確認しながら書くことが
私の場合は多いので。

見当違いな答えになってなきゃいいけど(^^;)

タイトルにある?の調べ方。
オブジェクトブラウザで「CommandBar」検索するとか
CommandBarをドラッグしてF1キーとか、で
クラスの階層表にたどり着けるかと。
    • good
    • 0

こんなのではどうでしょうか?



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
としているような気がします。
    • good
    • 0

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