访问VBA:使用现有的Excel工作簿(运行时错误9,如果文件已打开)

时间:2016-02-17 11:39:34

标签: excel vba ms-access

我在Access中编写一个宏(希望如此):

  • 创建Excel工作表

  • 根据Access数据库中的信息

  • 设置并格式化 用户输入后
  • 将输入的数据输入现有的Excel主文件

打开空白页等工作非常正常,但我一直试图将现有的主文件设置为变量

Sub XLData_EnterSurvey()

Dim appXL As Excel.Application
Dim wbXLnew, wbXLcore As Excel.Workbook
Dim wsXL As Excel.Worksheet
Dim wbXLname As String

Set appXL = CreateObject("Excel.Application")
appXL.Visible = True

wbXLname = "G:\[*full reference to file*].xlsm"

IsWBOpen = fnIsWBOpen(wbXLname)
'separate function (Boolean), using 'attempt to open file and lock it' method
'from Microsoft site.

If IsWBOpen = False Then
    Set wbXLcore = appXL.Workbooks.Open(wbXLname, True, False)
    'open file and set as variable.
ElseIf IsWBOpen = True Then
    wbXLcore = appXL.Workbooks("ResultsOverall.xlsm")  'ERROR HERE.
    'file is already open, so just set as variable.
End If

Debug.Print wbXLcore.Name
Debug.Print IsWBOpen

Set appXL = Nothing

End Sub

当文件关闭时,这非常有效。然而,当它打开时,我得到:

运行时错误' 9': 下标超出范围

我只是刚开始自学VBA(非常试错!)而且我在答案中看到的其他内容/ Google似乎很适合这个问题,所以我有点位丢失...

考虑到在文件关闭时工作正常,我怀疑我在引用该文件时犯了一些愚蠢的错误 - 可能与' createobject&有关#39;位和不同的excel实例??

任何建议都将不胜感激!感谢

谢谢@StevenWalker

这是工作代码:

Sub XLData_EnterSurvey()

Dim appXL As Excel.Application
Dim wbXLnew As Excel.Workbook, wbXLcore As Excel.Workbook
Dim wsXL As Excel.Worksheet

On Error GoTo Handler
Set appXL = GetObject(, "Excel.Application")
appXL.Visible = True

Dim wbXLname As String
wbXLname = "G:\ [...] .xlsm"

IsWBOpen = fnIsWBOpen(wbXLname)

If IsWBOpen = False Then
    Set wbXLcore = appXL.Workbooks.Open(wbXLname, True, False)
ElseIf IsWBOpen = True Then
    Set wbXLcore = appXL.Workbooks("ResultsOverall.xlsm")
End If

Set appXL = Nothing

'-------------------Error handling------------------
Exit Sub

' For if excel is not yet open.
Handler:
Set appXL = CreateObject("Excel.Application")
Err.Clear
Resume Next

End Sub

2 个答案:

答案 0 :(得分:1)

抱歉,我已经在手机上了,所以我无法进入太多细节或对代码做了太多工作但是我一眼就认为你可能需要添加一个错误处理程序,以便在文件中已经打开,执行不同的代码行。

添加'出错时转到处理程序' (在创建excel对象之前)和底部 在您的代码中添加'处理程序:'。在错误处理程序中,使用get对象而不是create对象。

您必须确保在错误处理程序之前使用exit sub,否则每次运行代码时都会运行处理程序。

您可以在此处查看我的意思示例:How to insert chart or graph into body of Outlook mail

虽然请注意在此示例中反过来(如果错误'获取' outlook,则创建它)。

链接示例:

设置myOutlook = GetObject(," Outlook.Application") 设置myMessage = myOutlook.CreateItem(olMailItem)

这里的其余代码

退出子

'如果Outlook未打开,请将其打开

处理程序:

设置myOutlook = CreateObject(" Outlook.Application") Err.Clear 继续下一步

结束子

答案 1 :(得分:1)

如果将appXL.Workbooks语句移动到调试窗口,您会发现该集合中的项目名称没有扩展名。

所以在你的情况下,我猜这行应该是:

wbXLcore = appXL.Workbooks("ResultsOverall")