MS访问->;Excel MsgBox出现两次

MS访问->;Excel MsgBox出现两次,excel,ms-access,vba,Excel,Ms Access,Vba,我正在Access 2016中编写一个模块,它打开一个Excel电子表格,将数据复制到Excel表格中,然后运行存储在Excel文件中的一个子模块,该子模块显示一个消息框,然后生成一个图形(至少应该是这样的!) 这是访问代码: Option Compare Database Option Explicit Sub QueryExportMod() 'variable initilizations and definitions --------------------------------

我正在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
最后得到了

1
2.
1.
2当我运行Access module时,立即窗口中的
,,因此我现在知道Excel sub正在运行两次,但我仍然无法找出是什么原因导致它这样做。当我从Excel内部直接运行Excel模块时,我只得到

1
2


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

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

xlApp.Run“autoGraph()”

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


拆下它们,它就会被固定。

Wah。因此,无关的父母不仅仅是多余的,他们是积极有害的#谢谢你的回答,埃里克!我删除了引号,它工作得很好,谢谢!我不确定OLE自动化是什么,您建议我如何调用MsgBox?另外,在我从Access复制数据并运行Excel sub之后,我就有了
xlApp.Visible=True
。这一直在工作以显示实际的电子表格。我将
xlApp.UserControl=True
放在
xlApp.Run“autoGraph”
之前和之后,但问题仍然存在,似乎不会影响任何事情。@J.Cal括号,而不是引号。报价是必需的。对不起,这就是我的意思!如果行得通,我想他是对的。我将从我的答案中删除MsgBox部分,我曾经在另一个Access应用程序中使用过它,但正如所说的,这是一个糟糕的计划。有害的括号是因为Application.Run实际上添加了自己的括号,例如
Application.Run(“MyFunction”、“Arg1”)
将运行
MyFunction(“Arg1”)
并返回其返回值。因此,
Application.Run“autoGraph()”
实际上应该运行
autoGraph()()
,显然Excel认为这很好,只是一个双重调用操作符或什么的
DeBug.Print("1")
MsgBox " <message> "
DeBug.Print("2")