本文将说明如何在当前应用程序中搜索指定的字符串。
并非经常,但有时我需要更改字段名称,以使其更有意义,这通常是因为我需要添加一个额外的字段,而对于新字段,可能会含糊不清每个字段。
因此,我编写了一些简单的代码,这些代码将检查(而不是自动更正)您的QueryDefs,即表单和报表中控件的控件源。
请注意,存储的查询(例如记录源窗体或组合框行源)存储在QueryDefs集合中,因此包含在此搜索中。
实现方式:我将其创建为三个独立的函数,一个用于查询,一个用于表单,一个用于报表,以及一个将这三个功能结合使用的函数。 功能如下:
查询Public Sub SearchQueryDefs(strSearchWord As String)
Dim qdf As DAO.QueryDef
Dim strSQL As String
For Each qdf In CurrentDb.QueryDefs
strSQL = qdf.SQL
If InStr(1, strSQL, strSearchWord, vbTextCompare) > 0 Then
Debug.Print "Query: " & qdf.Name
End If
Next
Set qdf = Nothing
End Sub
输出示例如下:
Query: ~sq_ffrm_List_My_Reviews
Query: ~sq_ffrm_ListReviewsByDate
Query: qry_ExportReviewOverviewToExcel
Query: qry_ReviewDoc
您可能会注意到~sq
,这意味着这是一个存储查询,在第一种情况下它为我frm_List_My_Reviews底层的记录源。
有时在使用此功能时,您可能会发现返回了已删除的查询。 这是由于访问方式存储/缓存查询。 通常,您可以通过“压缩并修复”操作将其删除。 如果不是这样,可能表明数据库损坏。
对于表格对于表单,我在设计视图中打开每个表单,然后遍历控件集合。 我仅选中“文本框”,“组合框”,“列表框”和“复选框”,但是如果需要,可以将其扩展以检查诸如绑定图片之类的项目。 最后,再次关闭该窗体,确保不保存任何更改。 在运行之前,您应该关闭所有表格。
Public Sub searchForms(strSearchWord As String)
Dim oAO As Object
Dim frm As Form
Dim ctrl As Object
For Each oAO In CurrentProject.AllForms
DoCmd.OpenForm oAO.Name, acDesign
Set frm = Forms(oAO.Name)
For Each ctrl In frm.Controls
Select Case ctrl.ControlType
Case acTextBox, acComboBox, acListBox, acCheckBox
If InStr(1, ctrl.ControlSource & "", strSearchWord) Then
Debug.Print "Form: " & frm.Name & ": " & ctrl.Name
End If
End Select
Next
DoCmd.Close acForm, oAO.Name, acSaveNo
Next
Set oAO = Nothing
Set frm= Nothing
Set ctrl = Nothing
End Sub
输出示例如下:
Form: frm_ReviewDetails: tb_DateSubmitted
Form: frm_Obs: tb_DateSubmitted
对于报告
这个实现与我如何遍历AllReports集合的方式搜索表单非常相似。
Public Sub searchReports(strSearchWord As String)
Dim oAO As Object
Dim rpt As Report
Dim ctrl As Object
For Each oAO In CurrentProject.AllReports
DoCmd.OpenReport oAO.Name, acDesign
Set rpt = Reports(oAO.Name)
For Each ctrl In rpt.Controls
Select Case ctrl.ControlType
Case acTextBox, acComboBox, acCheckBox
If InStr(1, ctrl.ControlSource & "", strSearchWord) Then
Debug.Print "Report:" & rpt.Name & ": " & ctrl.Name
End If
End Select
Next
DoCmd.Close acReport, oAO.Name, acSaveNo
Next
Set oAO = Nothing
Set rpt = Nothing
Set ctrl = Nothing
示例输出:
Report:rep_Main: tb_DateSubmitted
Report:supRep_Obs: tb_DateSubmitted
模组
尽管可以通过类似的方式遍历模块并对其进行检查,但是它很容易使用VB环境中内置的标准Find,因此我没有为此编写代码。
将3合并为一个通话为了易于使用,我选择将这三个功能合并为一个调用:
Public Sub SearchDBObjects(strSearchWord As String)
SearchQueryDefs strSearchWord
searchForms strSearchWord
searchReports strSearchWord
End Sub
我希望这对某人有用。 如果您发现本文有用,请在此处发布,链接并分享。 欢迎您使用所示代码的所有部分。
From: https://bytes.com/topic/access/insights/942612-search-querydefs-reports-form-controls-string