
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件)
- 最新から表示
- 回答順に表示
No.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 プロパティは、変更できるものとそうでないものがあります。それに、組み込みコマンドバーの場合は、値の取得のみです。
No.2
- 回答日時:
こんにちは
Dim MyControl As CommandBarControl
ということでしょうか?
If MyControl.Type = msoControlButton Then
とか
条件分岐した方が良いかも・・・。
.Stateプロパティの指定できないコントロールもありますから。
CommandBarControlで宣言すれば動くようですよ。
申し訳ないけど、
As CommandBarButtonって扱ったことないので
私はわかりません。
CommandBarを編集する間は、
ウォッチウィンドウで、モジュール=(すべてのモジュール)を指定して、
常時、プロパティを監視しながら作業すると
少しはは楽に作業できるかと思います。
思い通りに書ける人なら不要だろうけれど、
デバッグ以前に確認しながら書くことが
私の場合は多いので。
見当違いな答えになってなきゃいいけど(^^;)
タイトルにある?の調べ方。
オブジェクトブラウザで「CommandBar」検索するとか
CommandBarをドラッグしてF1キーとか、で
クラスの階層表にたどり着けるかと。
No.1
- 回答日時:
こんなのではどうでしょうか?
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
としているような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) リストボックス セルの値を取得する 1 2022/05/21 20:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
すぐにイライラしてしまいます。
-
カメラスクロールするのを動画...
-
ExcelVBAでListViewが使用できない
-
全てのオブジェクトのプロパテ...
-
チェックボックスをオンにした...
-
エクセル・VBA CheckBoxのオブ...
-
visual basic.netでのカウント...
-
tagプロパティについて
-
ExcelvbaでActiveコントロール...
-
無料で使えるグリッドコントロール
-
VBでアニメーションGIFを表示す...
-
TabStripコントロールの上にLab...
-
IPアドレスを取得する
-
コントロール配列と同じような...
-
コントロールのイベントの透過
-
エクセルVBAでオプションボタン...
-
ActiveXコントロールを作成して...
-
chr関数の呼び出しで「プロ...
-
excelのリストボックスで選択し...
-
複数のコマンドボタン(VBAで)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELでactivexコントロールを...
-
エクセル・VBA CheckBoxのオブ...
-
カメラスクロールするのを動画...
-
エクセルVBAでオプションボタン...
-
チェックボックスをオンにした...
-
VBA ユーザーフォームの Keypre...
-
chr関数の呼び出しで「プロ...
-
'ckbl' コントロールは作成され...
-
ExcelVBAでListViewが使用できない
-
全てのオブジェクトのプロパテ...
-
vb.netで画面のコントロールId...
-
間違えて配置してしまったコン...
-
変数をコントロール型で使用す...
-
エクセル コントロールツール...
-
ユーザーフォームで動的(Me.Con...
-
OCXって何ですか?
-
C#で角が丸いテキストボックス
-
Groupboxの配下のコントロール...
-
Labelコントロールの(左右)余...
-
excel vbaでユーザーフォームに...
おすすめ情報