VBA脚本第一次运行正常,第二次错误'超出范围'

时间:2013-10-04 21:21:14

标签: excel vba

运行VBA脚本的Access数据库出现了一个奇怪的问题,在将Excel文档用作链接表之前调用Excel文档来运行一些修复程序。

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

Workbooks("Overview Tracker.xlsb").Activate

在IF THEN Sub中,testProcessed() (我只是将该行放入以查看是否首先激活工作簿会有所帮助,但它没有 - 它在该行上失败或下一行是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

2 个答案:

答案 0 :(得分:1)

alreadyDonefixProcess都在关闭excel。尝试将testProcessed移至main sub并从Excel.Application.QuitalreadyDone subs中移除fixProcess


修改

Excel不会将您在主子网站中打开的应用程序实例“传递”到其他潜水艇。您可以显式调用其他子文件中的表单,这会使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

答案 1 :(得分:0)

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

您需要包含xlApp的解决方案来指定您要引用的确切对象,因为打开了两个Excel实例,当您尝试发出类似Workbooks(..)的命令时会感到困惑。表(...) )因为内存中基本上有两个不同的Workbooks对象。

使用Range对象时,我遇到了在Word和Excel(自动化)之间编程的相同问题。不得不更具体一点,因为Word和Excel都有一个Range对象。