プログラミング系のネタをまとめていきます。

外部プログラム呼び出し


外部プログラムを呼び出せます。
パラメータを渡したり、実行結果を受け取ったり出来ます。

Exec


Execは実行結果を受け取りたいときに使用します。

Runのように、外部プログラム呼び出し時にそのウィンドウを非表示にする制御は出来ないようです。
Runは表示/非表示等のウィンドウの制御が出来ます。


●外部プログラムを実行し、コンソールに出力される情報を1行ずつ取得してセルに書き込むサンプル。

    Dim wsh, exec As Object
    Set wsh = CreateObject("WScript.Shell")
    
    Dim command As String
    command = "dir /B"
    Set exec = wsh.exec("%ComSpec% /c " + command)
    
    Dim items As Variant
    Dim count As Integer
    count = 0
    
    ' 実行結果を1行ずつ読み込んでセルに出力する
    Dim lineStr As String
    Do Until exec.StdOut.AtEndOfStream
        lineStr = exec.StdOut.ReadLine
        ActiveSheet.Cells(count + 1, 1).value = lineStr
        count = count + 1
    Loop
    
    Set exec = Nothing
    Set wsh = Nothing


●外部プログラムを実行し、処理が全て終わってから標準出力をまとめて取得する

Private Declare Sub Sleep Lib "kernel32" (ByVal waitTime As Long)	' WindowsAPIの宣言。ソース先頭の方で宣言しておく

    Dim wsh, exec As Object
    Set wsh = CreateObject("WScript.Shell")
	
    Dim command As String
    command = "ipconfig"
    Set exec = wsh.exec("%ComSpec% /c " + command)
    
    ' 外部プログラムが終了するまでループする
    Do Until exec.Status
      Sleep 10
    Loop
    
    ' 標準出力をまとめて取得する
    result = exec.StdOut.ReadAll
    
    Set exec = Nothing
    Set wsh = Nothing

参考サイト


MS-DOSコマンドの標準出力を取得する
http://officetanaka.net/excel/vba/tips/tips27.htm

VBAで外部プログラムを非表示で実行するには
※DoEvents は使わずに、Sleep 推奨という話題です。
http://okwave.jp/qa/q8490086.html

WshShellオブジェクトの詳細
http://www.atmarkit.co.jp/ait/articles/0407/08/new...

Windows API:VB6・VBAでの宣言一覧
http://note.phyllo.net/?eid=1106222


マウス座標を取得

フォームのMouseMoveイベントから

マウスカーソルがフォーム上に存在するときにイベントが発生し、座標を取得できます。
フォーム外では取得できません。
デスクトップの左上を(0,0)とした値になります。

' 2次元座標構造体
Private Type POINT
    x As Long
    y As Long
End Type

' API宣言
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINT) As Long

' フォームのMouseMoveイベント
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    Dim p As POINT
    Dim msg As String
    
    ret = GetCursorPos(p)
    msg = "(" & p.x & "," & p.y & ") - (" & x & "," & y & ")"
    LabelMousePos.Caption = msg
End Sub


エラー

構文エラー

Cells.Find

ActiveSheet.Cells.Find("word")    ' これはOK
ActiveSheet.Cells.Find("word", LookIn:=xlValues)    ' 引数を増やすとエラー発生

Dim range As Range
Set range = ActiveSheet.Cells.Find("word", LookIn:=xlValues)    ' 返り値を代入したら解決した

実行時エラー

実行時エラー'1004'

「実行時エラー '1004' : アプリケーションの定義またはオブジェクト定義のエラー」
が発生する原因。
  • セル範囲は複数行、複数列ではダメ。単一の列、行である必要がある。

参考サイト

各種エラーの原因の候補がまとめられています。
http://officetanaka.net/excel/vba/error/execution_...

Menu

メインコンテンツ

プログラミング

機器

Macツール

各種情報

Wiki内検索

おまかせリンク

Androidアプリ

AdSense

技術書


管理人/副管理人のみ編集できます