この記事はこのような人に向けて書いています。
こんにちは。ゆー です。
今回はこちらの記事で配布したサンプルの解説記事です。
配布したサンプルの中でも正多角柱の自動生成ツールは実用性よりVBAの入門として作成しています。
サンプルツールの内容を詳しく知って、自分独自のツールを作れるようになりましょう!
目次
事前の準備として下記記事を参考に、私が配布しているライブラリファイルをインポートしておいてください。
インポートしたエクセルファイルはxlsm形式で保存しておきましょう。
まずはエクセルのシートに多角柱のパラメータ(寸法など)を入力する画面を作ります。
フォントや色などはあくまで例ですので、ご自身で使いやすいように作成しましょう。
例えばパラメータを入力するセル以外は変更してほしくないので「セルのロック」「シートの保護」機能などを活用するのも有りですね。
VBエディターを起動し、パラメータ入力画面を作成したシートモジュールをダブルクリックしてプログラムを書き込む画面に移動します。
プロシージャ名は「GenerateNgonalCylinder」としています(自由に決めてOKです)。
Sub GenerateNgonalCylinder() End Sub
Sub ◯◯()を入力すると自動でEnd Subが入力されます。
この「Sub ◯◯() ~ End Sub」 が一つのSubプロシージャです。
今回の正多角柱の自動生成ツールでは一つのSubプロシージャしか使用していませんが、プログラムが複雑になるにつれて、複数のプロシージャを呼び出して使ったりします。
使用したVBAコード要素
プログラムを実行するためにVBエディターをいちいち起動していられないので、自動化ツールには実行ボタンを配置しましょう。
ボタンは開発タブ→挿入→ボタンを選択で作成します。
そして実行したいSubプロシージャを割り当てておきます。
これでボタンをクリックするとプログラムが動くようになります。
この多角形ツールのコード全体は以下の内容です。
先ほど作成したGenerateNgonalCylinderプロシージャに以下の内容を記入するとツールが出来上がります。
Sub GenerateNgonalCylinder() ' ------------------------------------------------------------------------------------------ ' 正多角柱の生成 ' ------------------------------------------------------------------------------------------ 'iCADオブジェクトの設定 Dim myObject As Object Set myObject = CreateObject("ICAD.Application") '使用する変数の宣言 Dim polyNum As Long 'N数を格納する変数 Dim circR As Double '外接円の半径を格納する変数 Dim cylLen As Double '柱長さを格納する変数 Dim polyAng As Double '正N角形の中心角を格納する変数 Dim i As Long '繰り返し(For文)のカウントを格納する変数 Dim dx1 As Double '直線や矩形作成時に指定する一点目X座標を格納する変数 Dim dy1 As Double '直線や矩形作成時に指定する一点目Y座標を格納する変数 Dim dx2 As Double '直線や矩形作成時に指定する二点目X座標を格納する変数 Dim dy2 As Double '直線や矩形作成時に指定する二点目Y座標を格納する変数 '変数にセルの値を代入 polyNum = Range("C4").value 'セルの値をそのまま代入 circR = Range("C5").value / 2 'セルの値は直径なので2で割って代入 cylLen = Range("C6").value 'セルの値をそのまま代入 polyAng = 8 * Atn(1) / polyNum 'VBAの計算は度ではなくラジアンになるよう入力する Atn(1)はアークタンジェント1=45度だが、ラジアンではπ/4ラジアン。8倍すれば2π。 '各種寸法が不適切でないか確認する 'もしもN数が3より小さい場合、メッセージ表示&プログラム終了 If polyNum < 3 Then MsgBox "N数が小さすぎます" Exit Sub End If 'もしも外接円半径が0以下の場合、メッセージ表示&プログラム終了 If circR <= 0 Then MsgBox "外接円径が不適切です" Exit Sub End If 'もしも柱長さが0以下の場合、メッセージ表示&プログラム終了 If cylLen <= 0 Then MsgBox "柱長さが不適切です" Exit Sub End If 'iCADの起動確認 If IsICADActive(myObject) = False Then Exit Sub End If 'iCADの新規ウィンドウ作成 If CreateICADWindow(myObject) = False Then Exit Sub End If '2D画面表示 If ActivateICAD2DView(myObject) = False Then Exit Sub End If '多角形を作図する '多角形の辺の数だけ、直線の作図を繰り返す For i = 1 To polyNum dx1 = circR * Sin(polyAng * (i - 1)) dy1 = circR * Cos(polyAng * (i - 1)) dx2 = circR * Sin(polyAng * i) dy2 = circR * Cos(polyAng * i) If DrawLine_Between(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If Next '2D→3Dコマンドを使う準備として三次元ウィンドウを作成する '作成した多角形の右隣りに矩形を作成する dx1 = circR * 2 dy1 = -circR * 2 dx2 = circR * 8 dy2 = circR * 2 If DrawRectangle(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If '全体表示する If SetICADEntireView(myObject) = False Then Exit Sub End If '三次元ウィンドウを作成する If CreateDimensionWindow(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If '垂直投影実行 dx1 = -circR * 1.1 dy1 = circR * 1.1 dx2 = circR * 1.1 dy2 = -circR * 1.1 If Create2D3DVertical(myObject, dx1, dy1, dx2, dy2, cylLen) = False Then Exit Sub End If End Sub
コード内にコメントとして記載されていますが、このプログラムの流れは以下の通りです。
プログラムの主な流れ
それではコードの内容を一つ一つ説明していきます。
VBAからiCADを操作するためには必ずiCADオブジェクトを使います。
下記のコードでiCADオブジェクトを設定します。
'iCADオブジェクトの設定 Dim myObject As Object Set myObject = CreateObject("ICAD.Application")
「Dim myObject As Object」 で “myObject”がオブジェクト型の変数であることを宣言しています(変数の宣言は次の段落で詳しく説明)。
「Set myObject = CreateObject(“ICAD.Application”)」 で宣言した”myObject”という変数にiCADオブジェクトを設定しています。
使用したVBAコード要素
外接円径や長さなどのパラメーターは変数に格納します。
そのため、最初に「Dim 〇〇 As ✕✕」 で変数を宣言します。
◯◯は変数の名前、✕✕は変数の型です。
たとえばN数(正N角形のNの数)は整数ですのでLong型(整数型)を指定します。
一方で、外接円の半径や柱長さは小数もあり得るのでDouble型(小数型)を指定します。
'使用する変数の宣言 Dim polyNum As Long 'N数を格納する変数 Dim circR As Double '外接円の半径を格納する変数 Dim cylLen As Double '柱長さを格納する変数 Dim polyAng As Double '正N角形の中心角を格納する変数 Dim i As Long '繰り返し(For文)のカウントを格納する変数 Dim dx1 As Double '直線や矩形作成時に指定する一点目X座標を格納する変数 Dim dy1 As Double '直線や矩形作成時に指定する一点目Y座標を格納する変数 Dim dx2 As Double '直線や矩形作成時に指定する二点目X座標を格納する変数 Dim dy2 As Double '直線や矩形作成時に指定する二点目Y座標を格納する変数
変数の型はたくさんありますが、まずは以下の型があることを認識しておけば十分でしょう。
型名 | データ型 | 値値 |
---|---|---|
Integer | 整数 | -32,768 ~ 32,767 の整数 |
Long | 長整数 | -2,147,483,648 ~ 2,147,483,647 の整数 |
Double | 小数 | 負:-1.79769313486231E308 ~ -4.94065645841247E-324 正:4.94065645841247E-324 ~ 1.79769313486232E308 |
String | 文字列 | “文字列” 可変長:最大で約 20 億 (2^31) 文字 固定長:1 ~ 約 64 K (2^16) の文字 |
Date | 日付 | 西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻 |
Boolean | ブール | True または False |
Object | オブジェクト | 他のアプリケーションから提供されるデータや機能など |
Variant | バリアント | すべて |
詳しく知りたい方はMicrosoftのVBAリファレンス等をご確認ください。
プログラムでは「変数 = 値」と書くと変数に値が代入されます。
イコール記号(=)ですが左辺と右辺が等しいという数学的な使い方ではないことに注意してください。
以下のコードでエクセルのセルに入力された値を代入しています。
'変数にセルの値を代入 polyNum = Range("C4").value 'セルの値をそのまま代入 circR = Range("C5").value / 2 'セルの値は直径なので2で割って代入 cylLen = Range("C6").value 'セルの値をそのまま代入 polyAng = 8 * Atn(1) / polyNum 'VBAの計算は度ではなくラジアンになるよう入力する Atn(1)はアークタンジェント1=45度だが、ラジアンではπ/4ラジアン。8倍すれば2π。
たとえば正N角形のNの数は3以上でなければ作図できません。
また、外接円径や柱の長さが0以下になることはありえません。
このようにありえない数値が入力されていた場合には、その旨のメッセージを表示してプログラムを終了するようにしましょう。
そんなとき活躍するのがIf文です。
If文ではもしも〇〇の場合✕✕するという処理を行うことができます。
以下のようにコードを追加します。
'各種寸法が不適切でないか確認する 'もしもN数が3より小さい場合、メッセージ表示&プログラム終了 If polyNum < 3 Then MsgBox "N数が小さすぎます" Exit Sub End If 'もしも外接円半径が0以下の場合、メッセージ表示&プログラム終了 If circR <= 0 Then MsgBox "外接円径が不適切です" Exit Sub End If 'もしも柱長さが0以下の場合、メッセージ表示&プログラム終了 If cylLen <= 0 Then MsgBox "柱長さが不適切です" Exit Sub End If
ここまでコードを作成したプログラムを実行すると、下記のように動作します。
わざとN数に2を入れたり、柱長さにマイナスの値を入れて、メッセージが表示されれば正しく動作しています。
使用したVBAコード要素
ここまではiCADを操作する前の準備でした。
つづいて実際にiCADを操作するコードを作成していきましょう。
最初の多角形の作図は2D画面で実施します。
そのため、「iCADが起動しているか確認」して「新規のウィンドウを作成」し「2D画面に切替」を行います。
ライブラリから関数を呼び出しますので、呼び出し方法などは下記記事を参照してください。
呼びだす関数
'iCADの起動確認 If IsICADActive(myObject) = False Then Exit Sub End If 'iCADの新規ウィンドウ作成 If CreateICADWindow(myObject) = False Then Exit Sub End If '2D画面表示 If ActivateICAD2DView(myObject) = False Then Exit Sub End If
ここまでのコードを作成したプログラムを実行すると、下記のように動作します。
自動でiCADの新規図面が立ち上がり、2D画面になれば正常な動作です。
つづいて多角形の作図です。
以下の関数を呼び出せば直線を作成できます。
呼びだす関数
しかし作成したい直線は1本ではありません。
例えば五角形なら5回、八角形なら8回直線を引く動作を行う必要が出ます。
このような繰り返し作業を行うのに活躍するのがFor文です。
For文は以下のように使います。
For 変数 = 初期値 To 終了値 ' 繰り返し実行したいコード Next
今回の多角形作図では以下のように使います。
'多角形を作図する '多角形の辺の数だけ、直線の作図を繰り返す For i = 1 To polyNum dx1 = circR * Sin(polyAng * (i - 1)) dy1 = circR * Cos(polyAng * (i - 1)) dx2 = circR * Sin(polyAng * i) dy2 = circR * Cos(polyAng * i) If DrawLine_Between(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If Next
多角形の作図なので辺の数だけ処理を繰り返します。
また頂点の座標は下図に示すように三角関数で求めています。
For文では繰り返す毎に変数iの値が1ずつ増えているので、計算の中に変数iを組み込んでおくことで、作図される座標がずれていき、多角形を作図できます。
また、4つの変数(dx1, dy1, dx2, dy2)には直線を引くための座標を代入しています。
下記のように書いても同じなのですが、コードが解読しにくくなるのであえて変数に格納しています。
For i = 1 To polyNum If DrawLine_Between(myObject, circR * Sin(polyAng * (i - 1)), circR * Cos(polyAng * (i - 1)), circR * Sin(polyAng * i), circR * Cos(polyAng * i)) = False Then Exit Sub End If Next
ここまでコードを作成したプログラムを実行すると、下記のように動作します。
指定した正N角形が作図されれば正常に動作しています。
使用したVBAコード要素
2D→3Dコマンドを実行する前には、あらかじめ三次元ウィンドウを作成する必要があります。
「(ウィンドウを作成するための)矩形を作図」して「全体表示」して「三次元ウィンドウを作成する」を行います。
呼びだすコード
いきなり三次元ウィンドウを作成しようとして、画面表示外の座標を指定してしまうとエラーになるため、このようなステップが必要になります。
'2D→3Dコマンドを使う準備として三次元ウィンドウを作成する '作成した多角形の右隣りに矩形を作成する dx1 = circR * 2 dy1 = -circR * 2 dx2 = circR * 8 dy2 = circR * 2 If DrawRectangle(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If '全体表示する If SetICADEntireView(myObject) = False Then Exit Sub End If '三次元ウィンドウを作成する If CreateDimensionWindow(myObject, dx1, dy1, dx2, dy2) = False Then Exit Sub End If
もしも矩形を作図せずに三次元ウィンドウを作成しようとすると以下のようになってしまうことがあります。
iCAD上でマクロ文法エラーというメッセージが出ました。
この場合、iCADの動作が終わっていない状態なのでキー入力領域に「N」または「NO」と入力してエンターキーを押し、iCADの動作を終了させることでVBAの動作に戻しましょう。
マクロ文法エラーはVBAでは自動的に認識できないエラーですので、いかにエラーが生じないようにプログラムを作成するかが重要です。
最後に垂直投影を実施します。
呼びだすコード
'垂直投影実行 dx1 = -circR * 1.1 dy1 = circR * 1.1 dx2 = circR * 1.1 dy2 = -circR * 1.1 If Create2D3DVertical(myObject, dx1, dy1, dx2, dy2, cylLen) = False Then Exit Sub End If
ここまでコードを作成することで多角柱の自動生成ツールが完成です!
むずかしく感じたでしょうか?
しかし実態はやりたいことを一つ一つ順番に実行しているだけですので、あせらずに一歩ずつ覚えていけば誰でもVBAツールを作成できるようになりますよ!
本ブログ記事に掲載しているiCADの画像についての注意事項です。
自動化ツールがサクサク作れる!iCAD ✕ VBAライブラリ活用方法
サンプルコードで試してみよう!iCAD用エクセルVBAツール