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

如何确定用户是否关闭了已由Excel中的代码打开的Access应用程序,excel,vba,ms-access,Excel,Vba,Ms Access,我使用Excel中存储在Access数据库中的一些数据。如果用户想要添加/更改数据,则必须在Access前端完成(在我的情况下)。为了提供一种简便的方法,我在Excel工作表中放置了一个“编辑数据”按钮,以打开数据库+表单: ' standard module Const mstrDatabase = ' path & filename Const mstrForm = ' name of form to edit data Private moAccessApp As Ac

我使用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
如果用户关闭访问,则仍会设置
moacessapp
对象(
Debug.Print(moacessapp为Nothing)
打印出
False

问题:

  • 如何确定用户是否已关闭访问
  • 在这种情况下,是否可以在Excel中触发事件
  • 广告(1):我喜欢防止在第二次点击按钮时打开第二个实例

    ad(2):我希望至少在数据库关闭后刷新Excel中的数据(尽管我知道用户可能会在Access中更改数据,并在不关闭Access的情况下再次切换到Excel)。

    编辑

    我认为实现您要求的一种方法是在访问结束时调用宏:

    访问宏

    Private Sub Form_Unload() 
     Call runExcelMacro("C:\YourWorkbookPath.xls", "MacroName")
    End Sub
    
    Sub MacroName()
      MsgBox "Access  Form Is closed"
      ThisWorkbook.RefreshAll
    End Sub
    
    Excel宏

    Private Sub Form_Unload() 
     Call runExcelMacro("C:\YourWorkbookPath.xls", "MacroName")
    End Sub
    
    Sub MacroName()
      MsgBox "Access  Form Is closed"
      ThisWorkbook.RefreshAll
    End Sub
    
    另请注意,根据,没有用于访问的
    OnClose
    事件

    此处有更多文档


    是什么阻止您在Excel中创建表单并更新Access数据库?这意味着用户将永远不必打开Access数据库,然后您的工作簿可以链接到Access数据库,从而始终从中刷新数据Access@Martin.lindenlauf是否满足您的需求?@Zac我认为在Excel中实现所有数据更新需求将是一个干净的解决方案,但这比在Access中使用现有表单+子表单结构要昂贵得多——在我的情况下成本太高,因此我需要一种“快速且肮脏”的解决方案,尽管我尽量避免出现“多个实例”和“缺少刷新”等操作错误(最好是用户培训)。阅读所有问题和评论后,你的方法确实很肮脏,但一点也不快。您需要不同的程序来解决每个问题。你应该为每个人提出一个新问题,而不是一篇有很多问题的帖子。关于插入数据,简单的方法就是从excel中插入SQL语句。关于更新,更新语句。。其余的问题应该放在不同的帖子里。我不相信你的“快速而肮脏”的解决方案会更快或更便宜(我真的被这个昂贵的声明弄糊涂了)。但正如@FoxfireAndBurnsAndBurns所说,没有任何东西可以阻止您从Excel调用SQL来访问。。然而。。您的项目,您的callI认为可以单独在Excel中处理此问题,但从Access窗体事件调用Excel过程可能更好:可以处理更多情况(例如,
    AfterUpdate
    /
    AfterInsert
    =>刷新Excel)。由于有多个工作簿链接到同一数据库,并且表单是“独立使用”前端数据库的一部分,因此我需要告诉Access(1)如果Excel调用了表单加载,(2)调用了哪个工作簿,以及(3)Excel中的哪个过程应处理该情况。我想我可以通过在Excel的调用代码中设置表单中一些隐藏的未绑定字段来实现这一点。