💻

はじめてのiCAD×VBA その2

2025/01/27に公開

はじめに

VBAでiCADを操作する方法を教えてもらったので、その備忘録の第二弾です。
前回作成した矩形を配置するマクロを、寸法をフォームで入力できるように改造していきます。

前回作ったVBAコード

処理内容

  1. 100×250×16の矩形を作成し
  2. ”0 0 0"の位置に配置する

コード

はじめてのiCAD×VBA.xlsm
Sub iCAD_VBA()

Dim iCADObj As Object 'iCADオブジェクト用の変数を宣言
Dim iCADMac As String 'コマンド格納用の変数を宣言

'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する
Set iCADObj = CreateObject("ICAD.Application")

iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & "100" & vbCr
iCADMac = iCADMac & ".Width " & "250" & vbCr
iCADMac = iCADMac & ".Height " & "16" & vbCr
iCADMac = iCADMac & "0 0 0 ,"

iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する

End Sub

前提環境

  • Excelで開発タブの表示
  • iCAD SXのダウンロード

参考

「C:\ICADSX\HELP」内にiCADのHelpが格納されています。

  • VB I/Fに関するHelp:ICADOLEA.chm
  • V8L3コマンドキーワード一覧:SXPROKEY.chm

また、PDFで「コマンド簡易開発ガイド」も用意されており、VBAでの開発とVBでの開発のマニュアルになっています。
(C:/ICADSX/man/development_guide.pdf)

フォームで入力できるように改造

寸法を変数化

フォームで入力できるようにするために、前回は直接指定していた寸法部分を変数にします。
まずは必要な変数を宣言&変数をクリアする

はじめてのiCAD×VBA.xlsm
Dim iCADObj As Object 'iCADオブジェクト用の変数を宣言
Dim iCADMac As String 'コマンド格納用の変数を宣言
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先

iCADMac = ""  'コマンド格納先の変数をクリア
Depth = 0  '寸法格納先の変数をクリア
Width = 0  '寸法格納先の変数をクリア
Height = 0  '寸法格納先の変数をクリア

続いて、直接指定していた寸法部分を先ほど宣言した変数に変更し、ついでに配置場所のZ方向を「奥行き」の値にすることでいい感じの場所に配置するようにします。

はじめてのiCAD×VBA.xlsm
iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"

さいごに、変数に寸法値を格納するコードを追加することで、寸法の変数化は完了です。

はじめてのiCAD×VBA.xlsm
Sub iCAD_VBA()

Dim iCADObj As Object 'iCADオブジェクト
Dim iCADMac As String 'コマンド格納先
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先

iCADMac = ""  'コマンド格納先の変数をクリア
Depth = 0  '寸法格納先の変数をクリア
Width = 0  '寸法格納先の変数をクリア
Height = 0  '寸法格納先の変数をクリア

'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する
Set iCADObj = CreateObject("ICAD.Application")

Depth = 100
Width = 250
Height = 16

iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"

iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する

End Sub

フォームの設置

左側の「標準モジュール」を右クリックして「挿入(N)」からユーザーフォームを挿入します。
続いて下記のようにラベル、テキストボックス、コマンドボタンを使用して入力フォームを作成します。

続いて、左下のプロパティ欄より、フォームとテキストボックスにそれぞれ下記のようにオブジェクト名を付けます。

部品 オブジェクト名
フォーム BaseCreateForm
テキストボックス(奥行き) DEPTH_X
テキストボックス(高さ) HIGHT_Y
テキストボックス(幅) WIDTH_Z

フォームにコードを移植

続いてフォームをクリックしたときにVBAを実行するようにしていきます。
作成したフォームの実行ボタン部分をダブルクリックすると、下記のようなコードが出てくるので

はじめてのiCAD×VBA.xlsm
Private Sub CommandButton1_Click()

End Sub

先ほどのコードを間にコピペします。

はじめてのiCAD×VBA.xlsm
Private Sub CommandButton1_Click()

Dim iCADObj As Object 'iCADオブジェクト
Dim iCADMac As String 'コマンド格納先
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先

iCADMac = ""  'コマンド格納先の変数をクリア
Depth = 0  '寸法格納先の変数をクリア
Width = 0  '寸法格納先の変数をクリア
Height = 0  '寸法格納先の変数をクリア

'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する
Set iCADObj = CreateObject("ICAD.Application")

Depth = 100
Width = 250
Height = 16

iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"

iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する

End Sub

続いて、直接寸法を変数に格納していた部分をフォームのテキストボックスに入力された値を格納するように変更します。

はじめてのiCAD×VBA.xlsm
Depth = Me.DEPTH_X '変数にテキストボックス(DEPTH_X)の値を挿入
Width = Me.WIDTH_Z '変数にテキストボックス(WIDTH_Z)の値を挿入
Height = Me.HIGHT_Y '変数にテキストボックス(HIGHT_Y)の値を挿入

ついでに実行ボタンを押すとテキストボックスの値を削除する処理と、実行が完了したらメッセージを表示する処理を最後に追加します。

はじめてのiCAD×VBA.xlsm
Unload Me
'テキストボックスの値を削除する(MsgBOXを前にするとMsgBOXも消えるので、先に処理する)

MsgBox ("実行完了しました")

下記が今回の最終形になります。

はじめてのiCAD×VBA.xlsm
Private Sub CommandButton1_Click()

Dim iCADObj As Object 'iCADオブジェクト
Dim iCADMac As String 'コマンド格納先
Dim Depth As Long '奥行き格納先
Dim Width As Long '幅格納先
Dim Height As Long '高さ格納先

iCADMac = ""  'コマンド格納先の変数をクリア
Depth = 0  '寸法格納先の変数をクリア
Width = 0  '寸法格納先の変数をクリア
Height = 0  '寸法格納先の変数をクリア

Set iCADObj = CreateObject("ICAD.Application")
'ライブラリからiCADの操作を司るオブジェクトを呼び出す
'Setはオブジェクトを格納するときに使用する

Depth = Me.DEPTH_X '変数にテキストボックス(DEPTH_X)の値を挿入
Width = Me.WIDTH_Z '変数にテキストボックス(WIDTH_Z)の値を挿入
Height = Me.HIGHT_Y '変数にテキストボックス(HIGHT_Y)の値を挿入

iCADMac = iCADMac & ";PLAY;BOX" & vbCr 'iCADMacに対して値を追記
iCADMac = iCADMac & ".Depth " & Depth & vbCr
iCADMac = iCADMac & ".Width " & Width & vbCr
iCADMac = iCADMac & ".Height " & Height & vbCr
iCADMac = iCADMac & "0 0 " & Depth & " ,"

iCADObj.RunCommand iCADMac, MODE_COMMAND
'iCADObj.RunCommand=VBAからiCADへ「iCADMac」に格納されたコマンドを受け渡す
'MODE_COMMAND=受け渡したコマンドをiCADを「コマンドモード」で実行する

Unload Me
'テキストボックスの値を削除する(MsgBOXを前にするとMsgBOXも消えるので、先に処理する)

MsgBox ("実行完了しました")

End Sub

最後に

前回作成した矩形を配置するマクロを、フォームで入力できるように改造しました。
次回は作成した矩形のパーツ化をやりたいと思います。

続き⇒
https://zenn.dev/nakashun_mf/articles/92c21e3478da34

Discussion