7

Given a database object in MS Access VBA, how can one get that database's VBProject?

Function GetVBProject(ByVal db As Database) As VBProject
    Set GetVBProject = ???
End Function

The only way I know how to get VBProjects in Access is through Application.VBE.VBProjects.Item(???). However, I won't know what order of the projects are in and what the name is. I will only know it's parent database. The equivalent in Excel would be simply

Function GetVBProject(ByVal wb As Workbook) As VBProject
    Set GetVBProject = wb.VBProject
End Function
4

2 回答 2

6

查看VBProjects集合并检查每个项目的FileName属性。如果一个项目FileName是当前数据库文件 ( CurrentDb.Name),那就是您想要的。

Public Function ThisProject() As String
    Dim objVBProject As Object
    Dim strReturn As String
    For Each objVBProject In Application.VBE.VBProjects
        If objVBProject.FileName = CurrentDb.Name Then
            strReturn = objVBProject.Name
            Exit For
        End If
    Next
    ThisProject = strReturn
End Function

该函数返回项目名称。您可以使用名称来设置对VBProject对象的引用。或者您可以修改函数以返回VBProject而不是字符串。

我几乎没有对此进行过测试,因此我不确定objVBProject.FileName = CurrentDb.Name是否适合每种情况的正确测试条件。但我希望这个答案能给你一些有用的东西。

我研究了从驱动器号和从 UNC 路径到网络共享打开数据库时的objVBProject.FileName对比。CurrentDb.Name无论哪种方式,似乎objVBProject.FileName两者CurrentDb.Name都“自我调整”并且仍然相互匹配:

' db opened from a drive letter ...
? CurrentDb.Name
C:\share\Access\BigDb_secure.mdb
? application.VBE.VBProjects("BigDb_secure").FileName
C:\share\Access\BigDb_secure.mdb

' db opened from UNC path to network share ...
? CurrentDb.Name
\\HP64\share\Access\BigDb_secure.mdb
? application.VBE.VBProjects("BigDb_secure").FileName
\\HP64\share\Access\BigDb_secure.mdb
于 2015-06-16T17:39:10.713 回答
2

回答这个问题可能有点晚了,但如果这是您想要解决的当前项目,那么

Set vbProj = VBE.ActiveVBProject

将工作。

于 2019-12-18T13:03:51.880 回答