Access VBA - отключить агрегацию при открытии формы / подформы
То, что я пытаюсь сделать, это то, что когда пользователь открывает форму (и форму, которая открывается по умолчанию), я хочу выполнить поиск по всем столбцам (элементам управления?) В форме, проверить, есть ли они в данный момент. установить агрегирование (сумма, количество и т. д.) со строкой "Итоги" в Access, и, если это так, установить их не агрегирование.
Причина этого заключается в том, что хранится несколько миллионов записей, поэтому, когда кто-то запрашивает его до 3-4 и включает Sum, затем закрывает его, когда следующий человек открывает его, он пытается суммировать миллионы чисел и замораживает, Форма отображает запрошенные результаты из таблицы, которая заполняется с помощью SQL (я думаю, если это предложение имеет смысл). Вот что у меня так далеко:
Private Sub Form_Load()
'this form_load is in the UserApxSub sub-form, for reference
Call De_Aggregate
End Sub
Private Sub De_Aggregate()
Dim frm As Form, con As Control
Set frm = Forms!UserAPX!UserApxSub.Form!
For Each con In frm.Controls
If con.ControlType = acTextBox Then
If con.Properties("AggregateType").Value <> -1 Then
'crashes on following line
con.Properties("AggregateType").Value = -1
End If
End If
Next con
End Sub
У меня не так много опыта в Access VBA (как правило, работа в Excel VBA), поэтому, пожалуйста, прости меня, если я полностью не в курсе. Команда con.Properties("AggregateType").Value = -1
не выдает ошибку, но Access просто сбой при прямом достижении этой линии специально.
Я попробовал несколько вариантов синтаксиса, но безуспешно, и я также попытался пройтись по другим элементам файла (tabledefs, querydefs, наборы записей и т. Д.), А также посмотреть, пытаюсь ли я изменить неверное значение, но элементы управления в этой подчиненной форме - единственные элементы во всем файле.mdb, которые появляются, когда я ищу элементы со свойством AggregateType.
Я выключил строку, что ошибки с Debug.Print con.Name & " - " & con.Properties("AggregateType").Value
и я могу проверить, ничего не вернуть ничего, кроме -1, включить агрегацию в некотором столбце вручную, и заставить его вернуть правильный результат (например, 0 для суммы), так что я думаю, что я смотрю в нужном месте, просто отсутствует какой-то ключевой фактор.
Я работал над этим пару недель безуспешно. Буду очень признателен за любой способ исправить то, что у меня есть, или указать мне правильное направление!
1 ответ
Это не обязательно ответ, но у меня недостаточно репутации, чтобы дать "комментарий"...
Я попробовал ваш сценарий и подтвердил, что может изменить значение свойства, как вы, однако я не прошел через все элементы управления и просто использовал событие onDoubleClick для столбца для имитации.
Я бы посоветовал попытаться запустить вашу подпрограмму с помощью Form_Open или Form_Current, чтобы узнать, сбрасывается ли свойство после того, как ваш код был вызван по какой-то причине.
ОБНОВИТЬ:
Вы ссылаетесь на объект "Subform" вашей основной формы:
Set frm = Forms!UserAPX!UserApxSub.Form!
Попробуйте сослаться на фактический UserApxSub
ФОРМА явно.
Что-то вроде Set frm = Forms!UserApxSub!
(при условии, что UserApxSub - это имя формы)
затем придерживаться Form_Open
вашей основной формы:
Private Sub Form_Open(Cancel As Integer)
'// the following would set a single control only. You can add your loop through all controls
Me!{your control name}.Properties("AggregateType").Value = -1 '// set control in your main form
Form_UserApxSub!{your control name}.Properties("AggregateType").Value = -1 '// set control in your "sub" form
End Sub