Получение данных формы, элемента управления и свойства из другой базы данных

#ms-access #vba

#ms-access #vba

Вопрос:

Я пытаюсь выяснить, как получить данные формы, элемента управления и свойства из формы Access, которой нет в базе данных Access, с которой я запускаю код. Я понял, как получить данные из базы данных, но я не могу понять, как получить данные из формы за пределами базы данных.

Я подумал, что если бы я установил для внешней базы данных текущую базу данных, мой код работал бы. Однако после выполнения «Для каждого frm в appAccess.Формы», курсор переходит к «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:UsersTyroneDesktopTest14.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
  

Комментарии:

1. Вы смотрели на разницу между CodeDB и CurrentDB , и CodeProject и CurrentProject ? Если ваш код находится в надстройке Access, он может перечислять элементы в себе (codeDB) или в текущей базе данных.

2. Я не рассматривал возможность использования CodeDB и CodeProject. На данный момент я хочу избежать необходимости создавать надстройку. Тем не менее, это хорошая информация для дальнейших исследований.

Ответ №1:

Причина, по которой вам For Each нечего перебирать, заключается в том, что формы в удаленной базе данных не открыты. Согласно документации:

«Свойства коллекции форм в Visual Basic относятся к формам, которые в данный момент открыты».

Попробуйте это:

 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:UsersTyroneDesktopTest14.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