AcadRemoconチュートリアル第2弾

〜エクセルVBAを使った効率的なコマンド作成・デバッグ手順編〜


 

ステップ1 エクセルの準備


まずはエクセルを起動して、プログラム入力の準備をしましょう。

 

手順1)Excelメニューから「マクロ」→「Visual Basic Editor」を選択して下さい。

 

手順2)Visual Basic(以後VB)メニューから「挿入」→「標準モジュール」を選択して下さい。

 

これでプログラムを入力する場所(Module1)が確保できました。

 

手順3)このままではVBAを使うメリットが十分に生かせませんのでAcadRemocon.DLLへの参照設定をします。メニューから「ツール」→「参照設定」を選択して下さい。

 

手順4)参照設定画面が表示されたら、「Acad Remote Controller」にチェックを付けて「OK」をクリックして下さい。

→参照設定することにより、コード入力中にメソッドの一覧や引数の仕様が表示されるようになります。慣れてくるとAcadRemoconヘルプファイルを見なくても、ある程度プログラムが書けるようになります。

 

 

↓参照設定をすると下のように「Acad.」と入力した時点でメソッド等の一覧が表示されます。

 

↓また引数の入力に進んだ時も、引数の仕様(引数の名前と型、省略の可否、省略時の既定値)が表示されます。

 

 

 

 

ステップ2 プログラムの入力と実行・デバッグ


エクセルに内蔵されているVisual Basicは立派な統合開発環境です。テキストエディタでコマンドを作成するのと違ってデバッグが容易に行えます。まずは簡単なプログラムを貼り付けて実行してみましょう。

手順1)下記のプログラムをステップ1で作ったModule1に貼り付けて下さい。

※デバッグ手順を学んでもらう為に、このプログラムには1個所のバグを含んでいますが、そのまま貼り付けて下さい。  
      
Dim Acad As AcadRemocon.Body

'入力された2個の値の平均を求める
Sub Main()
    Set Acad = CreateObject("AcadRemocon.Body")
    If Not Acad.GetReal("変数Aの値を入力", A, "10") Then Er: Exit Sub
    If Not Acad.GetReal("変数Bの値を入力", B, "20") Then Er: Exit Sub
    MsgBox "変数AとBの平均は" & (A + B) / 0 & "です。"
End Sub

'エラー処理
Sub Er()
    'ユーザーによるキャンセル
    If Acad.ErrNumber = vbObjectError + 1000 Then
        'ここにキャンセル時の処理を追加
    Else
        'エラー内容表示
        Acad.ShowError
    End If
End Sub
     

手順2)まずはブレークポイントを設定してみましょう。ブレークポイントとはプログラムを、そこで一旦停止させるためのマークです。

 

右図のように、「If Not Acad.GetReal("変数Bの値を入力・・・」の行の左端のグレー部分をクリックして下さい。

 

左端にが付き、行が茶色っぽい色で反転表示されます。これでブレークポイントが設定されました。

 

手順3)それでは早速実行してみましょう。VBAではカーソルがある位置のプログラムが実行されるので、「Sub Main」から「End Sub」内の任意に場所をクリックしてから、実行のショートカットであるF5キー(ちなみにF8キーは1行ずつのステップ実行)を押して下さい。

※AutoCADを制御するコマンドは使っていませんので、AutoCADを起動させておく必要はありません。

 

手順4)「変数Bの値を入力」の前の行までは実行されるので、「変数Aの値を入力」ダイアログが表示されます。既定値のまま「OK」をクリックして下さい。

 

 

「変数Bの値を入力」の行が黄色く反転し、中断されていることがわかります。

中断している最中に、変数にカーソルを近付けると右図のように変数の内容が表示されます。

 

手順5)上記の方法でも変数の内容を確認することは出来ますが、もっと柔軟にデバッグが行える「イミディエイトウインドウ」を使ってみましょう。

メニューの「表示」からでも表示させることが出来ますが、「Ctrl+G」を押して下さい。

右図のように「イミディエイトウインドウ」が表示されます。※ドッキングされずにフローティングで表示される場合もあります。

右図の例では「Aの内容を表示」→「Aを20に変更」→「Aを10に戻す」という操作を行っています("?"は"PRINT "と等価です)。

また「For i=1 To 5:?i:Next」のような1行のプログラムも直接実行出来ます(この手法は配列変数の内容をまとめて見たい場合に良く使います)。

プログラム中に「Debug.Print A」のような行を挿入しておくと、実行中の変数の内容等を「イミディエイトウインドウ」に残すことが出来ます。

 

手順6)それでは続きを実行するためにF5キーを押して下さい。

「変数Bの値を入力」ダイアログが表示されます。既定値のまま「OK」をクリックして下さい。

 

手順7)右図のようなエラーが表示されるので「デバッグ」ボタンをクリックして下さい。

 

手順8)エラーが発生した行が黄色く反転して中断されるので、そのままエラー箇所を修正(0を2に書き換える)して、F5キーで実行再開します。

 

無事に結果が表示されました。「OK」をクリックすればプログラムは終了です。

 

 

 

 

ステップ3 VBScriptへの移植


今回のプログラムはエクセルの機能を一切使っていませんので、VBScriptに移植して使いましょう。移植といっても先頭の数行を修正するだけです。

 

手順1)メモ帳等のテキストエディタを起動してプログラムを貼り付けます。

 

手順2)下記の通り修正します。

@先頭行の「As AcadRemocon.Body」の部分を消す。

A「Call Main」を2行目に挿入する。

 

手順3)任意の名前(拡張子はvbsにする)を付けて保存すれば移植は完了です。

 

補足)VBAとVBScriptには微妙な違いがあります。私はいつも下記の点に注意してプログラムを作成しています。

 
VBAでは許可されるがVBScriptではエラーになるコード VBScriptでもVBAでも動作するコード 説明
Dim A As String Dim A VBScriptでは型宣言は行えません。
A=Val(B) Set Acad = CreateObject("AcadRemocon.Body")
A=Acad.vbVal(B)
VBScriptにVal関数はありません。CLngやCDbl関数でも代用出来ますが、AcadRemoconのvbValメソッドの方が柔軟性があります。
A=StrConv("AAA",4) Set Acad = CreateObject("AcadRemocon.Body")
A=Acad.
vbStrConv("AAA",4)
VBScriptにStrConv関数はありません。AcadRemoconのvbStrConvメソッドで代用して下さい。

For i=1 To 5

    A(i)=i

Next i

For i=1 To 5

    A(i)=i

Next

VBScriptではNextの後にループ変数を付けるとエラーになります。