• 締切済み

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

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 プロパティは、変更できるものとそうでないものがあります。それに、組み込みコマンドバーの場合は、値の取得のみです。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答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

  • ツールバー表示

    ExcelVBAで左端にツールバー表示をしたく、調べて表示する所までは出来ました。 ですが文字が縦向きになっております。 私は、横向きの文字にしたいのですが、方法はあるのでしょうか? 環境はWindowsXP、Excel2003です。 以下、その部分の関係ありそうなソース(一部)。 Private Sub Workbook_Open() Dim objBar As CommandBar Dim objCont As CommandBarControl Dim objBtn As CommandBarButton Set objBar = xlAPP.CommandBars.Add(Name:=g_cnsTITLE, Position:=msoBarLeft) Set objCont = objBar.Controls.Add(Type:=msoControlButton) Set objBtn = objCont objBtn.Caption = "ボタン1"

  • エクセル2007にコマンドバーはないのですか?

    Sub コマンドバー作成() Dim myBar As CommandBar Set myBar = CommandBars.Add(Name:="test") myBar.Visible = True End Sub これをしても何も起きないのですが、2007はコマンドバーがないのでしょうか? 2003の時はコマンドバーが作成されました。

  • 変数の型の色の違い

    Sub test() Dim a As String Dim i As Range End Sub とすると 変数の型のが 「String」と「Range」の色が違いますがなぜでしょう?

  • エクセルVBAでコンパイルエラー

    すみません、どうしても腑に落ちないので質問させてください。 わたしが書いて配布したBOOKのコマンドバーを非表示にするコードなのですが、エクセル2000で、myCB のところでコンパイルエラーになるという連絡がありました。 その方は数台PCをお持ちですべての端末でそうなるとのことです。 しかし、下記コードはこれまで2000でも2003でも2007でも何度も試しており、これまでそのようなことはありませんでした。 Private Sub ALLBARS_Hide()   Dim myCB As CommandBar   For Each myCB In Application.CommandBars     myCB.Enabled = False   Next myCB End Sub どういった原因が考えられるでしょうか? なお、上記コードはAuto_OpenからCallされます。

  • EXCEL VBA でマクロが作動するシートとしないシートがある。

    右クリックのショートカットメニューに作成したマクロを追加しました。その追加マクロを実行しても右クリックのショートカットに追加されないシートがあります。同じbookでもその他のシートでは、右クリックのショートカットメニューに追加されているものもあります。 なぜでしょうか? できないのは、右クリックのショートカットの表示です。目的の動作(下記の場合は、フォントの色を変える)は、どのシートでも作動します。 ちなみにプロシージャーは次のように書いています。PERSONAL.XLSに登録してあります。 宜しくお願いします。 'セルの右クリックショートカットメニューを作成 Sub 色々右クリック() 赤みぎクリック 黒みぎクリック 青みぎクリック End Sub Sub 赤みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "赤" .OnAction = "赤フォント" .BeginGroup = False End With End Sub Sub 赤フォント() Selection.Font.ColorIndex = 3 End Sub Sub 黒みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "黒" .OnAction = "黒フォント" .BeginGroup = False End With End Sub Sub 黒フォント() Selection.Font.ColorIndex = 1 End Sub Sub 青みぎクリック() Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "青" .OnAction = "青フォント" .BeginGroup = False End With End Sub Sub 青フォント() Selection.Font.ColorIndex = 5 End Sub Sub Reset_RightClick() Dim rightBar As CommandBar Application.CommandBars("cell").Reset End Sub

  • Word ツールバーの削除

    下記の様なマクロを組み込みました。 しかしこのマクロ自体不必要になったので削除したのですがツール→ユーザー設定→ツールバーにはツールバー及びボタンが残ってしまいました。 ツール→ユーザー設定→ツールバーで削除をすれば消えますが新たにWordを立ち上げると消えていません。 マクロでCommandBars("Indent").Deleteともしましたが結果は同じでした。 どうすれば消えるのでしょうか?どなたかご教授願います。 Sub auto_open() Dim myBar As CommandBar, myButton As CommandBarButton '新しいMenuBarを追加 Set myBar = CommandBars.Add 'MenuBarに名前を設定 myBar.Visible = True myBar.Name = "Indent" myBar.Position = msoBarTop '新しいボタンを追加 Set myButton = myBar.Controls.Add With myButton .Caption = "[チュックインデント]" .Style = msoButtonCaption End With 'ボタンが押下時実行マクロ設定 myButton.OnAction = "checkIndent" myBar.Visible = True End Sub Sub auto_close()

  • エクセル2003 自作ツールバー(コマンドバー)の選択戻り値取得方法

    ツールバーのショートカットを自作して 入力を楽にしようと考えております。 ツールバーには、直接入力するリストを表示させ そのリストの中から選んで、セルに記入させると 言うマクロを作ろうとしているのですが、 選択された、リストの戻り値を取れないため、 苦戦しております。 戻り値の取得方法とかあるのでしょうか? 宜しくお願いいたします。 コードを以下に記します。 Option Explicit Option Base 1 Dim myCB As CommandBar Dim myCBCtrl As CommandBarButton Dim myData() As String Dim n As Integer, i As Integer ---------------------------------------------------------------- Sub AddCmdBarBtn() Call 配列 On Error Resume Next CommandBars("MyMacro2").Delete Set myCB = Application.CommandBars.Add(Name:="MyMacro2", _ Position:=msoBarPopup, Temporary:=True) For i = 1 To 5 Set myCBCtrl = myCB.Controls.Add(Type:=msoControlButton) With myCBCtrl .Caption = myData(i) .OnAction = "ツールバーマクロ" End With Next i myCB.ShowPopup End Sub ---------------------------------------------------------------- Private Sub ツールバーマクロ() ActiveCell.Value = myCB.Controls.Item.Caption<<<此処を上手く処理できません(泣) End Sub ---------------------------------------------------------------- Private Sub 配列() ReDim myData(5) For n = 1 To 5 myData(n) = "名前" & n Next n End Sub ---------------------------------------------------------------- このマクロを右クリックイベントで使って行きたいと考えている のですが。

  • エクセルVBAの変数利用

    シートのC1セルに入力したブック名をアクティブにするための 変数なのですが、アクティブになりません。 下のようにしていますが、とのようにすればよいでしょうか? Sub test() Dim FileName As Range FileName = ThisWorkbook.Path & "\" & Sheets("sheet1").Range("C1") & ".xls" Workbooks.FileName.Activate End Sub

  • コマンドバーのコントロールって全部で何個あるの?

    全部一覧にして書き出してみたいのですが エラーを無視してる為、最高いくつあるのかわかりません。 Sub tes() Dim myBar As CommandBar Dim myCmd As String Dim blYes As Boolean Dim i As Long myCmd = "test" For Each myBar In CommandBars If myBar.NameLocal = myCmd Then blYes = True '既にmyCmdがあるのなら削除する Application.CommandBars("test").Delete Exit For End If Next Set myBar = CommandBars.Add(Name:="test") On Error Resume Next For i = 1 To 2000 myBar.Controls.Add ID:=i Next i myBar.Visible = True Set myBar = Nothing End Sub

  • VBA コマンドバーを消した後に残る空白部分

    お世話になります。 ExcelVBAで、コマンドバーの類を全て消去した後に残る、 空白部分ができる原因が解りません。 この部分をダブルクリックすると、エラーになって強制終了に なってしまいます。 完全に消してしまいたいのですが、この状況になってしまう、 原因と対策を教えてください。 内容は、『システム』という名のシートにある『ロック』ボタンを 押すと、コマンドバーを全て消去して、Sheet1に切り替わるといった 流れです。 ↓モジュール側 ------------------------------------------------------------- Dim myCB As CommandBar Public Sub onCmdBarAttr() DoEvents With Application For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB .CommandBars("Standard").Visible = True .CommandBars("Formatting").Visible = True .CommandBars("Visual Basic").Visible = True .CommandBars("Worksheet Menu Bar").Enabled = True .CommandBars("CELL").Enabled = True ' タスクバーに表示させる .ShowWindowsInTaskbar = True ' 数式バーを表示 .DisplayFormulaBar = True ' ステータスバーを表示 .DisplayStatusBar = True End With End Sub Public Sub offCmdBarAttr() Dim myCB As CommandBar On Error Resume Next For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB On Error GoTo 0 With Application .CommandBars("Worksheet Menu Bar").Enabled = False .CommandBars("CELL").Enabled = False ' 数式バーを消去 .DisplayFormulaBar = False ' ステータスバーを消去 .DisplayStatusBar = False ' タスクバーに表示させない .ShowWindowsInTaskbar = False End With End Sub ' シートロック Public Sub protectSheet(ByVal stSheetName As String) Application.ScreenUpdating = False ' 一旦シート保護をかけ直す With Worksheets(stSheetName) .Activate .Unprotect .Protect UserInterfaceOnly:=True ' カーソルの移動範囲を設定する .ScrollArea = "$A$1" ' 左上セルを選択 .Range("H16").Select ' 保護されたセルは選択不可にする .EnableSelection = xlNoRestrictions End With Application.ScreenUpdating = True End Sub ' シートロック解除 Public Sub unprotectSheet(ByVal stSheetName As String) ' 一旦シート保護をかけ直す With Worksheets(stSheetName) .Unprotect ' スクロール範囲を解除する .ScrollArea = "" ' 保護されたセルでも選択可能にする .EnableSelection = xlUnlockedCells End With End Sub Public Sub setBookAttribute(ByVal bFlg As Boolean) With Windows(ThisWorkbook.Name) ' タブを設定 .DisplayWorkbookTabs = bFlg ' スクロールバーを設定 .DisplayHorizontalScrollBar = bFlg .DisplayVerticalScrollBar = bFlg ' グリッドを設定 .DisplayGridlines = bFlg ' 行列数表示を設定 .DisplayHeadings = bFlg End With End Sub ↓シート側 ------------------------------------------------------ Private Sub btnProtect_Click() ' アプリケーション全体の処理 Call Module1.offCmdBarAttr ' シート単位の処理 Call Module1.protectSheet("Sheet1") ' ブック単位の処理 Call setBookAttribute(False) Worksheets("Sheet1").Activate End Sub Private Sub btnUnprotect_Click() Call Module1.onCmdBarAttr Call Module1.unprotectSheet("Sheet1") Call setBookAttribute(True) End Sub 以上、よろしくお願いいたします。

専門家に質問してみよう