Fenster mit ENTER bestätigen

Moin moin,

folgendes Problem in Excel VBA:

Ich rufe von eine API-Funktion auf, die dann ein Fenster anzeigt. Dieses Fenster möchte ich gern einfach mit Enter bestätigen. Mit Sendkeys geht es nicht, da der Code ja erst dann weiter ausgeführt wird, wenn das Fenster geschlossen wird und somit die API-Funktion beendet ist. Folgender Code (HypOpenForm ist die angesprochene API Funktion):

Sub Sheets_Create()

Dim vtDims() As Variant
Dim vtMembers() As Variant
Dim shSheet As Worksheet
Dim shPrefs As Worksheet
Dim szConn, szPath, szForm, szEnt As String

Set shPrefs = ThisWorkbook.Sheets(„Settings“)

szConn = shPrefs.Cells(2, 2).Value
szPath = shPrefs.Cells(3, 2).Value
szForm = shPrefs.Cells(4, 2).Value

i = 10
Do

szEnt = shPrefs.Cells(i, 1).Value

Set shSheet = ThisWorkbook.Sheets.Add(after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
shSheet.Name = szEnt

ret& = HypSetActiveConnection(szConn)

ret& = HypOpenForm(shSheet.Name, szPath, szForm, vtDims, vtMembers)

ret& = HypSetPOV(shSheet.Name, „Entity#“ & szEnt)

ret& = HypMenuVRefresh()

i = i + 1

Loop Until shPrefs.Cells(i, 1).Value = „“

End Sub

zumindest bei normalen forms kann man ja den fokus bestimmen. geht sowas hier nicht auch? meist wird sowas in irgendeiner form unterstützt…

Ich rufe von eine API-Funktion auf, die dann ein Fenster
anzeigt. Dieses Fenster möchte ich gern einfach mit Enter
bestätigen. Mit Sendkeys geht es nicht, da der Code ja erst
dann weiter ausgeführt wird, wenn das Fenster geschlossen wird
und somit die API-Funktion beendet ist. Folgender Code
(HypOpenForm ist die angesprochene API Funktion):

Hallo Tyranny,

benutze bitte beim Zeigen von Code den pre-Tag.
Zu deinem Code.
Du benutzt kein Option Explicit, benutz das bitte.
dann merkst du daß du zwei Variablen nicht deklariert hast.

szConn, szPath, szForm, hast du als Variant deklariert und nicht als String wenn du das glauben solltest.

Vielleicht wollen müssen deinen Code nachbauen und aufrufen um an der Form zu üben, warum fehlen die 4 API Deklarationen?

szConn = shPrefs.Cells(2, 2).Valueon
szConn = shPrefs.Cells(2, 2).Value
hab ich nix weil ich nicht weiß was du da drin stehen hast, schreib das doch absolut in den Code.

Gruß
Reinhard

Ja mit den Deklarationen ist mir bewusst, sollte auch nur ein kleiner Test werden … aber danke für den Hinweis.

Die API Deklarationen sind in einem extra Modul. Und nachbauen wird schwer, da dir da die Installation der bestimmten Software (Oracle HFM) fehlt. Deswegen würde es bei dir eh nicht laufen.

Aber eigentlich ist die Frage auch unabhängig davon: API ruft Fenster auf und solang das Fenster offen ist, läuft der Code nicht weiter, weswegen ein Sendkeys nicht funktioniert!

Vielleicht fällt euch noch was ein?? :wink:

Hallo Tyranny,

Ja mit den Deklarationen ist mir bewusst, sollte auch nur ein
kleiner Test werden … aber danke für den Hinweis.

gerne. Wenn du das alles selbst weißt, alles klar, aber es gibt ja Mitleser…

Die API Deklarationen sind in einem extra Modul. Und nachbauen
wird schwer, da dir da die Installation der bestimmten
Software (Oracle HFM) fehlt. Deswegen würde es bei dir eh
nicht laufen.

Dass ist für mich schlecht, wenn ich was nicht selbst testen kann bzw. meine ideen direkt daran ausprobieren kann, das ist nicht so ein Ding bzw. hab zuwenig Ahnung bzw. Overlooking :smile:

Aber eigentlich ist die Frage auch unabhängig davon: API ruft
Fenster auf und solang das Fenster offen ist, läuft der Code
nicht weiter, weswegen ein Sendkeys nicht funktioniert!

Okay.
Also die Form wird angezeigt, der Code stoppt solange.
Hat die Form ein handle?
Z.B. eine Standard Vba-Msgbox hat keins deshalb kann man die auch nicht mit API schließen o.ä.

Dann, Versuch macht kluuuch wenn man nix weiß wie ich, wie wäre es du rufst vor der Formerstelleung im Code eine zweite Instanz von Excel auf die eine andere mappe startet?

In Workbooky_Open der anderen Mappe dann gleich eine Schleife starten
die alle odffenen Fenster durchpflügt, die Form findet und dann Sendkeys schickt.
Entweder Vba Sendkeys oder API sendkeys (da gibts das auch)

Oder die andere mappe kann dann auf die Form zugreifen wie der andere Antworter schrieb.

Und die andere mappe muß ja gar nicht eine Excelmappe sein, kann auch ein Wordocument sein.
Ich sage das deshalb, wenn ich zwei Excel-Instanzen starte so geht das schon, aber es kommt dann eine Fehlermeldung daß personl.xls schon in Benutzung ist usw., nicht schlimm aber ggfs. störend
Deshalb die Idee mit Word.

Oder aber, zweite Instanz weglassend, im Code eine zeitschleife einbauen die mit API-„sleep“ alle x Sekunden prüft ob da diese Form existiert, ggfs ob die voll geladen ist und dann halt reagieren.

Gruß
Reinhard

Hallo,

also danke erstmal für deine Unterstützung.
Ich habe jetzt einen anderen Weg gefunden: Timer-Objekt gibts ja so in VBA net, aber dafür APIs :smile:

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

Private lngTimerID As Long
Private blnTimer As Boolean

Public iCounter As Integer

Private Sub CallbackProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)

 SendKeys "{ENTER}"

End Sub

Public Sub StartTimer()

 If Not blnTimer Then
 lngTimerID = SetTimer(0, 0, 5000, AddressOf CallbackProc)

 If lngTimerID = 0 Then
 MsgBox "Fehler!"
 Exit Sub
 End If

 blnTimer = True

 End If

End Sub

Public Sub StopTimer()

 If blnTimer Then
 lngTimerID = KillTimer(0, lngTimerID)

 If lngTimerID = 0 Then
 MsgBox "Fehler!"
 End If

 blnTimer = False

 End If

End Sub

Sub Sheets\_Create()

 Dim vtDims() As Variant
 Dim vtMembers() As Variant
 Dim shSheet As Worksheet
 Dim shPrefs As Worksheet
 Dim szConn, szPath, szForm, szEnt As String


 Application.ScreenUpdating = False


 Set shPrefs = ThisWorkbook.Sheets("Settings")

 szConn = shPrefs.Cells(2, 2).Value
 szPath = shPrefs.Cells(3, 2).Value
 szForm = shPrefs.Cells(4, 2).Value

 i = 10
 Do

 szEnt = shPrefs.Cells(i, 1).Value

 Set shSheet = ThisWorkbook.Sheets.Add(after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
 shSheet.Name = szEnt

 ret& = HypSetActiveConnection(szConn)

 Call StartTimer

 ret& = HypOpenForm(shSheet.Name, szPath, szForm, vtDims, vtMembers)

 Call StopTimer

 ret& = HypSetPOV(shSheet.Name, "Entity#" & szEnt)

 ret& = HypMenuVRefresh()

 i = i + 1

 Loop Until shPrefs.Cells(i, 1).Value = ""

 shPrefs.Activate
 MsgBox "Es wurden " & i - 10 & " Sheets erzeugt!", vbInformation


 Application.ScreenUpdating = True


End Sub