从Excel VBA获取MS Access表单的值

最好的方法是检查访问表单是否打开,并使用Excel VBA获取文本框的值。

我的意思是有一种方法来检查如果MS Access应用程序正在运行,如果它然后检查某些表单打开,然后从该窗体的文本框字段中获取值。

就像是

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

这里是一些示例代码。

 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 

如果表单未打开,@ Remou的Debug.Print将会出错。

大多数Access开发人员将IsLoaded()函数导入其数据库并使用它。 我的版本中的代码(可能是也可能不是从原始MS版本编辑)是这样的:

  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 

要从Excel中使用,你可以重写它:

  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 

(我没有从Excel中testing,但你明白了)