• ベストアンサー

フォームとコントロールツールボックスの違い

コマンドボタンでVBAのプログラムを実行させたいんですがフォームとコントロールツールボックスにあるコマンドボタンの違いがよくわかりません???? どうやって使い分ければいいんでしょーか???

  • megxp
  • お礼率37% (10/27)

質問者が選んだベストアンサー

  • ベストアンサー
noname#102878
noname#102878
回答No.5

#4です。 不具合の件ですが、Excel97ではシートに貼り付けたActiveXコマンドボタンを押した瞬間にアクティブセルを見失ってしまうんです。 Private Sub CommandButton1_Click() Dim r As Long r = Range("A1").CurrentRegion.Rows.Count End Sub これ、エラーになっちゃいます。 いやーこれにははまりました。 ボタンを押した瞬間にフォーカスがボタンに移ってしまい、アクティブセルがない状態、すなわち「どのセルも選択されていない状態」になってしまう。 なので、 Private Sub CommandButton1_Click() Dim r As Long ActiveCell.Activate r = Range("A1").CurrentRegion.Rows.Count End Sub なんていうヘンなコードを書く必要があります。 Excel2000からは解消された不具合みたいですけどね。 まぁ最近は目立った不具合にぶち当たっていませんが、Public Subプロシージャを実行するだけなら、それこそオートシェイプでも良いわけで、フォームのコマンドボタンは使いますが、ActiveXコマンドボタンは使っていません。 ツールバーの件。自動的に開業された部分は直してください。ThisWorkbookのコードモジュールに記述します。 Private Sub Workbook_Open() Dim myCmdBar As CommandBar Dim myCtrl As CommandBarButton ' ツールバーを作成 Set myCmdBar = Application.CommandBars.Add(Name:="Hoge", Temporary:=True) With myCmdBar .Visible = True .Position = msoBarTop End With ' 読み込みボタン Set myCtrl = myCmdBar.Controls.Add(Type:=msoControlButton) With myCtrl .Caption = "読み込み" .Style = msoButtonCaption .OnAction = "ReadDataFile" End With ' 仕訳ボタン Set myCtrl = myCmdBar.Controls.Add(Type:=msoControlButton) With myCtrl .Caption = "データ仕訳" .Style = msoButtonCaption .OnAction = "JournalizeData" End With Set myCtrl = Nothing Set myCmdBar = Nothing End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) ' マクロブック終了時にツールバーを削除する On Error Resume Next Application.CommandBars("Hoge").Delete End Sub Private Sub Workbook_Activate() ' マクロブックがアクティブならツールバーは有効 On Error Resume Next Application.CommandBars("Hoge").Enabled = True End Sub Private Sub Workbook_Deactivate() ' 他のブックがアクティブならツールバーは無効 On Error Resume Next Application.CommandBars("Hoge").Enabled = False End Sub このブックが開かれると同時に独自のツールバーを作成し、コマンドボタンを2つ作成します。 ボタンのOnActionプロパティにはクリック時に実行させたいPublic Subプロシージャの名前を記入します。 Excel上で手作業でツールバーを作成するとそのツールバーは次回Excel起動時にも残っていますが、 Temporary:=True とすることでツールバーがExcelに記録されず、Excel終了時に自動的に削除されます。 まぁこの例ではブック終了時に明示的にツールバーを削除していますが、これは同時に別の目的で別のブックを開いていた場合の対処です。マクロのブックを閉じてもツールバーだけ残ってしまうのを防ぐためです。 それと、マクロのブックがアクティブになった時と他のブックがアクティブになった時にツールバーの有効・無効をコントロールしています。

megxp
質問者

お礼

うぉぉぉぉぉぉぉーーーーーっ!!! 私は今、言葉では言い尽くせないほど感激しています!! たいへんすばらしいぃ!!! どーーもありがとうございますっ!!! うぉぉぉぉぉぉぉーーーーーっ!!! 感動です!!感激です!!感謝です!!

その他の回答 (4)

noname#102878
noname#102878
回答No.4

