Ms access 将Access.Application对象传递给函数:Dim、Set、object如何使其工作?

Ms access 将Access.Application对象传递给函数:Dim、Set、object如何使其工作?,ms-access,vba,pass-by-reference,currying,Ms Access,Vba,Pass By Reference,Currying,我在一个堆栈溢出页面中遇到了这个(修改过的)函数,并且一直在尝试让它工作,而不放弃传递的对象(如果我严格地在第一个例程中处理Access.Application,它将工作) 是的,我知道有很多方法可以得到相同的答案(大部分来自堆栈上的其他帖子),但是这里有一个通用的概念,将对象传递给我想掌握的函数----请暂时忘记函数检查表的存在性 函数FCN\u CheckTblsExist(数据库作为Access.Application_ tableName(作为字符串)作为布尔值 'access.Appl

我在一个堆栈溢出页面中遇到了这个(修改过的)函数,并且一直在尝试让它工作,而不放弃传递的对象(如果我严格地在第一个例程中处理
Access.Application
,它将工作)

是的,我知道有很多方法可以得到相同的答案(大部分来自堆栈上的其他帖子),但是这里有一个通用的概念,将对象传递给我想掌握的函数----请暂时忘记函数检查表的存在性

函数FCN\u CheckTblsExist(数据库作为Access.Application_
tableName(作为字符串)作为布尔值
'access.Application.CurrentData.AllTables.Count
“etc”是“允许处置
“theDatabase”对象变量
'假定该表不存在。
FCN_CheckTblsExist=False
'定义迭代器以查询对象模型。
可调为整数
'循环浏览对象目录并与搜索词进行比较。
对于iTable=0,请访问database.CurrentData.AllTables.Count-1
如果database.CurrentData.AllTables(iTable).Name=tableName,则
FCN_CheckTblsExist=True
退出功能
如果结束
下一个
端函数
函数callFCN_CheckTblsExist(表名为字符串)
“这是一个curried函数的例子?——维度降低
将bo0设置为字符串
使物体变暗
设置A=CreateObject(“Access.Application”)
bo0=FCN\U CheckTblsExist(A,表名)
MsgBox tableName&“Exists is”&bo0
端函数
我不知道(
theDatabase As Access.Application,
)部分是否正确,这可能是问题的根源,而不是辅助过程中可能需要的Dim、Set、Object(New?)操作。可能存在参考库问题(我正在运行Access 2013)

更新:我不确定以下内容是否足够可靠,但这正是我之前在文章中的意思,这里只是为了完整起见。顺便说一句,这不是一个分离的应用程序,所以这可能就是为什么下面的工作。我很欣赏HansUp的帖子,在这个问题上说的还不够。反正

Public Function FCN_CheckTblsExist(tableName作为字符串)作为Boolean'为每个表调用此函数一次
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim appAccess作为新的访问。应用程序
将数据库设置为Access.Application
'假定该表不存在。
FCN_CheckTblsExist=False
'定义迭代器以查询对象模型。
可调为整数
对于iTable=0,访问.Application.CurrentData.AllTables.Count-1
如果Access.Application.CurrentData.AllTables(iTable).Name=tableName,则
FCN_CheckTblsExist=True
退出功能
如果结束
下一个
端函数
我只是想补充一点,我在技术上发布的最后一个函数将被视为部分函数或不存在,这取决于调用“Access.Application.CurrentData.AllTables.”作为“theDatabase”的替代物,函数的范围受到了多大的限制,只有将Access.Application.CurrentDb.Name创建的特定字符串替换为原始函数…(数据表…)才是真正的完整格式


无论如何,将对象传递给函数和库以及它们的方法是本次讨论的主要焦点。当我解决DAO问题时,我应该对可能发生的事情有更好的感觉,然后我将相应地发布并标记最佳解决方案。

问题并不是传递
访问.Application
对象您可以创建
Access.Application
,然后在没有在该访问会话中打开数据库的情况下检查表是否存在。在这种情况下,
database.CurrentData.AllTables.Count应触发错误
2467,“您输入的表达式指的是已关闭或不存在的对象。”

我修改了这两个过程,并在Access 2010中对它们进行了测试。这两个过程都编译并运行,没有错误,并且产生了我认为您想要的结果

函数FCN\u CheckTblsExist(数据库作为Access.Application_
tableName(作为字符串)作为布尔值
将tdf调暗为DAO.TableDef
作为布尔值的Dim blnReturn
blnReturn=False
对于Database.CurrentDb.TableDefs中的每个tdf
如果tdf.Name=tableName,则
blnReturn=True
退出
如果结束
下一个tdf
FCN_CheckTblsExist=blnReturn
端函数
函数callFCN_CheckTblsExist(DbPath作为字符串,tableName作为字符串)
将bo0设置为布尔值
使物体变暗
设置A=CreateObject(“Access.Application”)
A.OpenCurrentDatabase数据库路径
bo0=FCN\U CheckTblsExist(A,表名)
MsgBox tableName&“Exists is”&bo0
Debug.Print tableName&“Exists is”&bo0
A.退出
设置A=无
端函数
注意,在尝试打开DbPath数据库之前,我没有包含任何检查DbPath数据库是否存在的规定。因此,如果为不存在的数据库提供路径,则会出现错误

DAO参考问题

DAO 3.6是旧DAO系列的最后一个。它只支持旧的MDB类型数据库。当Access 2007引入ACCDB数据库类型时,一个新的DAO库(Access数据库引擎对象库,有时称为ACEDAO)除了支持ACCDB数据库外,ACEDAO还可以支持旧的MDB类型

设置引用时,不要尝试同时选择两者

以下是我的项目参考的屏幕截图:

当我在即时窗口中检查我的项目引用时,请注意ACEDAO甚至被称为just DAO。我还运行了callFCN_checktblsist过程来演示它在没有DAO 3.6引用的情况下工作:

Function TestFunction_DataBase()
  Dim ws As Workspace
  Dim db As Database

  Set ws = CreateWorkspace("", "admin", "", "dbUseJet")
  Set db = ws.OpenDatabase("the db path", , , CurrentProject.Connection)

  MsgBox TdefExists_DataBase(db, "the table name")

  db.Close
  ws.Close
  Set db = Nothing
  Set ws = Nothing

End Function

Function TdefExists_DataBase(ac As Database, strTableName As String) As Boolean
  'check to see if table exists
  On Error GoTo ErrHandler
  Dim strBS As String

  strBS = ac.TableDefs(strTableName).Name
  TdefExists_DataBase = True
  Exit Function
ErrHandler:
  TdefExists_DataBase = False
End Function
Function TestFunction_Application()
  Dim ac As New Access.Application

  ac.OpenCurrentDatabase "the db path"

  MsgBox TdefExists_Application(ac, "the table name")

  ac.Quit
  Set ac = Nothing

End Function

Function TdefExists_Application(ac As Access.Application, strTableName As String) As Boolean
  'check to see if table exists
  On Error GoTo ErrHandler
  Dim strBS As String

  strBS = ac.CurrentDb.TableDefs(strTableName).Name
  TdefExists_Application = True
  Exit Function
ErrHandler:
  TdefExists_Application = False
End Function
Function TdefExists(strName As String) As Boolean
    'check to see if query exists
    On Error GoTo ErrHandler
    Dim strBS As String
    strBS = CurrentDb.TableDefs(strName).Name
    TdefExists = True
    Exit Function
  ErrHandler:
    TdefExists = False
End Function