Vba 如何收听排序顺序更改事件

Vba 如何收听排序顺序更改事件,vba,ms-access,Vba,Ms Access,我有一个配置为在数据表视图中启动的Microsoft Access数据库表单(Default view=datasheet)。我想在VBA中注册一个事件处理程序,这样每当有人更改数据表视图的排序顺序(ORDERBY)时,就会通知我的代码 我已经尝试为Form\u ApplyFilter事件构建一个事件处理程序,每当排序顺序发生更改时,该事件就会触发,但在事件处理程序中,Form.OrderBy似乎没有用新值更新,这意味着我无法对排序顺序的更改采取行动。以下是我的实际方法: Private Sub

我有一个配置为在数据表视图中启动的Microsoft Access数据库表单(
Default view=datasheet
)。我想在VBA中注册一个事件处理程序,这样每当有人更改数据表视图的排序顺序(ORDERBY)时,就会通知我的代码

我已经尝试为
Form\u ApplyFilter
事件构建一个事件处理程序,每当排序顺序发生更改时,该事件就会触发,但在事件处理程序中,
Form.OrderBy
似乎没有用新值更新,这意味着我无法对排序顺序的更改采取行动。以下是我的实际方法:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    ' If this is an event that could cause the sort to change, make sure that the TransactionId is taken into consideration
    ' Interestingly, this event fires whenever someone filters OR SORTS the datasheet view.
    If ApplyType = acApplyFilter Or ApplyType = acFilterByForm Or ApplyType = acShowAllRecords Then
        Debug.Print "OrderBy: " & Me.OrderBy
        ' Argh! OrderBy is still the previous value, not the new one the user just set!
    End If
End Sub
当有人更改排序顺序时,如何使我的VBA代码得到通知

一些背景 我们有一个包含日期的数据集,我们希望允许用户在该日期之前订购(例如,首先查看最新的行)。但是,此日期字段没有唯一的约束,并且有时有多行具有相同的日期。在这些情况下,Access通过返回自然顺序打破了这种联系,在本例中,自然顺序恰好是主键id。但是,这会让用户感到厌烦,因为他们按从最早到最新的顺序输入数据,然后按从最新到最早的顺序查看数据,并看到一些行“无序”,因为它们具有相同的日期,并且在该组中按id升序排列。我试图以编程方式添加一个
orderbyiddesc
子句,当它们按日期排序时,首先显示最新的行,这样它们就可以按从最新到最旧的顺序查看行


我知道使用表单进行此操作也有点不标准,正如您可能认为的查询一样,但我们需要视图保持可编辑状态,并且视图包含计算字段,因此,我们的解决方案是使用一个表单,以便我们可以为可编辑字段和计算字段配置不同的数据源,从而使可编辑字段保持可编辑状态。

我测试了代码,并打印了修改后的订单标准。用户如何使用功能区工具应用排序或筛选?这就是我测试的。此外,当关闭表单时,我看到它已将修改后的订单条件保存在OrderBy属性中。我还测试了右键单击菜单和相同的结果。我不能复制这个问题。@June7的复制对我来说也是偶然的,所以也许我使用的开发工具是错误的?起初,事件似乎为我提供了正确的
OrderBy
值,但如果我在Access VBA编辑器中更改了方法(并保存),然后重新启动表单,现在不会反映
OrderBy
值。这是正常的/预期的吗?具体是什么变化?似乎并不是所有细节都有问题。“以编程方式添加ORDER BY Id DESC子句”的代码是什么?@June7逐字添加调试语句,例如
debug.Print(“OrderBy:&Me.OrderBy)
,因为该方法的第一行将导致报告的
OrderBy
值不正确。感谢您的评论,我很确定这只是Access的VBA编辑器的一个怪癖。如果你写一个答案,指出我的实现实际上是正确的,我会接受它。