2017-12-08 5 views
0

Einfache Frage, ich muss nur etwas offensichtlich fehlen.Machen Sie mit mehreren Bedingungen

Ich versuche eine Subroutine zu erstellen, die fragt, ob ein Fenster geöffnet ist, und ich möchte dies mit einer Schleife erreichen, die ausgeführt wird, während zwei Bedingungen erfüllt sind. Ich erhalte eine Fehlermeldung:

Run time error 13: Type Mismatch

Auf dem Do While-Schleife, und nach auf SO noch durch die ähnlichen Probleme der Suche Ich bin nicht ganz sicher, was ich falsch mache.

Hier ist die Linie, die erroring heraus hält:

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 

Wo Timer die Now() im Moment ist, bevor die Schleife beginnt, und HWNDOut ist der Griff für das Fenster ich suche, die gefunden wird die Schleife.

All diese Schleife sieht alle 100 MS aus, um zu sehen, ob das Fenster zu einem Drittanbieterprogramm geöffnet wurde, um den Verlust von Befehlen in den nächsten Unterprogrammen zu verhindern.

Post Script: Wenn jemand irgendwelche Vorschläge hat, wie man das besser macht, bin ich ganz Ohr. Dies ist das erste Mal, dass ich die UI-Automatisierung nutze, damit ich noch lerne. Edit: Hinzugefügt mehr Code für den Kontext für den Kontext.

+0

Auch durch "Andere, folgende Sub-und Code, der nicht relevant ist" ich meine, dass ich alles auskommentiert, die nicht mit dem Teil, der ich versuchte zu testen, nicht behandelt. Nur das Zeug, das direkt mit dieser Schleife beschäftigt ist, ist gerade aktiv. – JustinCoplin

+0

Schauen Sie in der Hilfe auf den Unterschied zwischen 'FindWindow' und' FindWindowEx'. Du benutzt den falschen. – ACatInLove

+0

@ACatInLove Nur so kann ich sicherstellen, dass ich es gerade habe, FindWindow Sucht nach einem Fenster mit dem angegebenen Klassen- und Fensternamen, beginnend bei der Wurzel und durchsucht seine Kinder Schicht für Schicht. FindWindowEx macht fast dasselbe, aber es beginnt mit dem bereitgestellten Elternfenster und ermöglicht es Ihnen, einige Fenster auszuschließen, indem Sie bestimmen, mit welchem ​​Kind Sie die Suche beginnen. Ist das in Ordnung? – JustinCoplin

Antwort

2

mit:

And (HWNDOut = 0)) 

Sie vergleichen eine String auf einen numerischen Wert .............. dies fehlschlagen.

+0

Danke Mann, das war es total, ich habe komplett vergessen, dass ich CStr auf den Hex-Wert verwendet und hatte HWNDOut als String. Ich habe alle anderen so lange im Programm gelassen und mache sie später zu Strings. Ich kann nicht glauben, dass ich das verpasst habe. – JustinCoplin

+0

Sie deklarieren HWNDOut und testen es in der Schleife, bevor es zugewiesen wird.Sie sollten ihm einen Wert zuweisen, bevor die Do While-Schleife startet. Oder der erste Vergleich findet statt mit einer Variablen, die nichts enthält. - WWC –

+1

Bemerkenswert ist, dass, wenn 'HWNDOut' tatsächlich '" 0 "' (oder irgendeine numerische Zeichenkette) ist, dieser Code * keinen Fehler auslöst - die rechte Seite der Vergleichsoperation wird implizit in a konvertiert Schnur, –

0

Versuchen Sie den Variablennamen Timer auf etwas anderes zu ändern, z. StartTime (denke, es gibt eine Timer-Funktion in VBA, die einen Wert eines anderen Typs zurückgibt; also am besten keine Wörter verwenden, die reserviert oder semantisch signifikant sind).

Könnte helfen, vielleicht nicht, viel Glück.

+0

"Vielleicht helfen, vielleicht nicht, viel Glück. *" - Ist nicht wirklich eine definitive Antwort, bevor Sie eine Antwort posten, seien Sie sicher, dass Sie 100% sicher sind – Maldred

+0

'VBA.DateTime.Timer' wird tatsächlich * shadowed * durch diese 'Timer'-lokale Variable. Dies bedeutet, dass ein unqualifizierter "Timer" -Kennzeichner im Gültigkeitsbereich dieser Prozedur auf die lokale Variable verweist und "VBA.DateTime.Timer" muss qualifiziert werden, damit ein Member-Ausdruck korrekt aufgelöst wird - aber das ist völlig unabhängig von OPs * Typ nicht übereinstimmend * Fehler. –