2009-03-27 18 views
1

Was ist der beste Weg zu überprüfen, ist das Formular geöffnet ist und den Wert der Textbox mit Excel VBA.Wert von MS Access Formular aus Excel VBA

Ich meine, gibt es eine Möglichkeit zu überprüfen, ob MS Access-Anwendung ausgeführt wird, und wenn es dann überprüfen, dass bestimmte Formular geöffnet ist, dann erhalten Sie den Wert aus dem Textfeld dieses Formulars.

So etwas wie

If MSAccess.([Application name]).Forms("FormName").isOpen then 
    MyVar = MSAccess.([Application name]).Forms("FormName")![PO Number] 
    end if 
+0

Sie können Beispiele hinzufügen, mehr Details, um eine bessere Antwort zu erhalten. –

+0

Ich werde das nicht in eine Antwort setzen, da es die gestellte Frage nicht wirklich beantwortet, aber das riecht nach einer sehr schlechten Idee in der Herstellung. Mein Rat wäre, einen besseren Weg zu finden, was auch immer Sie anstreben. Wenn Sie weitere Einzelheiten angeben, werde ich versuchen, Ihnen einen besseren Ansatz zu geben. – JohnFx

Antwort

1

Hier ist ein Beispielcode.

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Public Declare Function ShowWindow Lib "user32" _ 
    (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 

Public Const SW_SHOW = 5 
Public Const GW_HWNDNEXT = 2 

Sub FindAccess() 
Dim WinHandle As Long 
Dim objAc As Object 

'Form title' 
FindWindow vbNullString, "Images" 

'use it' 
ShowWindow WinHandle, SW_SHOW 

'to get the application' 
Set objAc = GetObject(, "Access.Application") 

'and print a control's value' 
Debug.Print objAc.Forms("frmImages").Controls("Description") 

Set objAc = Nothing 
End Sub 
+0

Danke das ist genau das, was ich wollte. – THEn

1

@ Remou's Debug.Print wird Fehler aus, wenn das Formular nicht geöffnet ist.

Die meisten Access Entwickler importieren eine IsLoaded() Funktion in ihre Datenbank und benutzen sie. Der Code in meiner Version davon (das kann oder nicht von der ursprünglichen MS Version bearbeitet werden kann), ist dies:

Function IsLoaded(ByVal strFormName As String) As Boolean 
    ' Returns True if the specified form is open in Form view or Datasheet view. 
    Const conObjStateClosed = 0 
    Const conDesignView = 0 

    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then 
     If Forms(strFormName).CurrentView <> conDesignView Then 
      IsLoaded = True 
     End If 
    End If 
    End Function 

zu verwenden, die aus Excel, können Sie es so umschreiben könnten:

Function IsLoaded(ByVal strFormName As String, objAccess As Object) As Boolean 
    ' Returns True if the specified form is open in Form view or Datasheet view. 
    Const conObjStateClosed = 0 
    Const conDesignView = 0 
    Const acSysCmdGetObjectState = 10 
    Const acForm = 2 

    If objAccess.SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then 
     If objAccess.Forms(strFormName).CurrentView <> conDesignView Then 
      IsLoaded = True 
     End If 
    End If 
    End Function 

(Ich habe das nicht aus Excel getestet, aber Sie bekommen die Idee)