フォームのコントロールは旧来のコントロールです。 ツールボックスのコントロールはActiveXコントロールです。 フォームのコントロールにはコードを記述できません。 ですのでイベント処理を記述することができません。 多少のプロパティしかありません。 マクロ(Public Subプロシージャ)を呼び出すことぐらいしかできません。(一部のコントロールは自身が持つ機能の範囲で特殊な動作をしますが) ツールボックスのコントロールはイベント処理を記述できます。 イベント処理を記述できるということはイベント内で完結する処理を記述することもできますし、「Public Sub」を呼び出す以外にも、Public Functionや、同じモジュール内のSubやFunction、他のユーザーフォームなどを呼ぶこともできます。 各種プロパティを設定できます。 私の使い分けですが、シート上に必要なコントロールの種類とその機能によって全体をセットで使い分けています。 単にPublic Subを呼び出すだけならフォームのコントロールを置いて「マクロの登録」でPublic Subを指定します。 応用として、ExcelのShapeオブジェクト(オートシェイプ)もマクロの登録ができますから、ボタンのように「押したよ」という視覚的な効果が必要じゃない場合はオートシェイプで華やかにすることもできます。 コンボボックスの内容を動的に変える必要があれば、その他のコントロールもActiveXコントロールを使用します。 ただし私の場合はシート上にActiveXコントロールを置くのは不具合の原因になったりすることもあり、あまり好きではありません。 最近はなるべくBook起動時にToolBarをテンポラリで作成し、そこに必要なコントロールを配置するようにしています。

megxp
質問者

補足

ご回答ありがとうございますっ!!! シート上にActiveXコントロールを置くとどんな不具合になるんですか? ということはなるべくフォームのボタンを使ったほうがよいのでしょーか?? ????? ToolBarをテンポラリで作成しコントロールを配置するのはどのようにすればよいのでしょーか?? ?????? よろしくおねがいしますうっ!!

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

私も貴殿の質問に近いことをずっと疑問に思っていました。聞く人もなく、説明した本にも出会わず、今日もTextBoxXのXの相対化の質問が載り、色々やっていて頭から離れません。 実はVBAなどの本の最初の辺りに、オブジェクトの体系図( 四角で囲んだオブジェクトから四角で囲んだサブオブジェクト がぶら下っている図)が載っています。ほとんど詳しく述べられず、初心者には載っているだけのようですが、意外に重要なことを物語っているのではないかと思っています。コントロールも2箇所以上にぶら下っているところがあると思います。 エクセルのシステムプログラムに、コントロールを定義するプログラム(=オブジェクト。オブジェクトとプロパティとメソッドのセット)が2つ以上あって、少しそれらの間で差があるのだと思います。どちらを呼び出すのかは、どのツールバーをクリックして呼び出すかの操作と直結していると思いますが、どれがどれを呼ぶのか説明した 本をみたことはありません。 またExcel5.0->Excel95->Excel97 ->Excel2000->Excel2002と改訂されていますが、その都度一部ですが、オブジェクトの体系図の構成が変更になったり、追加は勿論、移し変えもあるようです。 すなわちエクセルのシステムプログラムが構成を変えているのでしょう。 従来のアプリ・プログラムはそのまま動くようにマイクロソフトは考えるので、従来分も残されていることが多いでしょう。それで複雑になっているのだと思います。 最後に私は、確信は持てませんが (1)ActiveXコントロール(WEBがらみ) (2)OLEコントロール (3)Shapes の3つがあるのではと思っています。どなたか批判して教えて下されば幸いです。 またコントロールを貼りつける(埋め込む)ことが出来る「台紙」に当たるものは、WorksheetsやChartsやFormsなどがあり、「コンテナ」と言うのではないかと思います。そしてラベルの中にはボタンを貼りつけられませんが、その点ではフォームなどは特別なオブジェクトなわけです。 Excel5.0にはModuleというWorkSheet と同列のものがあり、Dialog1などにコントロールを載せていました。それは95でVBE画面が出来るとSheetとFormに移行したようです。 下記はすべて動きます。同じSheet1上のTextBox1に対してです。なぜこんなに違うのか判りません。 Sub text04() Dim sh As Worksheet Set sh = Worksheets("sheet1") MsgBox Worksheets("sheet1").TextBox1.Name MsgBox sh.TextBox1.Name End Sub Sub test05() MsgBox Worksheets("sheet1").Shapes("TextBox1").Name End Sub Sub test06() MsgBox Worksheets("sheet1").OLEObjects("textbox1").Name MsgBox Worksheets("sheet1").OLEObjects("textbox1").Top End Sub Sub text03() For i = 1 To 2 tb = "TextBox" & i MsgBox Worksheets("sheet1").DrawingObjects(tb).Left MsgBox Worksheets("sheet1").DrawingObjects(tb).Name MsgBox Worksheets("sheet1").DrawingObjects(tb).Index Next i End Sub ●ある本の記述を今偶然見つけました。「フォームツールバーの部品はExcel95以前のバージョンで作成したワークシートとの互換を保つために用意されたもので、通常は使用しません。」X-Media社SuperMaster。Excel2000/2002VBA。P13。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

