質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

ExcelVBA 外部アプリ→起動から入力可能になるまで待機する処理

dewdtm
dewdtm

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

3回答

0評価

0クリップ

14673閲覧

投稿2018/07/11 06:53

いつもお世話になっております。

ExcelVBAにおきまして、外部アプリケーション(Oracle系データベースソフト)の起動からログインまでを自動で処理させたいと思っております。

この文の最後に記述しているコードでは、
アイドル状態になるまで待機するという処理を組んでいるのですが、
起動後、入力フォームが表示されるまで読み込みによるラグがあり、
入力可能になる前にデータが送信されてしまいます。

現在、Sleepにより数秒間の待機時間を設けていますが、
PCのスペックによって読み込み時間が上下するため、ほぼ使い物になりません。

IEなどの場合は、入力可能まで待機させるようなAPIが用意されているようですが、
他の外部アプリでは、そういったAPIは存在しないのでしょうか?
また、存在しない場合、何か別の方法で実現させることは可能でしょうか?
ご教示の程、どうか宜しくお願いいたします。

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
' OpenProcess 関数
Private Declare Function OpenProcess Lib "KERNEL32.DLL" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long _
) As Long

' CloseHandle 関数
Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _
ByVal hObject As Long _
) As Long

' WaitForInputIdle 関数
Private Declare Function WaitForInputIdle Lib "USER32.DLL" ( _
ByVal hProcess As Long, _
ByVal dwMilliseconds As Long _
) As Long

' 定数の定義
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE As Long = &HFFFF

' -------------------------------------------------------------------------------
' プロセスがアイドル状態になるまで指定したミリ秒数待機します。
'
' @Param lProcessId アイドル状態になるまで待機するプロセスの ID。
' @Param [lMilliseconds] アイドル状態になるまで待機する時間。(省略時は無限)
' -------------------------------------------------------------------------------
Public Sub WaitForInputIdleProcess(ByVal lProcessId As Long, Optional ByVal lMilliseconds As Long = INFINITE)
Dim hProcessHandle As Long

lProcessId = CLng(Shell("C:\SCV8CL\ClientPack\ScMen.exe", vbNormalFocus)) ' Process を開いてハンドルを取得する hProcessHandle = OpenProcess(SYNCHRONIZE, 0&, lProcessId) If hProcessHandle <> 0 Then ' アイドル状態になるまで、指定したミリ秒数待機する Call WaitForInputIdle(hProcessHandle, lMilliseconds) ' アイドル状態 Sleep 250 SendKeys "LoginID", True SendKeys "{Enter}" SendKeys "LoginPass", True SendKeys "{Enter}" SendKeys "{Enter}" ' Process のハンドルを閉じる Call CloseHandle(hProcessHandle) End If

End Sub

Sub test()
Dim lProcessId As Long
Call WaitForInputIdleProcess(lProcessId)
End Sub

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。