在QueryDefs,Reports和Form控件中搜索字符串

介绍

本文将说明如何在当前应用程序中搜索指定的字符串。

并非经常,但有时我需要更改字段名称,以使其更有意义,这通常是因为我需要添加一个额外的字段,而对于新字段,可能会含糊不清每个字段。

因此,我编写了一些简单的代码,这些代码将检查(而不是自动更正)您的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值