対象製品: IJCAD 2014 以降
IJCAD 6.4 で作成された Visual Basic for Application を IJCAD 2014 以降の製品に移行させるには、
幾つかの手順を踏む必要があるので、IJCAD 2015 を使用して説明していきます。
IJCAD 6.4 での Visual Basic for Application の動作確認
- IJCAD 6.4 では、図面ファイル(拡張子.dwg)を開くと、同じフォルダ内の同じ名前のVBAプロジェクトファイル(拡張子 .vbi)を開くようになっています。また、図面を保存するとVBIファイルも保存されます。
SECURITY [セキュリティ]コマンドで、セキュリティ レベルを中または低レベルに設定することで、未署名のVBAプロジェクトを開くことができます。
IJCAD 2015 では、VBAMAN[VBA管理]コマンド、VBALOAD[VBAロード]コマンドから、VBAプロジェクトファイルを開くことができます。
マクロを有効にするをクリックすると、VBAエディタにプロジェクトファイルがロードされ、編集と実行が可能になります。 - VBARUN[マクロ実行]コマンドを実行すると、次のダイアログボックスが表示されます。
マクロを選んで実行ボタンを押すことでマクロを実行することができます。
※DWGファイルと、VBIファイルのオリジナルを保存しておいてください。 - IJCAD 2015 を起動させ、VBALOADコマンドを実行すると、次のダイアログボックスが表示されます。
IJCAD 6.4 とIJCAD 2015 のプロジェクトファイルはどちらもVBIファイルですが、プロジェクトファイルを選び、開くボタンを押してもIJCAD 6.4 のVBAプロジェクトは開くことができません。
IJCAD 6.4 で作成されたプロジェクトをIJCAD 2015 へ移行するためには、プロジェクト内のファイルのエクスポートとインポートが必要となります。
IJCAD 6.4 でソースファイルをエクスポートする
- IJCAD 6.4でVBAIDE[VBA編集]コマンドを実行し、VBAウィンドウを表示します。
プロジェクトウインドウに、現在利用可能なVBAプロジェクトとソースファイルの一覧が表示されます。
その中からエクスポートするファイルを選択し、右クリックを押してファイルのエクスポートを選択します。 - 保存先のフォルダを指定して保存します。
エクスポートしたファイルの一覧です。
クラスファイル(拡張子 .cls)
- ThisDocument.cls :ユーザークラスファイルで、テキストファイルになっています。
- UserForm1.frm :ユーザーフォームのコード部分で、テキストファイルになっています。
- UserForm1.frx :ユーザーフォームのリソース部分で、バイナリファイルになっています。
- 一般モジュールファイルで、テキストファイルになっています。
- ※ソースコードだけが必要なら、VBAエディタでクリップボードにコピーするほうが簡単かもしれません。
エディタ内で範囲を指定して、右クリックのメニューからコピーを選択するか[Ctrl + C]でコピーします。
IJCAD 2015 でソースファイルをインポートする
- IJCAD 2015を起動して、VBAIDE[VBA編集]コマンドを実行します。
中身のないVBAが生成され、プロジェクトウインドウに表示されます。 - IJCADに画面を戻して、VBAMAN[VBA管理]コマンドを実行します。
プロジェクトを選択すると、名前を付けて保存(S)ボタンが有効になるので、ボタンを押します。 - 保存先のフォルダを指定して、プロジェクトファイルに名前を付けて保存します。
- VBA管理ダイアログの Visual Basic Editor ボタンを押すと、Visual Basic ウィンドウに戻ることができるので、プロジェクトウインドウでプロジェクトを右クリックすると、ファイルのインポートを選択できます
- UserForm1.frmファイルを選択して開き、プロジェクトにインポートします。
一般モジュールやクラスモジュールも、ファイルのインポートで取り込むことができますが、うまくいかない場合はソースコードだけをコピーし、新規で挿入した一般モジュールやクラスモジュールにペーストしてください。 - ThisDocument.clsファイルをインポートすると、次の図のようにクラスモジュールとしてプロジェクトに追加されました。この内容は、ThisDrawingにあるべき内容なので、ThisDrawing.cls ファイルへコピー&ペーストし、ThisDocument.cls はプロジェクトから削除します。
ThisDocument.cls のコードをThisDrawing にコピー&ペーストし、ThisDocument.cls をプロジェクトから削除しました。 - インポートが完了したら、プロジェクトを保存します。
ファイルメニューにプロジェクトの上書き保存がありますが、ツールバー上のアイコンがフロッピーディスクのボタンや、[Ctrl + S]を押しても、プロジェクトの上書き保存を呼び出すことができます。
IJCAD 2015 で動作確認する
- マクロとして呼び出し可能な手続きに対して、Visual Basic の実行ボタンを押せばマクロが動作しますが、IntellCADのオブジェクトを扱う DimensionStyl を参照している行で、コンパイル エラーになります。
正常に起動させるためには、IJCAD 2015のVBAエディタ上でコードの修正を行う必要があります。
IJCAD 6.4 と IJCA D2015 の変更箇所
IJCAD 6.4とIJCAD 2015で以下の通りの変更点があります。
- 平行寸法を作成するマクロ
- IJCAD 6.4 でドキュメントを取得するThisDocumentが、IJCAD 2015ではThisDrawingに変わっています。
- 寸法スタイルを扱うクラスであるDimensionStyleが、IJCAD 2015 ではGcadDimStyleに変わり、クラス名に Gcad という接頭辞がついていることが違います。
- 寸法スタイルの上書きはアクセス方法に変更があるので、下記のサンプルではコメントアウトされています。
- IJCAD 6.4 では座標値を扱う Point というクラスがありましたが、IJCAD 2015では3要素の実数配列を使用します。これはAutoCADオートメーションと同様の仕様です。
IJCAD 6.4のコードですが、このような記述では、p1,p2の型はバリアント型でp3がPointクラスとして宣言されています。IJCAD 2015で、Dim p1(0 to 2), p2(0 to 2), p3(0 to 2) As Double と定義してしまうと、p1とp2はバリアント型の配列でp3は実数型の配列になります。
IJCAD 2015で作図系のメソッドに対してバリアント型の配列を渡すと、エラーになるので注意が必要です。
IJCAD 6.4
IJCAD 2015Public Sub TestAddDim() Dim curDimStyle As DimensionStyle Set curDimStyle = ThisDocument.ActiveDimStyle With curDimStyle .DimBlk = "SMALL" .DimSah = 0 .DimClrd = 3 End With Dim p1, p2, p3 As Point Set p1 = Library.CreatePoint(0#, 0#, 0#) Set p2 = Library.CreatePoint(10#, 0#, 0#) Set p3 = Library.CreatePoint(5#, 2#, 0#) ModelSpace.AddDimAligned( p1, p2, p3) End Sub
Public Sub TestAddDim() Dim curDimStyle As GcadDimStyle Set curDimStyle = ThisDrawing.ActiveDimStyle ' With curDimStyle ' .DimBlk = "SMALL" ' .DimSah = 0 ' .DimClrd = 3 ' End With Dim p1(0 To 2) As Double Dim p2(0 To 2) As Double Dim p3(0 To 2) As Double p1(0) = 0# p1(1) = 0# p1(2) = 0# p2(0) = 10# p2(1) = 0# p2(2) = 0# p3(0) = 5# p3(1) = 2# p3(2) = 0# ModelSpace.AddDimAligned(p1, p2, p3) End Sub
- 画層リストを表示するマクロ
- フォームのリソース部分はそのまま使用できます。
- 平行寸法を作成するマクロ同様に、クラス変数名 ThisDocument が ThisDrawing に変わった点と、クラス名に Gcad という接頭辞がついていることが違います。
IJCAD 6.4
IJCAD 2015Private Sub CommandButton1_Click() Dim rec As Layer Set rec = ThisDocument.Layers.Item(ListBox1.Text) If Not rec Is Nothing Then ThisDocument.ActiveLayer = rec End If End Sub Private Sub UserForm_Activate() ListBox1.Clear Dim rec As Layer For Each rec In ThisDocument.Layers ListBox1.AddItem rec.Name Next End Sub Public Sub TestForm() UserForm1.Show End Sub
Private Sub CommandButton1_Click() Dim rec As GcadLayer Set rec = ThisDrawing.Layers.Item(ListBox1.Text) If Not rec Is Nothing Then ThisDrawing.ActiveLayer = rec End If End Sub Private Sub UserForm_Activate() ListBox1.Clear Dim rec As GcadLayer For Each rec In ThisDrawing.Layers ListBox1.AddItem rec.Name Next End Sub Public Sub TestForm() UserForm1.Show End Sub
このように、IJCAD 6.4 からエクスポートしたファイルを、IJCAD 2015にインポートを行っただけではマクロを実行することはできません。プロジェクトの規模が大きいほど、より多くのコードの修正をする必要があります。
これは、IJCAD 2015 のオートメーションが、よりAutoCADのオートメーションに近い仕様になっている為に、以前のバージョンのIJCADのオートメーションとの仕様に差がある為です。