【问题标题】:Obtain Form, Control and Property Data from a Different Database从不同的数据库中获取表单、控件和属性数据
【发布时间】:2016-10-01 00:22:26
【问题描述】:

我试图弄清楚如何从不在我开始编写代码的 Access 数据库中的 Access 表单中获取表单、控件和属性数据。我已经弄清楚如何从数据库中获取数据,但我不知道如何从数据库外部的表单中获取数据。

我认为如果我将外部数据库设置为当前数据库,我的代码就可以工作。但是,在执行“For Each frm In appAccess.Forms”后,光标会转到“End Sub”。

我尝试使用容器并且能够返回表单名称,但我无法弄清楚如何循环访问控件和属性集合。

下面是与我的第一个想法相关的代码。我的最终目标是能够将表单数据保存在不同的数据库中。我的代码是否存在小错误,或者我应该使用其他方法来获取数据?

Sub GetControlForm()
Dim strPath As String
Dim frm As Form
Dim ctrl As Control
Dim prop As Property

Dim appAccess As New Access.Application
Dim dbs As DAO.Database

strPath = "C:\Users\Tyrone\Desktop\Test14.accdb"
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase (strPath)

'MsgBox appAccess.CurrentDb.Name
For Each frm In appAccess.Forms
    MsgBox frm.Name

    For Each ctrl In frm.Controls
        MsgBox ctrl.Name
        MsgBox ctrl.ControlType.TypeName
        MsgBox TypeName(ctrl)

        For Each prop In ctrl.Properties
             If prop.Name = "RowSource" Then
                MsgBox "stop it"
             End If
            If (TypeName(ctrl) = "ComboBox" Or TypeName(ctrl) = "TextBox") And (prop.Name = "RowSource" Or prop.Name = "ControlSource") Then
                MsgBox prop.Value
            End If
        Next prop
    Next ctrl
Next frm

End Sub

【问题讨论】:

  • 你看过CodeDBCurrentDBCodeProjectCurrentProject之间的区别吗?如果您的代码在 Access 加载项中,它可以枚举项目本身(codeDB)或当前数据库。
  • 我没有考虑过使用 CodeDB 和 CodeProject。到目前为止,我想避免创建加载项。但是,这是进一步研究的好信息。

标签: ms-access vba


【解决方案1】:

您的For Each 没有任何内容可循环的原因是远程数据库中的表单未打开。根据documentation

"Visual Basic 中 Forms 集合的属性指的是表单 目前已开放。”


试试这个:

Sub GetControlForm()

    Dim strPath As String
    Dim obj As AccessObject
    Dim frm As Form
    Dim ctrl As Control
    Dim prop As Property

    Dim appAccess As New Access.Application
    Dim dbs As DAO.Database

    strPath = "C:\Users\Tyrone\Desktop\Test14.accdb"
    Set appAccess = CreateObject("Access.Application")
    appAccess.OpenCurrentDatabase (strPath)

    'MsgBox appAccess.CurrentDb.Name
    For Each obj In appAccess.CurrentProject.AllForms

        appAccess.DoCmd.OpenForm obj.Name
        Set frm = appAccess.Forms(obj.Name)

        MsgBox frm.Name

        For Each ctrl In frm.Controls
            MsgBox ctrl.Name
            'MsgBox ctrl.ControlType.TypeName
            MsgBox TypeName(ctrl)

            For Each prop In ctrl.Properties
                 If prop.Name = "RowSource" Then
                    MsgBox "stop it"
                 End If
                If (TypeName(ctrl) = "ComboBox" Or TypeName(ctrl) = "TextBox") And (prop.Name = "RowSource" Or prop.Name = "ControlSource") Then
                    MsgBox prop.Value
                End If
            Next prop
        Next ctrl

        appAccess.DoCmd.Close acForm, frm.Name
    Next obj

    Set frm = Nothing
    appAccess.CloseCurrentDatabase
    Set appAccess = Nothing
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多