Back Home Next

E1:メニューバーにコマンドボタンを追加する。

アプリケーションに操作を指示するコマンドボタンが集まったメニューバーやツールバーについては皆さんご存知だと思います。それらはCommandBarオブジェクトによって作られています。そしてExcel固有のオブジェクトではなく、Officeファミリー共通です。

入門用のVBA解説本にはあまり触れられていません。しかしHelpにはバッチリ記述してありますが、Visual Basic EditorのHelpを開いてCommandBarを検索してもヒットしません。Helpの目次の中のMicrosoft Excel Visual BasicのHelpをいったん開いてから検索すればヒットします。

プログラム解説本にはHelpは宝の山との記述があり、そのとうりなのですが、そのHelpを使いこなせるようになるまでが大変なのですよ(;_x)ほんと(^^;

CommadBarオブジェクトの構造は

Application-CommandBars-CommandBar-Controls-Control

Applicationは他のアプリ(たとえばAccess)を指定しない限り特に指定する必要はありません。末尾にsが付くものはCommandBarが複数詰まったコンテナです。名前かインデックス番号で個々のCommandBarオブジェクトを指定します。Controlオブジェクトはツールバーの個々のボタンやメニュー、コンボボックスなどです。オブジェクト名はControlですが、一般のコントロールと区別されていて、HelpにはCommandBarControlとして記述されています。

では既存のコマンドバーにコマンドボタンを追加するにはどうするか?追加したいコマンドバーの名前が必要です。Excelのメニューバーの中の表示-ツールバー操作で、ツールバーの名前がでてきますが、コマンドバーを識別するのには使えません。私は仕方がないのでプログラムで調べました。コンテナの中身を調べるいつもの手です。何故かIndexは1から始まります。

For i = 1 to CommandBars.Count
  ActiveCell.Cells(i,1) = CommandBars(i).Name
Next i

私が調べたときは85個のCommandBarがありました。参考までに何時も表示されているものは

一番上に表示されるメニューバーは:Worksheet Menu Bar
その下の標準ツールバーは:Standard

ではメニューバーにコマンドボタンを追加する方法はどうするのでしょうか

コマンドボタンの名前:CMDBAR
ショートカットキー: CTL+C
割り当てるマクロ名は:TestMessage

With Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlButton)
.Style = msoButtonCaption
.Caption = "CMDBAR(&C)"
.OnAction = "TestMessage"
CMDBAR_ControlIndex = .Index
End With

ControlのAddメソッドにはパラメータが4つあって最初のパラメータがTypeでメニューのコントロールの種類を指定します。ボタンの他に、メニュー(PopUpと呼ばれています)、コンボボックス、エディットボックスなどがあります。挿入位置等を指定するパラメータもありますが何も指定しなければ最後尾(右)に追加されます。詳しくはHelpでAddメソッドを探して、その中のコマンドバー関係を調べてください。各コントロールのプロパティについてはCommandBarControlで検索してみてください。

当然追加したものはプログラム終了時には消したいですよね。その為にIndex番号を保管しておく必要があります。上のプログラムではCMDBAR_ControlIndexという変数がそうです。Public変数としてモジュールの中に定義する必要があります。

CommandBars("Worksheet Menu Bar").Controls(CMDBAR_ControlIndex).Delete

で消すことができます。

注意:変数定義は省いています。

E2:自分以外のワークブックEventの使い方

拙作CommandBarではワークブックに書かれたメニューバー、ツールバーの情報でCommandBarオブジェクトをコントロールしています。その為には、アドインから自分以外のワークブックが開いたEventを捕まえて処理をしなければなりません。
たとえば、開いたワークブックにCommadBar用のワークシートがあるかどうか調べて、もしあれば、それにしたがってツールバーを表示したり、そのワークブックが閉じられれば、ツールバーを元に戻すと言ったことです。

このやり方も、ExcelVBAの解説本にはあまり説明されていません。しかし、ExcelVBAもHelpには慎ましく説明されています。”WorkBookActivate イベント”で検索したページを表示すると「Application オブジェクトでイベントを使用する」がありますので、これをクリックすると回答がでてきます。

少し複雑です。ExcelのApplicationオブジェクトはWorkブック、Windows関係のEventはデフォルトでは使えません。ですのでEventを有効にしたクラスを作成し、そのクラスを使ってオブジェクトを作成して初めてEventが使えるようになります。

まずクラスモジュールを作成する必要があります。VBAエディタの挿入メニュー”クラスモジュール”でクラスモジュールを挿入します。そしてこのクラスモジュールにEvent付きのクラスを記述します。クラスモジュールの名前そのものがクラス名になり、別のモジュールでのクラス定義に使います。デフォルトのClass1でも問題はありませんが、識別し易い名前に変更しましょう。この例ではCMDBARClassにしました。

何も記述しないクラスモジュールには下のようにGeneralのコンボボックスにはClassしかありません。



このクラスにEventを有効にしたApplicationを定義します。

