7

Access 中有没有办法在对象属性等中搜索特定文本?不仅仅是在 VBA 源代码中。

我问这个是因为如果我更改例如表中字段的名称,我必须检查很多对象属性(记录源、控制源、排序依据,...)。这可以通过跟踪和错误或通过检查表单的每个控件的所有属性来完成,但这需要很多时间。

一个选项是查找和替换工具(不错的工具!),但对我来说有点矫枉过正。我不需要文本替换(仅“查找”),而且我一年只使用几次的工具要 37 美元。

其他建议?

4

3 回答 3

15

我经常使用一些东西来找出某些函数或查询可能隐藏在意外的地方(例如,在子查询中的绑定控件的 RowSource 中)。

我使用未记录的功能将所有 Access 对象导出为原始文本文件。
使用可以在文件夹下递归搜索文件的文本编辑器(例如免费的Notepad++),然后我确信我找到了特定字符串的所有出现,无论多么隐藏。

导出所有对象的代码包括我的IsBlank() 函数

'====================================================================
' Name:    DocDatabase
' Purpose: Documents the database to a series of text files
' From:    http://www.datastrat.com/Code/DocDatabase.txt
' Author:  Arvin Meyer
' Date:    June 02, 1999
' Comment: Uses the undocumented [Application.SaveAsText] syntax
'          To reload use the syntax [Application.LoadFromText]
'          Modified to set a reference to DAO 8/22/2005
'          Modified by Renaud Bompuis to export Queries as proper SQL
'====================================================================
Public Sub DocDatabase(Optional path As Variant = Null)
    If IsBlank(path) Then
        path = Application.CurrentProject.path & "\" & Application.CurrentProject.Name & " - exploded view\"
    End If

    On Error Resume Next
    MkDir path 
    MkDir path & "\Forms\"
    MkDir path & "\Queries\"
    MkDir path & "\Queries(SQL)\"
    MkDir path & "\Reports\"
    MkDir path & "\Modules\"
    MkDir path & "\Scripts\"

    On Error GoTo Err_DocDatabase
    Dim dbs As DAO.Database
    Dim cnt As DAO.Container
    Dim doc As DAO.Document
    Dim i As Integer

    Set dbs = CurrentDb() ' use CurrentDb() to refresh Collections

    Set cnt = dbs.Containers("Forms")
    For Each doc In cnt.Documents
        Application.SaveAsText acForm, doc.Name, path & "\Forms\" & doc.Name & ".txt"
    Next doc

    Set cnt = dbs.Containers("Reports")
    For Each doc In cnt.Documents
        Application.SaveAsText acReport, doc.Name, path & "\Reports\" & doc.Name & ".txt"
    Next doc

    Set cnt = dbs.Containers("Scripts")
    For Each doc In cnt.Documents
        Application.SaveAsText acMacro, doc.Name, path & "\Scripts\" & doc.Name & ".txt"
    Next doc

    Set cnt = dbs.Containers("Modules")
    For Each doc In cnt.Documents
        Application.SaveAsText acModule, doc.Name, path & "\Modules\" & doc.Name & ".txt"
    Next doc

    Dim intfile As Long
    Dim filename as String
    For i = 0 To dbs.QueryDefs.count - 1
         Application.SaveAsText acQuery, dbs.QueryDefs(i).Name, path & "\Queries\" & dbs.QueryDefs(i).Name & ".txt"
         filename = path & "\Queries(SQL)\" & dbs.QueryDefs(i).Name & ".txt"
         intfile = FreeFile()
         Open filename For Output As #intfile
         Print #intfile, dbs.QueryDefs(i).sql
         Close #intfile
    Next i

    Set doc = Nothing
    Set cnt = Nothing
    Set dbs = Nothing

Exit_DocDatabase:
    Debug.Print "Done."
    Exit Sub

Err_DocDatabase:
    Select Case Err

    Case Else
        MsgBox Err.Description
        Resume Exit_DocDatabase
    End Select

End Sub

要使用它,只需DocDatabase从 Access IDE 中的即时窗口调用,它将在“Exploded View”文件夹下创建一组目录,其中包含所有文件。

于 2011-06-20T10:46:44.610 回答
1

另一种选择是暂时打开 NAME AUTOCORRECT 选项。这是一个实施得很糟糕的功能,如果留在生产部署中可能会损坏您的数据库,但我经常在接管由其他人创建的 Access 应用程序时使用它,以便将其转换为使用我的命名约定。

您基本上打开它,让它构建依赖关系表,然后进行更改。然后,您可以遍历依赖关系树以确认它得到了所有依赖关系。完成后,您将其关闭。

但是,它不适用于 VBA 代码。但是对于更改字段名称等,如果仔细使用它会非常有用。

于 2011-06-21T00:33:51.850 回答
1

我修改了上面的代码以去除对象名称中带有“~”的临时对象,如下所示:

Set cnt = dbs.Containers("Scripts")
For Each doc In cnt.Documents
    If Not doc.Name Like "~*" Then
        Application.SaveAsText acMacro, doc.Name, path & "\Scripts\" & doc.Name & ".txt"
    End If
Next doc
于 2015-03-30T15:21:06.370 回答