【问题标题】:VBA script runs OK first time, second time errors 'out of range'VBA 脚本第一次运行正常,第二次错误“超出范围”
【发布时间】:2013-12-13 04:27:08
【问题描述】:

运行 VBA 脚本的 Access DB 有一个奇怪的问题,它调用 Excel 文档以在将其用作链接表之前运行一些修复程序。

奇怪的是它在第一次从新打开的 Access 运行脚本时完美运行。 第二次我得到错误'运行时错误'9',下标超出范围' 脚本失败:

Workbooks("Overview Tracker.xlsb").Activate

在 IF THEN 子中,testProcessed() (我只输入该行以查看首先激活 Workbook 是否有帮助,但它没有 - 要么它在该行失败,要么在下一个 IF 行失败。)

脚本按此顺序运行。 1.打开excel文档 2.测试是否已经处理(检查单元格内容) 3. 如果处理完毕,则弹出一条消息并退出 Excel 文档 4.如果没有则运行处理然后退出Excel文档

正如我所说,新打开的 Access 将完美地运行此脚本,在任何一种情况下(已处理或未处理),但脚本的第二次运行总是会崩溃。

我整天都在努力解决这个问题,没有运气!

欢迎任何想法! 提前感谢您的帮助。

Public Function OpenExcelFixer1()
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
xlApp.Visible = True
xlApp.DisplayAlerts = False
xlApp.Workbooks.Open "C:\Users\....\Overview tracker.xlsb", UpdateLinks:= _
3
Call testProcessed
xlApp.Quit
End Function


 Public Sub alreadyDone()
MsgBox "This file has already been processed", vbExclamation, "Overview Tracker already fixed"
Excel.Application.Quit
 End Sub


Public Sub fixProcess()
ActiveWorkbook.Save
Sheets("OVERVIEW").Select
Rows("1:1").Select
Selection.Delete Shift:=xlUp
Columns("A:I").Select
Selection.NumberFormat = "@"
Columns("Q:X").Select
Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
Sheets("SHIPPING").Select
Rows("1:1").Select
Selection.Delete Shift:=xlUp
Columns("A:I").Select
Selection.NumberFormat = "@"
Columns("Q:X").Select
Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
Sheets("Dell Update").Select
Range("G1").Select
ActiveCell.FormulaR1C1 = "PROCESSED"
ActiveWorkbook.Save
ActiveWorkbook.Close
Excel.Application.Quit        
End Sub


Public Sub testProcessed()
Workbooks("Overview Tracker.xlsb").Activate
If Workbooks("Overview Tracker.xlsb").Sheets("Update").Range("G1").Value = "PROCESSED" Then
 Call alreadyDone
Else
 Call fixProcess
End If
End Sub

【问题讨论】:

  • 您确定第二次运行脚本时Overview Tracker 工作簿已打开?
  • OpenExcelFixer1 中,您正在创建一个新的 Excel 实例,然后在该实例中打开工作簿。为什么这样做?您的其他代码无权访问该新实例或在该实例中打开的工作簿,除非您传入对 xlApp 的引用。
  • 嗨,是的,第二次确实打开了 excel 文件,我看到它打开了。
  • Tim,我不确定我是否理解,如果我不创建实例代码就不会运行?

标签: excel vba


【解决方案1】:

alreadyDonefixProcess 都在关闭 excel。尝试将 testProcessed 移动到主子目录中,并从 alreadyDonefixProcess 子目录中删除 Excel.Application.Quit


编辑

Excel 不会将您在主子程序中打开的应用程序实例“传递”给其他子程序。您可以在其他 subs 中显式调用工作表,这使得 Excel 完成繁重的工作,或者您必须将实例作为变量传递给函数。您还可以将代码全部重新组织到一个子中,它会工作得很好。例如:

Public Function OpenExcelFixer1()
  Dim xlApp As Excel.Application
  Set xlApp = New Excel.Application
  xlApp.Visible = True
  xlApp.DisplayAlerts = False
  xlApp.Workbooks.Open "C:\Users\....\Overview tracker.xlsb", UpdateLinks:=3

  Workbooks("Overview Tracker.xlsb").Activate

  If Workbooks("Overview Tracker.xlsb").Sheets("Update").Range("G1").Value = "PROCESSED" Then
    MsgBox "This file has already been processed", vbExclamation, "Overview Tracker already fixed"
  Else
    ActiveWorkbook.Save
    Sheets("OVERVIEW").Rows("1:1").Select
    Selection.Delete Shift:=xlUp
    Columns("A:I").Select
    Selection.NumberFormat = "@"
    Columns("Q:X").Select
    Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
    Sheets("SHIPPING").Select
    Rows("1:1").Select
    Selection.Delete Shift:=xlUp
    Columns("A:I").Select
    Selection.NumberFormat = "@"
    Columns("Q:X").Select
    Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
    Sheets("Dell Update").Select
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "PROCESSED"
  End If

  ActiveWorkbook.Save
  ActiveWorkbook.Close
  xlApp.Quit
End Function

【讨论】:

  • 感谢您的输入,我确实移动了例程,但仍然失败。我只是在周六早上有了一些见解并尝试了一些东西!我没有尝试显式引用 Excel 工作簿,而是尝试了这个: If xlApp.Sheets("Update").Range("G1").Value = "PROCESSED" Then - 这有效!我可以一遍又一遍地运行例程,不再失败。!我不知道为什么 VB 会丢失对文件的引用,但似乎是这样。哦,我还在例程的末尾添加了 Set xlApp = Nothing。这可能会清理一点,但它仍然没有解决问题。无论如何,谢谢大家。
  • @Adam 很高兴您找到了解决方案。我已经编辑了我的答案,更详细地说明了为什么原始代码不能可靠地工作。
  • 嗨 Portland Runner,非常感谢您的解释和代码。这有助于我理解很多!我的脚本现在运行顺利!谢谢!
【解决方案2】:

这个答案可能会提供一些额外的细节: http://support.microsoft.com/default.aspx?scid=kb;en-us;319832

您需要包含 xlApp 以指定您尝试引用的确切对象的解决方案,因为在打开两个 Excel 实例时,当您尝试发出像 Workbooks(..).Sheets(... ) 因为内存中有两个不同的 Workbooks 对象。

在使用 Range 对象时,我在 Word 和 Excel(自动化)之间进行编程时遇到了同样的问题。必须比这更具体一点,因为 Word 和 Excel 都有一个 Range 对象。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多