Public WithEvents App As Application

この宣言で、GeneralのコンボボックスにAppが組み込まれ、APPで使えるEventがDeclarationに出てきます。



このクラスモジュールに必要なEventを選択して、処理を記述します。たとえば、WorkBookが開いたEventで、そのBookの名前を表示させるには

Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
 MsgBox Wb.Name
End Sub

Wbと言うワークブックオブジェクトが引数になります。Wbを使うことにで、このオブジェクトに含まれるすべてのオブジェクト、プロパティ、メソッドにアクセスが可能になります。

しかし、ここで作成したのはクラスです。クラスはオブジェクトを作り出す型に相当しますので、実体のあるオブジェクトを作って初めて動作するようになります。ここではワークブックスのモジュールの中にWorkBook_OpenのEventで、オブジェクトを作成するように記述します。

Dim CmdBarOBJ As New CMDBARClass

上記の宣言で先程のクラスモジュールのクラス(CMDBARClass)でオブジェクト変数を定義します。

Private Sub Workbook_Open()
 Set CmdBarOBJ.App = Application
End Sub

ApplicatioオブジェクトをCmdBarObjに設定してクラスが実体を与えられ、Eventが有効になり、自分以外のWorkBookのEventを検出して処理が可能になります。


E3:ExcelからAccessのデータベースオブジェクトを使う

まず、ExcelのVBAエディタで参照設定の中の”Miocrosoft Access 8.0 Object Libraly”と"Microsoft DAO 3.51 Object Library"にチェックを入れるのを忘れないようにしましょう。

Excelから既存のAccessデータベースを開いてデータベースオブジェクトを作成する方法は、HowTo AccessのA2に説明してあります。

では新規にオブジェクトを作成してデータベースを作成するにはどうしたら良いか。

既存のデータベースを開くのはOpenDatabaseメソッドですが、新規に作成するのはCreateDatabaseメソッドです。

Dim MyAccess As Object
Dim MyDB As Object
Set MyAccess = CreateObject("Access.application")
Set MyDB = MyAccess.DBEngine.workspaces(0).CreateDatabase(dbPath,dbLangGeneral)

作成するデータベースのファイル名をフルパスのdbPathで指定します。このメソッドには他に2つのパラメータがあり、Help(当然Access)でCreateDatabaseを検索してみてください。

MyAccessを作成するにはCreateObjectの代わりにNewを使う方法もあります。

Set MyAccess = New Access.application

閉じるときは

MyDB.Close
MyAccess.Quit acSaveYes

を忘れないようにしましょう。acSaveYesの変わりにacExitを指定すると保存されずにデータベースは閉じられます。


E4:Excelアドインと参照設定

拙作CommandBarアドインではコマンドバーの中のコントロールオブジェクトを取得する関数をサポートしました。Excelのアドインの標準モジュールに書かれた関数は、アドインとして組み込めばセルの関数としては呼び出すことができます。しかし、アドインの関数を呼びだしてプログラムを作成したい場合はアドインを組み込むだけでは関数を認識してくれません。VBEのHelpのVBAの開発環境Helpに”参照設定”で少し説明されていますが、判りやすいとはいえません。

認識させるにはVBEでその関数を呼び出すプロジェクトに参照先を設定する必要があります。VBEのメニューバーでツール−参照設定でアドインファイルを指定します。参照設定はアドインだけでなく普通のワークブックへも可能です。指定すれば以下のようにVBEのプロジェクトウインドウに参照先が現れ、オブジェクトブラウザでアドインのモジュールが参照できるようになります。参照設定はワークブックごとに行う必要があります。



参照設定されるアドイン(この場合はTadd.xla)のプロジェクト名に注意が必要です。参照設定する場合はプロジェクト名は重複が許されないのでデフォルトのVBAProjectから必ず変更しておく必要があります。モジュール名もユニークに設定しておけば後々便利です。関数名は重複できますがその場合は以下のようにモジュール名をつけて識別します。たとえばTest(a,b)という関数が重複していれば、

ModuleTeat.ModuleTestModule.Test(a、b) もしくは略して ModuleTestModule.Test(a、b)

のように書きます。参照設定は、プログラムでも設定可能です。関係するオブジェクトはReferenceオブジェクトで構造は以下のようになっています。

Application-VBE-VBProjects-VBProject-References-Reference

設定するにはAddFromFileメソッドを使います。AdinFullPathをアドインファイルのフルパス変数とすれば、下の例のようになります。VBProjectsの選択にはActiveProjectを使えば便利です。

Application.VBE.ActiveVBProject.References.AddFromFile AdinFullPath

削除するにはRemoveメソッドを使います。削除するプロジェクト名をModuleTeatとして、Application.VBE.は省けず、引数はReferenceオブジェクトそのものになりますので少々長くなります。

With Application.VBE.ActiveVBProject
.References.Remove .References("ModuleTeat")
End With

Back Home Next


Copy Right 2001- Ken