4

私は現在、職場でのプロセスの簡素化に取り組んでいます。これには、シリアル接続を使用してデータを送信するChatillon DFISForceMeterが含まれます。データはテキストとしてChattillonプログラムに送信され、.datファイルとしてのみ保存できます。プログラムを自動的に開き、さまざまなコマンドを使用して情報をExcelに直接入力できるExcelブックを設定しようとしています。コマンドには、単位の変更、センサーのゼロ調整、および送信が含まれます。

いくつか調べてみたところ、シェル機能を使用するとファイルを開くことができ、ファイルを制御できるはずですが、Excelを使用してプログラムを呼び出して操作する方法が見つかりませんでした。

Chatillonプログラム、基本的にマウスでクリックするボタン

4

1 に答える 1

9

Excel と VBAは、COM インターフェイスを備えている場合、つまり、アプリケーションをオブジェクトとして宣言し、オブジェクトのインスタンスを作成し、そのメソッドと属性を確認できる場合、外部アプリケーションを制御できます。

プログラムの COM ラッパーを入手できる可能性がある場合は、そのようにしてください。

それができない場合... I/O ストリームと Windows シェル オブジェクトを使用してそれを行うのは楽しくありません。コマンドライン DOS インターフェイスはユーザー インターフェイスとしては特に使いやすくなく、環境でのブレイクダンスよりも不安定だからです。それらを VBA で API として使用しようとすると、ペストリー ファクトリになります。

まず、Windows スクリプト ホスト オブジェクト モデルによって公開される 'WshShell' オブジェクトが必要です。次のように、遅延バインディングによって宣言およびインスタンス化できます。


Dim objWshell As Object
Set objWshell = CreateObject("WScript.Shell")
ただし、正しい方法 (プロパティとメソッドの Intellisense ドロップダウンが表示されます) は、[ツール:参照...] ダイアログを使用して、通常は C:\Windows にある親ライブラリへの参照を作成することです。 \System32\wshom.ocx

次に、Shell オブジェクトを次のように宣言できます。


Dim objWshell As IWshRuntimeLibrary.WshShell
Set objWshell = New IWshRuntimeLibrary.WshShell

コマンドライン実行可能ファイルを実行し、VBA で I/O ストリームを読み取る

:

これは、コマンド ウィンドウを開いてコマンド ライン実行可能ファイルを実行し、コマンド ライン スイッチ '-s' と二重引用符で囲まれたパラメーターを入力する例です。

私が実行している実行可能ファイルは「regsvr32.exe」ではないことに注意してください。私のシェル オブジェクトは cmd.exe を実行しており、それが I/O ストリームのソースとシンクです。

もちろん、アプリケーションを直接実行することもできます。それはうまくいくかもしれません。しかし、.StdOut.ReadLine または .StdOut.ReadAll を呼び出すときに、出力ストリームが呼び出し元の関数とその VBA スレッドをロックまたは「ハング」することは非常に一般的です。


With objWshell.Exec("CMD /K")

  

       .StdIn.WriteBlankLines 3

    .StdIn.WriteLine "C:"

    .StdIn.WriteLine "CD C:\"

 

    .StdIn.WriteLine "regsvr32.exe -s " & Chr(34) & "%LIBDIR%\FXPricer.dll" & Chr(34)

    .StdIn.WriteBlankLines 1

 

    Do Until .StdOut.AtEndOfStream

        Debug.Print .StdOut.ReadLine

    Loop


     Do Until .StdErr.AtEndOfStream

        Debug.Print .StdOut.ReadLine

    Loop


    .Terminate


End With
共有してお楽しみください。また、いつものように、ブラウザ (または StackOverflow のテキスト ボックス インターフェイス) によってソース コード サンプルに挿入された改行に注意してください。

于 2012-09-14T12:20:46.837 に答える