MS Access -> Excel MsgBox 出现两次

Posted

技术标签:

【中文标题】MS Access -> Excel MsgBox 出现两次【英文标题】:MS Access -> Excel MsgBox appearing twice 【发布时间】:2017-07-12 13:58:04 【问题描述】:

我正在 Access 2016 中编写一个模块,该模块打开一个 Excel 电子表格,将数据复制到 Excel 表中,然后运行存储在 Excel 文件中的子程序,显示一个消息框,然后生成一个图表(或者至少,它应该!)。

这是访问代码:

Option Compare Database
Option Explicit

Sub QueryExportMod()

'variable initilizations and definitions ---------------------------------------------------------------------------------------



Dim db As DAO.Database
Set db = CurrentDb

Dim totalFindingsQuery As String
Dim breakdownFindingsQuery As String
totalFindingsQuery = 'SQL text
breakdownFindingsQuery = 'SQL text

Dim tempQ1 As DAO.QueryDef
Dim tempQ2 As DAO.QueryDef
Set tempQ1 = db.CreateQueryDef("tempQ1", totalFindingsQuery)
Set tempQ2 = db.CreateQueryDef("tempQ2", breakdownFindingsQuery)

Dim rs1 As Recordset
Dim rs2 As Recordset
Set rs1 = db.OpenRecordset("tempQ1")
Set rs2 = db.OpenRecordset("tempQ2")

Dim xlApp As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Set xlApp = New Excel.Application
Set wb = xlApp.Workbooks.Open(CurrentProject.Path & "\ExportExcelTest.xlsm")
Set ws = wb.Worksheets("Sheet1")

Dim table As ListObject
Set table = ws.ListObjects("Table1")



'Modifying files and data ------------------------------------------------------------------------------------------------------


ws.ListObjects("Table1").DataBodyRange.Rows.Delete

ws.Range("A2") = "Total Findings"
ws.Range("B2").CopyFromRecordset rs1
ws.Range("A3").CopyFromRecordset rs2

'Call autoGraph, the Excel sub
xlApp.Run "autoGraph()"

xlApp.Visible = True

Set xlApp = Nothing
Set wb = Nothing
Set ws = Nothing

DoCmd.DeleteObject acQuery, "tempQ1"
DoCmd.DeleteObject acQuery, "tempQ2"

End Sub

'to be able to run the sub from a macro
Function KGQueryExportCall()
Call QueryExportMod
End Function

这里是 Excel 子:

Sub autoGraph()

'AppActivate Application.Caption
MsgBox " <message> "

Dim tb1Range As Range
Set tb1Range = ActiveSheet.Range("Table1")

Range("Table1").Select
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=Range("Table1")


End Sub

当我运行 Access 子 QueryExportMod 时,会生成消息框(我遇到的另一个问题是它总是在其他窗口后面。有谁知道如何强制它进入当前窗口,最上面的那个?我尝试了AppActivate Application.Caption,但它破坏了我的代码),当我在消息框上按“确定”时,将再次出现完全相同的消息框。在此副本上按“确定”后,Excel 电子表格将打开,其他一切正常。我怎样才能摆脱这个重复?

感谢您的帮助

编辑:我在 Excel 子中添加了两条 Debug 行,如下所示:

DeBug.Print("1")
MsgBox " <message> "
DeBug.Print("2")

最终得到

1 2 1 2 在即时窗口中当我运行 Access 模块时,所以我现在知道 Excel 子程序正在运行两次,但我仍然无法弄清楚是什么原因导致它这样做.当我直接从 Excel 内部运行 Excel 模块时,我只得到

1 2

我相信这可能与实际应用程序打开两次有关?当我在没有消息框线的情况下运行时,我看到一个口吃,就像一个窗口打开然后几乎立即关闭,然后再次重新打开

【问题讨论】:

【参考方案1】:

您不应该在此处添加括号:

xlApp.Run "autoGraph()"

在 Access 中,当您使用 Application.Run 添加括号时,它只会生成运行时错误,而在 Excel 中,它显然会运行两次。

删除它们,它就会被修复。

【讨论】:

哇。所以多余的括号不仅是多余的,而且是非常有害的! #TIL 感谢您的回复,埃里克!我删除了引号,它工作得很好,谢谢!我不确定 OLE 自动化是什么,你会如何建议我改为调用 MsgBox?另外,在我从 Access 复制数据并运行 Excel 子程序之后,我就拥有了xlApp.Visible = True。这一直在努力调出实际的电子表格。我在xlApp.Run "autoGraph" 之前和之后都放了xlApp.UserControl = True,但问题仍然存在,似乎没有任何影响。 @J.Cal 括号,而不是引号。引号是必需的 对不起,我就是这个意思!错别字 如果它有效,我认为他做对了。我将从我的答案中删除 MsgBox 部分,我曾经将它与另一个 Access 应用程序一起使用,但如上所述,这是一个糟糕的计划。有害的括号是因为 Application.Run 实际上添加了自己的括号,例如Application.Run("MyFunction", "Arg1") 将运行 MyFunction("Arg1") 并返回其返回值。因此 Application.Run "autoGraph()" 实际上应该运行 autoGraph()() 并且显然 Excel 认为这很好,只是一个双重调用运算符或其他东西

以上是关于MS Access -> Excel MsgBox 出现两次的主要内容,如果未能解决你的问题,请参考以下文章

通过中间处理从 MS Excel 导出到 MS Access

MS Access 2003 - Access 表单上的嵌入式 Excel 电子表格

MS Access:打开2016 Excel和getObject

使用 Python 将数据从 MS Access 复制到 MS Excel

将 MS-Access 表单结果导出到 Excel?

sql MS SQL链接到Excel和Access示例