Ms access 使用VBA在Microsoft Access 2010表单中筛选结果

Ms access 使用VBA在Microsoft Access 2010表单中筛选结果,ms-access,vba,Ms Access,Vba,我正在开发一个Access数据库,需要将表格中的记录显示为数据表。我相信我已经正确编写了执行过滤的代码,但不确定如何显示记录 我知道我可以使用查询,然后使用基于这些结果的表单来更轻松地执行此操作,但希望尽可能限制此过程,以减少数据库的总体大小。过滤器将对公司和会计日期进行排序 感谢您的帮助 这是我到目前为止的代码 Option Compare Database Sub Form_Current() Dim oTable As DAO.Recordset Dim oDataNee

我正在开发一个Access数据库,需要将表格中的记录显示为数据表。我相信我已经正确编写了执行过滤的代码,但不确定如何显示记录

我知道我可以使用查询,然后使用基于这些结果的表单来更轻松地执行此操作,但希望尽可能限制此过程,以减少数据库的总体大小。过滤器将对公司和会计日期进行排序

感谢您的帮助

这是我到目前为止的代码

Option Compare Database

Sub Form_Current()
    Dim oTable As DAO.Recordset
    Dim oDataNeedsGas
    Dim dNextFiscal, dThisFiscal
    Dim iGas


'Fiscal Year turnover date, use DateValue(dNextFiscal) comparison.
    dNextFiscal = "10/1/" & Year(Date)
    dThisFiscal = "10/1/" & Year(Date) - 1

    'For Annual training by year comparison.
    'Year(DateValue(oTable!randomdate)) >= Year(Date)

Set oTable = Application.CurrentDb.OpenRecordset("tbl_main", dbOpenDynaset)    
    iGas = 0

Do Until oTable.EOF = True
    If (Year(DateValue(oTable![GasDate])) >= Year(Date) And oTable![Platoon] = "Data") Then
        `What do I do here?!!?
        iGas = iGas + 1
    End If
msgbox iGas

oTable.MoveNext

Loop  

End Sub

我知道过滤是有效的,因为我让它计算匹配的记录,然后显示在消息框中,但我希望能够显示匹配的记录。如何执行此操作?

您可以将子窗体的
记录集
属性设置为oTable。将记录集设置为主窗体的属性,如下面的代码所示,以便在窗体关闭时释放此引用

Option Compare Database
Private oTable As Object

Private Sub Command2_Click()

    Set oTable = Application.CurrentDb.OpenRecordset("tbl_main", dbOpenDynaset)
    Set Me.sbfName.Form.Recordset = oTable
End Sub

Private Sub Form_Close()
    If Not oTable Is Nothing Then
        Set oTable = Nothing
    End If
End Sub
对于您的特定示例,您将基于包含日期条件的SQL语句
OpenRecordset
。我还没有测试它是否是可更新的,因为它是针对表的。(我觉得它是不可更新的。)

这样做是可能的,但我并不是说这是一种推荐的方法。使用
RecordSource
属性过滤其记录要容易得多


我想强调的是,我不会使用子表单的
记录集。使用
记录源
。可以将其设置为SQL语句和/或筛选记录。使用
记录集
属性是有问题的(而且是不必要的)。

将数据表上的RecordSource从空变为空,然后在加载表单时运行此代码:

Option Compare Database

Private Sub Form_Load()
    Dim sSQL as String
    sSQL = "SELECT * FROM tbl_Main "
    sSQL = sSQL & "WHERE Year(DateValue(GasDate)) >= Year(Date) "
    sSQL = sSQL & " AND Platoon = 'Data'"
    Me.RecordSource = sSQL
    MsgBox "RecordCount: " & Me.RecordCount
End Sub
我通常使用表单的RecordSource以及表单筛选器和FilterOn属性。您始终可以加载显示所有记录的表单,然后向下筛选到您想要查看的内容

我不明白你问题中的这句话: “…但希望尽可能限制此过程,以减少数据库的总体大小。”


您是否在尝试提高性能?您是否担心存储太多数据和表变得太大?你问题的那一部分还不清楚。

谢谢,我试试看。在过去,我构建了一个分离信息的查询,然后生成一个表单来显示查询中的内容。不幸的是,他们想让我让这不仅仅是我可以使用的。我们的网络驱动器在空间上受到严重限制;因此,我试图减少数据库的大小,以防止它挤满共享驱动器。