2017-12-08 25 views
0

簡単な質問では、わかりやすいものが欠けているに違いない。複数の条件がある場合

オープンするウィンドウをポーリングするサブルーチンを作成しようとしていますが、これは2つの条件が満たされている間に実行されるループでこれを達成することを目指しています。 do-while文で

Run time error 13: Type Mismatch

、およびSO上で同様の問題を検索した後、私はまだ私が間違っているの何をかなり確実ではないです:私はエラーを取得しておきます。ここで

が出erroring続け行です:

ループが始まる前に Timerは、現時点では Now()あり、そして HWNDOutが中に発見される私が探しています窓、のハンドルです
Sub FindHWND() 
    Dim HWNDOut as string 
    Dim Timer as Date 
    Timer = Now() 
    'This following line is the one erroring out. 
    Do While ((Now() < Timer + TimeValue("00:00:10")) And (HWNDOut = 0)) 
     HWNDOut = CStr(Hex(FindWindowEx(0&, 0, "SunAwtFrame", "Graph.graphml - yEd"))) 
     Debug.Print HWNDOut 
     Sleep (100) 
    Loop 
    'Other, following sub and code that is not relevant 
End Sub 

ループ。

次のサブルーチンでコマンドが失われるのを防ぐために、このループはすべてサードパーティ製プログラムのウィンドウが開いているかどうかを確認するために100 MSごとに表示されます。

投稿スクリプト:誰かがこれをよりうまくやる方法を提案しているなら、私はすべて耳にします。これは初めてのUIオートメーションを使用しているので、まだ学習しています。 編集:コンテキストのブロックにコードを追加しました。

+0

また、「その他、次のサブコードと関連性のないコード」とは、テストしようとしていた部分を処理していないものすべてをコメントアウトしたことを意味します。このループを直接処理するものだけが現在アクティブです。 – JustinCoplin

+0

'FindWindow'と' FindWindowEx'の違いを見てください。あなたは間違ったものを使用しています。 – ACatInLove

+0

@ACatInLove私はそれをまっすぐにすることができますので、FindWindowクラスとウィンドウ名を指定してルートを検索し、その子を一度に1階層ずつ検索してウィンドウを検索します。 FindWindowExはほとんど同じことを行いますが、提供される親ウィンドウから開始し、後で検索を開始する子を決定することによっていくつかのウィンドウを除外することができます。それは正しいのでしょうか? – JustinCoplin

答えて

2

で:

And (HWNDOut = 0)) 

あなたが数値に文字列を比較している..............これは失敗します。

+0

ありがとうございました。まったくそれでしたが、私はHex値でCStrを使用し、HWNDOutをStringとして使用していたことを完全に忘れました。私はプログラムの中で他のすべてのものをlongとして残し、後でそれらを文字列にします。私はそれを逃したと信じていない。 – JustinCoplin

+0

HWNDOutを宣言し、割り当てられる前にループでテストします。Do Whileループが始まる前に値を代入したいと思うでしょう。これは、最初はゼロにするつもりです。そうでなければ、最初の比較は何も保持していない変数に起こります。 - WWC –

+1

'HWNDOut'が実際に' '0 ''(または任意の数値文字列)である場合、そのコード*はエラーをスローしません - 比較演算の右辺は暗黙的にa文字列、 –

0

変数名のタイマーを変更してみてください。 StartTime(異なるタイプの値を返すVBAのTimer関数があると思うので、予約されているか意味的に意味のある単語を使用しないことをお勧めします)。

幸いかもしれません。

+0

あなたが100%確実であることを確かめてください。 – Maldred

+0

'VBA.DateTime.Timer'は本当に* shadowed *されています。この 'Timer'ローカル変数。これは、そのプロシージャのスコープ内の非修飾のTimer識別子を意味し、ローカル変数を参照し、メンバ式が正しく解決するためには 'VBA.DateTime.Timer'を修飾する必要がありますが、これはOPのものとは全く関係ありません*タイプミスマッチ*エラー。 –

関連する問題