CATIA VBAで別プロジェクト(.catvba)のマクロを実行する方法|CATIAマクロの作成方法
CATIAマクロを作成していて今開発しているプロジェクト(.catvba)ではなく、別プロジェクトにあるマクロを実行したい状況に出くわすことがあります。Excelマクロでいえば、いま開いているブック(.xlsm)とは別のブック内にあるマクロを実行したいといった感じです。
たしかにマクロを1つのプロジェクトにまとめていくとゴチャゴチャになりますし、大規模なマクロを組む場合はプロジェクト別に分けておくのが基本です。そんな中、「あっちのプロジェクトに入ってるマクロを実行させたいな」となった時に、コードを現在編集しているプロジェクトにわざわざコピペして持ってきたりしていないでしょうか。
CATIA VBAには別プロジェクトのコードを実行させるための機能が備わっています。
という訳で今回はそんな別プロジェクト(.catvba)のマクロを実行する方法を解説していきます。
ExecuteScriptメソッド
CATIAマクロで別プロジェクトのマクロを実行するには「SystemServiceオブジェクト」の「ExecuteScriptメソッド」を使用します。
このメソッドは実行したいマクロの情報(プロジェクト名やモジュール名)を引数として入力することで、その情報をもとにマクロを実行することができます。
コードとしては下記のような構文になっています。
SystemService.ExecuteScript (プロジェクト名, _
プロジェクトタイプ, _
モジュール名, _
プロシージャ名, _
引数)
詳しい使い方はコード解説の項で説明していきます。
ちなみに上記コードにより別プロジェクトのマクロを実行しても、マクロライブラリとして登録はされません。ただVBE上では別プロジェクトも開かれるため、2つのプロジェクトを同時に編集することができるようになります。
サンプルコード
ExecuteScriptメソッドを使ったサンプルコードです。
下記コードをコピペして、マクロの情報であるパスや名称の文字列、引数の内容などを自身のものに合わせればそのまま実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Option Explicit Sub CATMain() 'SystemService定義 Dim CatSys 'As SystemService Set CatSys = CATIA.SystemService 'プロジェクト名(.catvba)定義 Dim project_name As String project_name = "C:\Users\ユーザー名\Desktop\other_project.catvba" 'モジュール名定義 Dim module_name As String module_name = "Module1" 'プロシージャ名定義 Dim procedure_name As String procedure_name = "CATMain" '引数定義 Dim arguments() ' ReDim arguments(1) ' arguments(0) = "第1引数" ' arguments(1) = "第2引数" 'マクロ実行 Call CatSys.ExecuteScript(project_name, _ catScriptLibraryTypeVBAProject, _ module_name, _ procedure_name, _ arguments) End Sub |
コード解説
SystemService定義
1 2 3 |
'SystemService定義 Dim CatSys 'As SystemService Set CatSys = CATIA.SystemService |
CATIA VBAで別プロジェクトを実行するには「SystemService」オブジェクトを使用します。
このとき「As SystemService」と宣言すると以降のメソッドでエラーが発生するのでVariant型で宣言しておく必要があるので注意しましょう。
プロジェクト名/モジュール名/プロシージャ名定義
1 2 3 4 5 6 7 8 9 10 11 |
'プロジェクト名(.catvba)定義 Dim project_name As String project_name = "C:\Users\ユーザー名\Desktop\other_project.catvba" 'モジュール名定義 Dim module_name As String module_name = "Module1" 'プロシージャ名定義 Dim procedure_name As String procedure_name = "CATMain" |
つぎに実行したいマクロの情報を入力します。
※存在しない文字列(パス/名称)を入力した場合はエラーが発生します
モジュール名 : 実行したいモジュール名
プロシージャ名: 実行したいプロシージャ名
上記コードの場合、デスクトップ上にある「other_project.catvba」内の「Module1」にある「CATMain」が実行されることになります。
引数定義
1 2 3 4 5 6 |
'引数定義 Dim arguments() ' ReDim arguments(1) ' arguments(0) = "第1引数" ' arguments(1) = "第2引数" |
つぎに実行したいマクロの引数を入力します。
引数がある場合は、引数の数だけの要素が入る配列を用意して順に格納していきます。
たとえば実行したいマクロの引数が2つある場合は上記のように「ReDim arguments(1)」として2つの要素が入る配列を用意します。(配列は0スタート)
そして「arguments(0)」には第1引数、「arguments(1)」には第2引数を格納します。
実行したいマクロの引数の数に応じて適宜配列の要素数と中身を設定して下さい。
サンプルコードでは文字列のみを扱っていますが、通常の関数と同じようにオブジェクトを渡すこともできます。オブジェクトを引数として格納するには「Set arguments(0) = オブジェクト」のように「Set」が必要なので注意しましょう。
引数がない場合も空の配列を用意しておく必要があるので注意しましょう。
※上記コードのコメント状態を解除すれば2つの引数あり.Verとして、
コメント状態そのままで引数なし.Verとして実行することができます。
マクロ実行
1 2 3 4 5 6 |
'マクロ実行 Call CatSys.ExecuteScript(project_name, _ catScriptLibraryTypeVBAProject, _ module_name, _ procedure_name, _ arguments) |
最後にこれまで定義した情報をもとにマクロを実行します。マクロの実行は「SystemServiceオブジェクト」の「ExecuteScriptメソッド」を使い下記のように書きます。
SystemService.ExecuteScript (プロジェクト名, _
プロジェクトタイプ, _
モジュール名, _
プロシージャ名, _
引数)
プロジェクト名, モジュール名, プロシージャ名, 引数 にはこれまで定義したものを入力します。
プロジェクトタイプには下記のいずれかを入力することができます。
「catScriptLibraryTypeDocument」
「catScriptLibraryTypeDirectory」
「catScriptLibraryTypeVBAProject」
今回はVBAProject(.catvba)なので「catScriptLibraryTypeVBAProject」を入力します。
これにより引数として入力した内容から別プロジェクトのマクロを実行することが可能になります。
まとめ
今回はCATIAマクロで別プロジェクトのマクロを実行する方法についての内容でした。
別プロジェクトのマクロを実行するには、実行したいマクロの情報を引数として「SystemServiceオブジェクト」の「ExecuteScriptメソッド」を実行するだけです。
SystemService.ExecuteScript (プロジェクト名, _
プロジェクトタイプ, _
モジュール名, _
プロシージャ名, _
引数)
ライブラリとして登録されるわけではありませんがVBE上には別プロジェクトも合わせて表示されるため、2つのプロジェクトを同時に編集することができます。