【问题标题】:Running VBA before any forms open在打开任何表单之前运行 VBA
【发布时间】:2023-04-02 22:15:02
【问题描述】:

所以我有一个带有前端和后端的 Access 数据库。我将很快将其分发给用户,但我无法控制他们将文件放在计算机上的确切位置。不过,我想我可以指望他们将前端和后端放在同一个文件夹中。

因此,当前端打开时,我希望它检查链接表是否正确连接到后端数据库。我有这方面的工作代码;但是我不知道把它放在哪里。前端打开时,会自动打开一个菜单表单(通过启动对话框配置)。我已将代码放在OnOpen 事件中,我认为这是在加载任何数据之前发生的,但是当我测试它时,我收到一条消息告诉我找不到后端(它正在寻找它的旧位置)。

基本上,我可以使用在任何表单打开之前运行的事件吗?

【问题讨论】:

  • 我遇到了同样的问题,对我来说,下面的当前答案不起作用。即使我将某些内容放入从 autoexec 宏调用的函数中,它也会在显示无法找到后端表的错误后执行。所以在此之前没有机会更新表格链接。有什么解决方案吗?还是我遗漏了什么?

标签: vba ms-access


【解决方案1】:

创建一个宏并将其命名为“autoexec”。 对于宏操作,选择“RunCode”,然后将函数名称设置为用于检查链接表的函数名称。

【讨论】:

  • 必须是函数吗?我有一个名为 CheckLinks 的公共子程序,但是当我尝试运行宏时,它告诉我访问无法在表达式中找到名称“CheckLinks”...
  • 看起来它确实必须是一个函数,但我认为它是否返回一个值并没有什么不同。
  • 您可以像调用函数一样调用函数,而无需对返回值做任何事情。
【解决方案2】:

正如马特所说,创建一个宏,将其命名为“autoexec”,然后选择“RunCode”作为宏操作。 Function Name 参数应该是你希望运行的函数的名称(而不是子函数),如果函数没有参数,你仍然应该把 () 放在最后,否则它将不起作用。

【讨论】:

  • 我总是忘记这部分,我会重新复制/粘贴它以便为其他人突出显示[你仍然应该把 () 放在最后,否则它将不起作用。]跨度>
【解决方案3】:

我通常更喜欢创建一个运行多项检查的小型表单,例如查找后端等,并设置各种选项。此表单的打开事件的代码可能是:

Me.Visible = False
'Determines if the database window is displayed
SetProp "StartupShowDBWindow", False, dbBoolean
'Hide hidden and system objects
SetOption "Show Hidden Objects", False
SetOption "Show System Objects", False

'Find back end
CheckLinkPath

我在前端保留了一个要链接的表格表,如果缺少任何表格,可以使用此表格报告错误或任何其他错误。

Set RS = CurrentDb.OpenRecordset("Select TableName From sysTables " _
& "WHERE TableType = 'LINK'")

RS.MoveFirst
strConnect = db.TableDefs(RS!TableName).Connect
If Not FileExists(Mid(strConnect, InStr(strConnect, "DATABASE=") + 9)) Then
    'All is not well
    blnConnectError = True
Else
    Do Until RS.EOF()
        If db.TableDefs(RS!TableName).Connect <> strConnect Then
            blnConnectError = True
            Exit Do
        End If

        RS.MoveNext
    Loop
End If

如果一切正常,小表单会调用主菜单或表单,而用户永远不会看到检查表单。如果需要,我还会使用此表单打开密码提示。

【讨论】:

    【解决方案4】:

    在将前端和后端放在同一个文件夹中之前,请考虑一下。不值得拥有2个文件夹吗?同一台计算机上的多个用户访问同一个后端数据库会怎样?多个用户通过网络访问同一个数据库会怎样?如果您的应用基本上是单用户应用,那么拥有前端-后端类型的必要性是什么?

    您为什么不在应用程序中添加一个对话框,以防您的连接丢失?您可以在代码中创建一个 fileDialog 对象,允许用户在其计算机/网络的任何位置浏览 *mdb 文件。然后可以控制选定的 mdb 文件包含所有请求的表并打开相应的链接(我猜你正在使用 transferDatabase 命令)。

    当您将应用分发给最终用户时,运行应用所需的其他工具/参考又如何呢?默认情况下,MS Access 记录三个基本的:

    • Visual Basic 应用程序
    • Microsoft Access 库
    • Microsoft DAO 库

    如果您的应用需要其他任何东西,例如 ADO 或 Office 对象(例如 ADODB.recordset 或 Office 命令栏),您必须为每次安装手动添加引用,因为最终用户将无法打开VBA 窗口并访问工具/参考菜单。

    因此,如果您需要在多台计算机上部署您的应用程序,我强烈建议您使用像 free one 这样的部署工具。您需要几个小时才能正确使用它,但结果是值得的。您将能够为您的客户提供一个真正的安装程序模块。它将创建文件夹、添加请求的快捷方式并管理计算机注册表中的引用。这将使您的部署绝对轻松!

    编辑:autoexec 宏绝对是在任何事件之前调用代码的正确解决方案。

    编辑:不要忘记您的最终用户可以从免费的 Access 运行时版本中获利!

    【讨论】:

      【解决方案5】:

      正如其他人所建议的那样,在这种情况下,我会使用 AutoExec 宏。如果检查链接表的代码当前是子代码,请将其更改为如果成功则返回 TRUE 的函数。然后,如果链接表代码失败,您可以使用 AutoExec 宏中的“条件”列以用户友好的错误对话框退出应用程序。您的 AutoExec 宏可能类似于:

      1. 调用您的 LinkTables() 函数,设置条件以在启动失败时终止启动。
      2. 调用“主”启动菜单表单。

      【讨论】:

        【解决方案6】:

        您可以向他们发送一个 *.BAT 文件,将数据库复制到 c:\temp(或您选择的任何文件夹。在创建 BAT 文件之前设置与此文件夹的链接。将其压缩并通过电子邮件发送给他们。然后您不必担心额外需要的代码。

        【讨论】:

          猜你喜欢
          • 2018-09-16
          • 1970-01-01
          • 2015-10-15
          • 1970-01-01
          • 2023-03-02
          • 1970-01-01
          • 2019-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多