如何确定用户是不是关闭已由 Excel 中的代码打开的 Access 应用程序

Posted

技术标签:

【中文标题】如何确定用户是不是关闭已由 Excel 中的代码打开的 Access 应用程序【英文标题】:how to determine if user closed Access application that has been opend by code from Excel如何确定用户是否关闭已由 Excel 中的代码打开的 Access 应用程序 【发布时间】:2019-09-27 09:18:03 【问题描述】:

我在 Excel 中使用了一些存储在 Access 数据库中的数据。如果用户想要添加/更改数据,这必须在 Access 前端完成(在我的例子中)。为了提供一种简单的方法,我在 Excel 工作表中放置了一个“编辑数据”按钮以打开数据库 + 表单:

' standard module

Const mstrDatabase = ' path & filename
Const mstrForm =     ' name of form to edit data

Private moAccessApp As Access.Application
    ' module level object to keep database open after button_click-code finished

Sub OpenDatabase_Button_Click()
    Set moAccessApp = CreateObject("Access.Application")
    moAccessApp.OpenCurrentDatabase mstrDatabase
    moAccessApp.Visible = True
    moAccessApp.DoCmd.OpenForm mstrForm
End Sub

如果用户关闭 Access,moAccessApp 对象仍然设置(Debug.Print (moAccessApp Is Nothing) 打印出 False)。

问题:

    如何确定 Access 是否已被用户关闭? 在这种情况下是否可以在 Excel 中触发事件?

ad (1): 我喜欢防止在第二次点击按钮的情况下打开第二个实例

ad (2):我想至少在关闭数据库后刷新 Excel 中的数据(虽然我知道用户可能会更改 Access 中的数据并再次切换到 Excel 而不关闭 Access)。

【问题讨论】:

是什么阻止您在 Excel 中创建表单并更新 Access 数据库?这意味着用户将永远不必打开 Access 数据库,然后您的工作簿可以链接到 Access 数据库,因此始终从 Access 刷新数据 @Martin.lindenlauf this 是否满足您的需求? @Zac 我认为在 Excel 中实现所有数据更新需求将是一个干净的解决方案,但比在 Access 中使用现有表单 + 子表单结构的成本要高得多 - 在我的情况下成本太高,所以我需要采用一种“快速而肮脏”的解决方案,尽管尽可能地防止诸如“多实例”和“缺少刷新”之类的操作错误(最好是用户培训)。 在阅读了所有问题和 cmets 之后,您的方法确实很脏,但一点也不快。您将需要不同的程序来解决您的每个问题。您应该为每个问题打开一个新问题,而不是一个有很多问题的帖子。关于插入数据,简单的方法就是从excel中执行SQL语句INSERT INTO。关于更新,一个 UPDATE 语句.. 其余问题应放在不同的帖子中 不相信您的“快速而肮脏”的解决方案会更快或更便宜(我真的对 costly 声明感到困惑)。但就像@FoxfireAndBurnsAndBurns 说的那样,绝对没有什么能阻止你从 Excel 到 Access 进行 SQL 调用 ..howerver .. 你的项目,你的电话 【参考方案1】:

编辑

根据microsoft documentation

我认为按照您的要求进行操作的一种方法是在访问结束时调用您的宏:

访问宏

Private Sub Form_Unload() 
 Call runExcelMacro("C:\YourWorkbookPath.xls", "MacroName")
End Sub

Excel 宏

Sub MacroName()
  MsgBox "Access  Form Is closed"
  ThisWorkbook.RefreshAll
End Sub

另请注意,根据this answer,Access 没有OnClose 事件..

更多文档在这里

.RefreshAll

.IsLoaded

【讨论】:

我想单独在 Excel 中处理这个问题,但从 Access 表单事件中调用 Excel 过程可能会更好:可以处理更多情况(例如 AfterUpdate / AfterInsert => 刷新 Excel)。由于有多个工作簿链接到同一个数据库并且表单是“独立使用”前端数据库的一部分,我需要告诉 Access (1) Excel 是否调用了表单加载,(2) 哪个工作簿调用和 (3) Excel 中的哪个过程应该处理这种情况。我想我可以通过在 Excel 的调用代码中在表单中设置一些隐藏的未绑定字段来做到这一点。

以上是关于如何确定用户是不是关闭已由 Excel 中的代码打开的 Access 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Excel 字体如何加上划线,(不是下划线)例如平均值X上加一横。

如何确定用户是不是关闭了 google auth2.signIn() 窗口?

excel vba 编程,怎么讲窗口右上角的那个【X】隐藏掉。。。或者把它的功能禁用,望各路大侠,多多帮助。

尝试后如何正确等待检查 Excel 实例是不是已关闭?

python xlrd 检查文件是不是已经打开

vba中的窗口,如何用esc键实现 窗口右上角的那个关闭功能。(不添加命