下にも書いてありますが、  1.コードの記述場所  2.イベントへの対応  3.シート以外の貼り付け先  4.プロパティやメソッド が違いでしょうか。 個人的にはほとんどコントロールツールボックスのコントロールしか使いません。 状況によって、フォームツールバーのボタンなどを使います。(理由としては、コードが簡単に書けることがあります) 次に詳しく説明されています。 VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(1) http://www.moug.net/cgi-bin/technic.cgi?exvba+TI15010071 VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(2) http://www.moug.net/cgi-bin/technic.cgi?exvba+TI15010072

回答No.1

素人考えで申し訳ありませんが、 (1)フォームの場合はエクセルに依存したものだと思います。昔Excel95などVBAがなかったころはエクセル上で動作していたからです。 (2)コントロールツールボックスの場合はVBAに依存したものだと思います。VBAなのでいろんな設定ができる点が魅力だと思います。 複雑な処理をさせたいときはコントロールツールボックスより使用した方がいいと思います。 後はプロの方にお任せします。

関連するQ&A

  • エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタン

    エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタンについて教えてください。 実はこれまでフォームしか使ったことがないのですが、フォームのボタンですと、下記のように一つのプロシージャを多数のボタンから呼び出し、呼び出したボタンにより異なった指示が出来ます。 Sub test() x = Application.Caller Select Case x Case "ボタン 1" MsgBox 1 Case "ボタン 2" MsgBox 2 Case "ボタン 3" MsgBox 3 Case "ボタン 4" MsgBox 4 End Select End Sub コントロールツールボックスは Private Sub CommandButton1_Click() MsgBox 1 End Sub Private Sub CommandButton2_Click() MsgBox 2 End Sub のようにコマンドボタンごとにひとつずつ書くしかないのでしょうか?

  • コントロールツールボックス

     コントロールツールボックスをWordで使用可能にし、コマンドボタンを挿入したいのですが、挿入時にボタンをクリックすると、自動的に文書上にボタンができてしまいます。また、コードを入れて、動かそうと思ってクリックすると、動作せず、コードの中身、モジュールが表示されるだけです。どこを直せば良いのでしょうか(Excelでの「ツール」→「ユーザー設定」でコマンドタブから「フォーム」を選んだ時にできるようなボタンはWordにはないのでしょうか)?

  • エクセル コントロールツールボックスが使えない

    エクセル2007を使っています。 VBAで書いたコマンドをシートに貼り付けたボタンで実行させたいのですがVBのツールバーを開くと「コントロールボックス」の部分がグレーアウトしていて使えません。 有効にする方法をご存知の方教えてください。

  • ツールボックスとフォームの違いexcel

    メニューバー上で右クリックするとダイアログの一覧が出ると思いますが、その中に「フォーム」と「コントロールツールボックス」とあると思いますが、違いはなんなのでしょうか? 似たものがあると思うのですが。。

  • ワードの「コントロールツールボックス」とは、どんな作業をするところ?

     ワードのツールメニューのなかに、「標準」や「書式設定」などと並んで、「コントロールツールボックス」というのがありますが、これはどんな作業をするところですか?  いろんなコマンドボタンがあって、おもしろそうですが・・・

  • エクセル、コンボボックス/フォームのとコントロールツールボックスの

    エクセル2000です。 今まではワークシートにフォームのコンボボックスを貼って使ってきました。 でも色を変えたり出来ないので、今度はコントロールツールボックスからコンボボックスを貼ってみました。 質問ですが、コンボボックスに表示させるリストを設定するのに、これまでのフォームのコンボボックスだと書式設定で入力範囲をカーソルをあてて一度に簡単に指定できたのですが、コントロールツールボックスのコンボボックスだとそれが出来ません。VBEditorのプロパティのところのListFillRangeの右側にいちいち手でSheet1!A1:A5のように打ち込まなければならないようです。これではけっこう手間がかかってしまいます。 わたしのやりかたが間違っているのでしょうか?

  • PowerPoint VBAコマンドボタンでのマクロ

    PowerPointでVBAを使ったフォームを作製しました。 そのフォームを表示させるためマクロを書き、スライド上に コマンドボタンを配置させマクロを実行させたいと思っています。 ExcelのVBAですとコマンドボタンにマクロを割り当てるのは ツールバーのフォームのコマンドボタンで設置すると簡単ですが PowerPoint VBAですとコントロールツールボックスでのコマンド ボタンしかなくボタンにマクロを割り当てる方法が分かりません。 どなたかコマンドボタンにマクロを割り当てて実行する方法を 教えて下さい。 宜しくお願い致します。

  • vbaで、フォームコントロールを挿入する方法

    vbaで、フォームコントロールを挿入する方法 エクセル2007を使っています。 最近、vbaを始めたのですがわからない事があります。 開発→挿入→挿入→フォームコントロールで、 オプションボタンやチェックボックスを、 vbaで挿入したいのですが可能でしょうか? 例えば、フォームコントロールのボタンを押しただけで オプションボタンを6つ挿入するなどです。 ActiveXコントロールでは、可能とどこかのサイトで見たのですが、 どうしてもフォームコントロールの方を使いたいの…。 よろしくお願いします。

  • もしフォームヘッダーにコントロールがあるのなら

    アクセスのフォームの、フォームヘッダーに検索用テキストボックスとコンボボックスがあり、 詳細エリアにレコードソース(コントロールソース)に紐付いたテキストボックスが複数あります。 フォームヘッダーのフィルタを解除するコマンドを実行して、 フォームヘッダーのテキストボックスとコンボボックスをnullにしたいのですが、 vbaで「もしフォームヘッダーなら」ってするにはどうすればいいでしょうか? フォームヘッダーのコントロール名も詳細エリアのコントロール名も 区別のないコントロール名でなのでコントロール名で条件分岐をすることは不可能です。 Private Sub フィルタを解除コマンド_Click() Dim ctl As Control For Each ctl In Me.Controls If (ctl.ControlType = acTextBox) Or (ctl.ControlType = acComboBox) Then 'ここで、もしフォームヘッダーにコントロールがあるのならってしたい Me.Controls(ctl.Name) = Null End If Next ctl Me.Form.FilterOn = False End Sub このコードに付け加えてくれませんか? Debug.Print ctl.Name でコントロール名を取得するとフォームヘッダーも詳細もどちらのコントロール名も取得されてしまいます。 On Error Resume Next 以外でお願いします。

  • Excelのコントロールツールボックスでデータの入力フォームを作成しま

    Excelのコントロールツールボックスでデータの入力フォームを作成しました。内、何項目かはテキストボックスになっているのですが、これを特定の順番でTabキーかEnterキーで移動させたいのですができません。方法をご存知の方がいらっしゃれば教えてください。 VBAエディタからのフォーム作成ではプロパティでできていたのでExcel全般の仕様だと思っていたのですが・・・。

専門家に質問してみよう