ソリューションにシェイプ、ステンシル、テンプレートを組み込んだだけでは、ユーザーのニーズに対応できない場合もあります。たとえば、毎日変わるデータに基づいた図面を作成する場合や、同じシェイプの開発を何度も行う場合などが考えられます。Visio® を詳しく知らなくても図面を作成したいというユーザーもいれば、作成した図面をデータのソースとして他の目的のために使用したいというユーザーもいます。オートメーションを使用すると、Visio のオブジェクトを使用するだけで Visio の機能をソリューションに組み込むことができ、これらの作業を自動化することができます。
Microsoft Visual Basic for Applications (VBA) を熟知している方ならば、コマンド ボタンのようなコントロール、ユーザー フォーム、データベース、フィールドなどのオブジェクトを扱った経験も多いでしょう。オートメーションでは、アプリケーションの他のオブジェクトも使用できます。たとえば、図面、マスタシェイプ、図形、Visio のメニューやツールも、プログラムのオブジェクトとして扱うことができます。プログラムを Visio のインスタンス内で実行したり、プログラムを使って Visio を起動して必要なオブジェクトにアクセスすることができます。
Visio 製品には VBA が付属しているので、プログラムを作成するために別の開発環境を使用する必要はありません。ただし、コントローラとしてオートメーションをサポートするプログラミング言語であれば、どの言語を使用しても Visio を制御するプログラムを作成することができます。このガイド内のサンプル コードのほとんどは VBA で記述されていますが、プログラミングの原理はほかのプログラミング言語でも同じです。
このセクションの内容...
オートメーションとは、VBA、Microsoft Visual Basic、 C/C++、またはオートメーションをサポートするその他のプログラミング言語で作成されたプログラムが、アプリケーションのオブジェクトを使用してそのアプリケーションの機能を簡単に利用するための手法です。このガイドでは、Visio がこのアプリケーションにあたると考えてください。
オートメーションでは、オブジェクトを提供するアプリケーションはプロバイダ アプリケーションまたはオートメーション サーバと呼ばれ、Visio はこの一例です。プロバイダ アプリケーションは、オブジェクトを制御するプロパティとメソッドを提供して、他のアプリケーションがそのオブジェクトにアクセスできるようにします。これをオブジェクトの "公開" と呼びます。
公開されたオブジェクトを使用するアプリケーションは、コントローラ アプリケーションまたはオートメーション クライアントと呼ばれ、独自に作成したプログラムなどがこれにあたります。コントローラ アプリケーションは、使用するオブジェクトのインスタンスを作成し、プロパティを設定したりメソッドを呼び出すことによって、コントローラ側でオブジェクトを利用できるようにします。プロバイダ アプリケーションとコントローラ アプリケーションは、OLE ライブラリを介して関数を呼び出すことにより、相互に作用します。OLE ライブラリは、Visio、Visual Basic、Microsoft Windows などの OLE をサポートするアプリケーションのインストール時に自動的にインストールされます。
スクリプト言語は、アプリケーションのユーザー インターフェースでの操作 (メニュー コマンドを選択する、キーを押す、入力するなど) を自動化します。一方、オートメーションは、アプリケーションのオブジェクトにアクセスします。オブジェクトは、データ、動作、イベントをインターフェースにカプセル化し、開発者はこのインターフェースを介してオブジェクトにアクセスできます。Visio オブジェクトには、それぞれプロパティ (データ)、メソッド (動作)、イベントがあり、プログラムでこれらを使用してオブジェクトを制御することができます。
Visio のオブジェクトは Visio のインスタンス内にあります。Microsoft Visual Basic for Applications (VBA) プログラムは Visio のインスタンス内で実行され、目的のオブジェクトにアクセスします。一方、外部プログラムは、Visio のインスタンス外で実行されます。この場合外部プログラムは、まず Visio を起動します。Visio が既に起動されている場合は、Visio のインスタンスを取得します。次に、目的の Visio オブジェクトにアクセスします。Visio のオブジェクト モデル内のほとんどのオブジェクトは、Visio に表示される選択可能なユーザー インターフェース項目を表すことができます。たとえば、Page オブジェクトは図面のページを表し、Shape オブジェクトは図面上の図形を表します。図形の数式は、Cell オブジェクトによって表されます。
このガイドの多くの章で、Visio ソリューションでオートメーションを利用する方法について説明しています。概要については、「第 14 章 オートメーションと Visio オブジェクト モデル」を参照してください。
ソリューションがオートメーションを使用して Visio のオブジェクトにアクセスする方法を理解するために、図面上で図形が追加/削除されると発生するイベントを監視するソリューションを例にとって考えてみましょう。このソリューションでは、各図形によって表されている電力消費の合計量を維持し、定められた限界を超えていないことを確認します。
図面上に図形で表された、電力消費量を監視するソリューション。
例は、既存の図面の図形をすべてチェックする初期化手順から始まります。限界値は、「限界値」という名前の図形のテキストで表されます。ユーザーは、この図形のテキストに数値を入力できます(VBA の Val 関数は、テキストを後続の計算で使用できる Double 型に変換しています)。ソリューションは、「現在値」という図形の [PC] というユーザー定義のセルに合計を保持します。
電力を消費するデバイスを表す各図形は、各自の電力消費値を PowerConsumption というカスタム プロパティに保存します。プログラムは、Shape オブジェクトの Cells プロパティを通じて、このカスタム プロパティにアクセスします。プログラムは、InitWith プロシージャに渡された Page オブジェクトの Shapes コレクションに対してループ処理を実行し、PowerConsumption プロパティを持つ各図形の電力消費値をチェックします。電力消費の合計量が、図面に設定されている限界を超えた場合、ソリューションは図形「限界値」の [文字の書式] セクション内の [Color] セル (Char.Color) を 2 に設定して、図形のテキストを赤に変更します。これにより、ユーザーに警告することができます。
Option Explicit
Private WithEvents thePage As Page
Private theLimit As Double
Private theCurrent As Cell
Public Sub InitWith(aPage As Page)
Dim i As Integer
Set thePage = aPage
theLimit = Val(aPage.Shapes("限界値").Text)
Set theCurrent = aPage.Shapes("現在値").Cells("User.PC")
theCurrent.ResultIU = 0#
For i = 1 To aPage.Shapes.Count
With aPage.Shapes(i)
If .CellExists("Prop.PowerConsumption", False) Then
theCurrent.Result("") = theCurrent.Result("") + _
.Cells("prop.PowerConsumption").Result("")
If theCurrent.Result("") > theLimit Then
aPage.Shapes("Limit").Cells("Char.Color").Result("") = 2
End If
End If
End With
Next i
End Sub
このソリューションで、ユーザーが図面に図形を追加したとします。この操作によって、ShapeAdded イベントが発生します。このイベントは、ソリューション内の以下のイベント プロシージャで処理されます。このイベントは、ページの初期化プロシージャと同様に、新しく追加された図形の電力消費値を合計に加算し、図面に設定されている限界を超えないかどうかをチェックします。
Private Sub thePage_ShapeAdded(ByVal Shape As Visio.IVShape)
If Shape.CellExists("Prop.PowerConsumption", False) Then
theCurrent.Result("") = theCurrent.Result("") + _
Shape.Cells("prop.PowerConsumption").Result("")
If theCurrent.Result("") > theLimit Then
thePage.Shapes("限界値").Cells("Char.Color").Result("") = 2
End If
End If
End Sub
図形を削除すると BeforeShapeDelete イベントが発生します。ソリューションでは削除操作を元に戻すことはできませんが、図面から実際に削除される前に、存在する図形に対してしか行うことができない操作をあらかじめ行っておくことはできます。以下のイベント プロシージャは、削除された図形の電力消費値を合計から減算して現在の値を更新します。図形の削除によって合計が限界内に収まると、図形「限界値」のテキストを黒 (0) に戻します。
Private Sub thePage_BeforeShapeDelete(ByVal Shape As Visio.IVShape)
If Shape.CellExists("Prop.PowerConsumption", False) Then
theCurrent.Result("") = theCurrent.Result("") - _
Shape.Cells("prop.PowerConsumption").Result("")
If theCurrent.Result("") <= theLimit Then
thePage.Shapes("限界値").Cells("Char.Color").Result("") = 0
End If
End If
End Sub
オートメーションを使用して図形の数式にアクセスする方法については、「第 17 章 数式のオートメーション化」を参照してください。ソリューション内で Visio イベントを処理する方法の詳細については、「第 21 章 Visio のイベントの処理」を参照してください。