如何检查表单视图是否为filterbyform

时间:2016-07-06 14:30:52

标签: forms vba ms-access access-vba

我使用两种形式。此代码所来自的表单显示预约约会的每周摘要:它包含显示每天每个团队的约会计数的文本框,以及每日和每周总计。我用一个函数替换了所有文本框的双击事件。双击文本框时,另一个表单用于显示在该文本框中计算的记录。除非用户已经打开了详细信息表单并且已经通过表单选项选择了过滤器但尚未应用过滤器,否则这一切都很有效。

我检查详细信息表单是否打开,如果没有,那么我用SQL sting打开它以显示计数约会的记录。如果详细信息表单已打开,那么我会检查是否应用了过滤器,将其删除,然后过滤以显示已计算约会的记录。

If CurrentProject.AllForms("MyForm").IsLoaded = False Then 
  DoCmd.OpenForm "MyForm", , mysql
Else
  If Forms("MyForm").FilterOn = True Then Forms("MyForm").FilterOn = False
  Forms("MyForm").Filter = myfil
  Forms("MyForm").FilterOn = True
End If

如何通过表单视图/状态检查详细信息表单是否在过滤器中?如果是,请关闭它。所以我可以应用过滤器来显示计算约会的记录。

2 个答案:

答案 0 :(得分:0)

啊,很好找到Filter事件!

我会在MyForm模块中使用一个公共变量来保存FilterByForm状态,并且可以从外部访问:

Option Compare Database
Option Explicit

Public bFilterByForm As Boolean

FilterApplyFilter事件中进行设置和清除:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)

    ' acShowAllRecords = 0
    ' acApplyFilter = 1
    ' acCloseFilterWindow = 2
    Debug.Print "Form_ApplyFilter: " & ApplyType

    ' I don't think checking for ApplyType is necessary - 
    ' in each case the filter windows is closed.

    ' FilterByForm is finished!
    bFilterByForm = False

End Sub

Private Sub Form_Filter(Cancel As Integer, FilterType As Integer)

    ' acFilterByForm = 0
    ' acFilterAdvanced = 1
    Debug.Print "Form_Filter: " & FilterType

    If FilterType = acFilterByForm Then
        ' FilterByForm is active!
        bFilterByForm = True
    End If

End Sub

并使用此变量,您的调用子可以检查FilterByForm状态:

If Form_MyForm.bFilterByForm Then
    ' FilterByForm is active: close the form!
    DoCmd.Close acForm, "MyForm"
    DoCmd.OpenForm "MyForm", , mysql
End If

答案 1 :(得分:0)

非常感谢Andre给予他所有的帮助,我的最终解决方案主要是他的工作,稍加编辑以允许表格保持开放状态。我将此功能添加到AKA MyForm

的详细信息中
Public Sub RunApplyFilter()
Forms("MyForm").SetFocus
DoCmd.RunCommand acCmdApplyFilterSort
End Sub

最后的检查使用Andre方法来识别MyForm是否在FilterByForm视图中。

If CurrentProject.AllForms("MyForm").IsLoaded = False Then
  DoCmd.OpenForm "MyForm", , mysql
Else 
  If [Form_MyForm].bFilterByForm = True Then Forms("MyForm").RunApplyFilter
  If Forms("MyForm").FilterOn = True Then Forms("MyForm").FilterOn = False
  Forms("MyForm").Filter = myfil
  Forms("MyForm").FilterOn = True
End If

再次感谢Andre。