0

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

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

Workbooks("Overview Tracker.xlsb").Activate

在 IF THEN Sub 中, 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
4

2 回答 2

1

两者alreadyDonefixProcess在关闭 excel。尝试将 testProcessed 移动到主子中并Excel.Application.Quit从两者中删除alreadyDone和子fixProcess


编辑

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
于 2013-10-05T00:13:58.083 回答
0

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

您需要包含 xlApp 以指定您尝试引用的确切对象的解决方案,因为在打开两个 Excel 实例的情况下,当您尝试发出像 Workbooks(..).Sheets(...) 这样的命令时,它会感到困惑,因为那里本质上是内存中两个不同的 Workbooks 对象。

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

于 2013-12-12T20:27:08.817 回答