访问VBA - 打开表单/子表单时关闭聚合

时间:2017-08-17 16:59:14

标签: vba access-vba ms-access-2016

我想要做的是,每当用户打开表单(以及默认打开的子表单)时,我想搜索表单上的所有列(控件?),检查是否它们当前设置为使用Access'内置Totals行聚合(总和,计数等),如果是,则将它们设置为不聚合。

这样做的原因是存储了数百万条记录,所以当有人查询到3-4并打开Sum时,然后关闭它,当下一个人打开它时,它会尝试汇总数百万个数字和冻结。表单显示来自通过SQL填充的表的查询结果(我想,如果该句子有意义)。这是我到目前为止所做的:

a = tf.Variable(current_states_outputs)
b = tf.Variable(current_actions)
out = tf.squeeze(tf.gather_nd(a,tf.stack([tf.range(b.shape[0])[...,tf.newaxis], b[...,tf.newaxis]], axis=2)))
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
sess.run(out)

#output
[1, 6, 8]

我在Access VBA方面没有那么多经验(通常在Excel VBA中工作)所以请原谅我,如果我完全不在这里。命令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才会直接崩溃。

我在语法上尝试了很多变化但没有成功,我也试过循环遍历文件的其他元素(tabledefs,querydefs,recordsets等)以及看看我是否正在尝试更改错误的值,但是当我搜索具有AggregateType属性的元素时,此子表单上的控件是整个.mdb文件中的唯一内容。

我用con.Properties("AggregateType").Value = -1切换出错误的行,我可以检查,除了-1之外什么也没有返回任何东西,手动启用某些列中的聚合,并让它返回正确的结果(0表示总和为例如),所以我认为我正在寻找合适的地方,只是错过了一些关键因素。

我一直在研究这项工作几周但没有成功。任何方式来修复我所拥有的或指向正确的方向将非常感激!

1 个答案:

答案 0 :(得分:1)

  

这不一定是答案,但我没有足够的声誉   发表评论&#34; ...

我尝试过您的方案并且已验证可以更改属性值,但是我没有遍历所有控件,只是在列上使用onDoubleClick事件进行模拟。

我建议尝试使用Form_Open或Form_Current来触发你的sub,以查看在出于某种原因调用代码后属性是否重置。

<强>更新

您正在引用&#34;子表单&#34;主表单的对象:

Set frm = Forms!UserAPX!UserApxSub.Form!

尝试明确引用实际的UserApxSub FORM。

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