ログイン    検索  



新しいトピックを投稿する トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
 記事の件名: Visual Basic for Applications(VBA)からZEMAXと通信する方法
 投稿記事 Posted: 2010年2月08日(月) 18:12 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
はじめに

Visual Basic for Applications (VBA) は、現在提供が終了されたVisual Basic 6の改良版です。VBAはMicrosoft Officeシリーズに一般的に使用されているプログラミング言語であり、サードパーティーのアプリケーション
開発者にも、アプリケーションへの取り込みのために追加されたスクリプト言語として使用可能です。
VBAそのものは現在サポートされていませんが、Microsoft Officeで使用されるということは、おそらくこの先長きにわたってZEMAXユーザーも使用するということを意味します。

この記事では、VBAプログラムのサンプルとしてMicrosoft Excelを使いどのようにデータをZEMAXへ、そしてZEMAXから転送するのかをご説明します。エクセルを使用する際の具体的な問題の詳細と共に、コードとシンプルな「hello world」デモをご案内いたします。


トップへ 
   
 
 記事の件名: ZEMAXとExcel間のコミュニケーション
 投稿記事 Posted: 2010年2月08日(月) 18:13 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
ZEMAXとExcel間のコミュニケーション

ZEMAXとエクセルを両方開いてください。エクセル内で Tools > Macro > Visual Basic Editor をクリックしてください。(Excel 2007を使用している場合にVisual Basic Editor を開くにはこちらを参照ください。http://office.microsoft.com/ja-jp/excel/HP100141131041.aspx?pid=CH101001571041#RunMacroShortcut )
添付ファイル:
VBA_01.gif
VBA_01.gif [ 39.59 KiB | 表示回数: 789 回 ]


そして、VBAエディタウィンドウ内で、Insert > Module をクリックしてください。
添付ファイル:
VBA_02.gif
VBA_02.gif [ 17.76 KiB | 表示回数: 788 回 ]


その後、下記のテキストをクリップボードにコピーし、エディタに貼り付けてください。

Function zemax(access As String) As String
Dim ch As Long
Dim s As Variant
Set WordObject = CreateObject("Word.Application")
ch = WordObject.DDEInitiate("Zemax", "anystring")
s = WordObject.DDERequest(ch, access)
WordObject.DDETerminate (ch)
WordObject.Quit
zemax = Left(s, Len(s) - 1)
End Function

エディタは以下のようになります。
添付ファイル:
VBA_03.gif
VBA_03.gif [ 13.99 KiB | 表示回数: 787 回 ]


Visual Basic Editorを閉じてください。エクセルを開き、B3のセルに「GetSerial」を入力し、(かぎ括弧は入力不要ですが、大文字と小文字の区別には気を付けてください。)他のセルに「=ZEMAX(B3)」と入力してください。(かぎ括弧は不要です。)お使いのキーのシリアル番号(下図の番号とは異なります。)が返されます。
添付ファイル:
VBA_04.gif
VBA_04.gif [ 13.45 KiB | 表示回数: 787 回 ]


この作業を行うにはZEMAXが起動している必要があります。このシンプルな関数によって任意のZEMAXエクステンションのデータアイテムをテキスト文字列としてエクセルのセルに入力し、処理のために文字列をZEMAXへ送れるようになります。これは提供されたサンプルエクステンションの「Command Line Interface」に似ています。Command Line InterfaceはVB6プログラムで、エクステンション データアイテムのクエリーアンドレスポンスのプロセスを提供するために設計されたものです。

更なる例として、{zemaxroot}\Samples\Sequential\Objectives\Cooke 40 degree field.zmx のサンプルファイルを開いてください。そして、エクセルでB3のセルを「OpenWindow. Ima」に変えてください。(ここでもかぎ括弧は不要ですが、シンタックスの大文字と小文字は区別します。)そうすると、エクセルは次のようになります。
添付ファイル:
VBA_05.gif
VBA_05.gif [ 11.66 KiB | 表示回数: 788 回 ]


そして、ZEMAX内で新しいウィンドウ、イメージ解析(Image Analysis)ウィンドウが開きます。
添付ファイル:
VBA_06.gif
VBA_06.gif [ 10.86 KiB | 表示回数: 786 回 ]


注意:仮にこれがうまくいかず、エクセルにOKではなくFAILが表示される場合は、ZEMAXで File > Preferencesをクリックし、Editorsタブで「Allow Extensions to Push Lenses」にチェックを入れてください。
添付ファイル:
Hello0.gif
Hello0.gif [ 13.57 KiB | 表示回数: 787 回 ]


そして、再度OpenWindow, Imaコマンドを送ってください。
エクセル(もしくはその他外部プログラム)で現在開いているZEMAXセッションのエディタと解析ウィンドウにおけるデータの変更をされたい場合は、「Allow Extensions To Push Lenses」にチェックを入れる必要があります。この制御は、通常の外部プログラムによってZEMAXユーザーインターフェイスのデータが誤って削除されるのを防ぐために備えられています。


トップへ 
   
 
 記事の件名: DDEとVBA
 投稿記事 Posted: 2010年2月08日(月) 18:21 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
DDEとVBA

VBAはDynamic Data Exchange (DDE)を通じてZEMAXとコミュニケーションをとります。VBAプログラムで他のDDE対応コードを呼び出す一般的な方法は、以下のようになります。(この例はVBAヘルプファイルによるものです。)

channelNumber = Application.DDEInitiate(app:="WinWord", _
topic:="C:\WINWORD\FORMLETR.DOC")
Application.DDEExecute channelNumber, "[FILEPRINT]"
Application.DDETerminate channelNumber


このケースでは、VBAコードはMicrosoft Wordを呼び出しています。下記のコードの一部は

Sub zemax_DDE()
Dim s1 As String
Dim s2 As String
Dim s3 As Variant
Dim ch As Long
s1 = "GetName"
s2 = "anystring"
ch = Application.DDEInitiate("ZEMAX", s2)
s3 = Application.DDERequest(ch, s1) ' Does not work in Excel
Application.DDETerminate ch
End Sub

ZEMAXを呼び出し、現在ロードされているファイル名を取得してそれをs3文字列で保存します。筆者が確認したところ、このコードはMicrosoft ExcelのVBAによって実行されない限り現時点では有効です。エクセルではs3 = Application.DDERequest(ch, s1)の列で「エラー2042」が生じます。この原因は不明ですが、おそらくエクセルに内蔵されたVBAとMicrosoft Officeアプリケーションを含む他のコードのVBAとの間の内部誤差によるものです。これが前ページのコードで「Word.Application」と呼んだ理由です。


エクセルのDDEコードのひとつの不備をこの回避方法で修正すると、ZEMAXとエクセル(およびその他VBAが使用可能なアプリケーション)の間でのデータの移動は円滑で確実となります。


添付ファイル:
Excel_sample.zip [6.35 KiB]
ダウンロード回数: 84 回
トップへ 
   
 
期間内表示:  ソート  
 
新しいトピックを投稿する トピックへ返信する  [ 3 件の記事 ] 


 
トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
cron