#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