从 Excel VBA 的 MS Access 表单中获取价值

Posted

技术标签:

【中文标题】从 Excel VBA 的 MS Access 表单中获取价值【英文标题】:Getting Value from MS Access form from Excel VBA 【发布时间】:2009-03-27 18:41:01 【问题描述】:

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

我的意思是有办法检查 MS Access 应用程序是否正在运行,如果是,则检查某个表单是否打开,然后从该表单的文本框字段中获取值。

类似

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

【问题讨论】:

您可能想添加示例,更多细节以获得更好的答案。 我不会把它放在答案中,因为它并没有真正回答提出的问题,但这听起来像是一个非常糟糕的想法。我的建议是找到一种更好的方法来处理你想做的任何事情。如果您提供更多详细信息,我会尝试提供有关更好方法的建议。 【参考方案1】:

这是一些示例代码。

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

【讨论】:

谢谢,这正是我想要的。【参考方案2】:

如果表单未打开,@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 中测试过,但你明白了)

【讨论】:

以上是关于从 Excel VBA 的 MS Access 表单中获取价值的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA:创建具有多个工作表的 Excel 工作簿

带有空格和范围的 MS Access VBA acImport 工作表名称

使用 VBA 将 MS Access 记录集导出到 Excel 中的多个工作表/选项卡会生成只读文件

VBA Excel - 从 MS Access 将列名保存到电子表格

从 Excel VBA 的 MS Access 表单中获取价值

MS Access导出联合查询到Excel,VBA问题