如何使Excel VBA代码完全合格/如何规避运行时错误?

我写了一些VBA代码,dynamic设置一些图表的属性,如数据范围,打开我的Excel文件。 这是因为我用来从我的.Net项目导出Excel的库不完全支持图表属性。

我有4个图表和1个数据表在这个文件。

但是,在文件首次打开时,会显示以下错误:

Run-Time Error: '-2147417848 (80010108)': Automation The object invoked has disconnected from its clients. 

(同样,第一次打开,警告显示该文件可能是不安全的,我手动必须允许打开,但我不知道这是否有任何关系到这个问题)

此文件的后续打开不会触发错误。

我search了stackoverflow和论坛,并发现这个微软知识库文章

基于在那里给出的build议,我试图让我的代码完全合格(例如使用Dim app As ApplicationDim wb As Workbook )。 但是,这并没有解决我的问题。

违规行标有**

我的问题是:

  1. 我没有使我的代码的某些部分完全合格吗?
  2. 这个错误是否还有其他可能的原因,如果是的话,他们如何解决?

我的代码(在ThisWorkbook对象中):

 Option Explicit Private Sub Workbook_Open() Dim app As Application Set app = Excel.Application Dim wb As Workbook Set wb = app.ThisWorkbook Dim lastRow As Long, lastRowString As String lastRow = wb.Sheets("NameOfDatasheet").UsedRange.Row - 1 + Sheets("NameOfDatasheet").UsedRange.Rows.Count 'Worksheets("NameOfDatasheet").Range("A2:G41").AutoFilter field:=1, Criteria1:="<>" With wb.Charts("NameOfChart1") .SetSourceData Source:=wb.Sheets("NameOfDatasheet").Range("A2:A" & lastRow & ",D2:E" & lastRow) 'Styling type 1 .SeriesCollection(1).Border.Color = RGB(255, 0, 0) .SeriesCollection(1).MarkerForegroundColor = RGB(255, 0, 0) .SeriesCollection(1).MarkerBackgroundColor = RGB(255, 0, 0) .SeriesCollection(1).MarkerStyle = xlMarkerStyleCircle .SeriesCollection(1).MarkerSize = 5 'Styling type 2 .SeriesCollection(2).Border.Color = RGB(0, 0, 255) .SeriesCollection(2).MarkerForegroundColor = RGB(0, 0, 255) .SeriesCollection(2).MarkerBackgroundColor = RGB(0, 0, 255) .SeriesCollection(2).MarkerStyle = xlMarkerStyleNone .SeriesCollection(2).MarkerSize = 5 End With With wb.Charts("NameOfChart2") .SetSourceData Source:=wb.Sheets("NameOfDatasheet").Range("A2:A" & lastRow & ",H2:I" & lastRow) 'Styling type 1 .SeriesCollection(1).Border.Color = RGB(255, 0, 0) .SeriesCollection(1).MarkerForegroundColor = RGB(255, 0, 0) .SeriesCollection(1).MarkerBackgroundColor = RGB(255, 0, 0) .SeriesCollection(1).MarkerStyle = xlMarkerStyleCircle .SeriesCollection(1).MarkerSize = 5 'Styling type 2 .SeriesCollection(2).Border.Color = RGB(0, 0, 255) .SeriesCollection(2).MarkerForegroundColor = RGB(0, 0, 255) .SeriesCollection(2).MarkerBackgroundColor = RGB(0, 0, 255) .SeriesCollection(2).MarkerStyle = xlMarkerStyleNone .SeriesCollection(2).MarkerSize = 5 End With Dim MaxVal As Variant, MinVal As Variant With wb.Charts("NameOfChart3") .SetSourceData Source:=wb.Sheets("NameOfDatasheet").Range("A2:A" & lastRow & ",F2:F" & lastRow) MaxVal = app.Max(wb.Sheets("NameOfDatasheet").Range("G2:G" & lastRow)) MinVal = app.Min(wb.Sheets("NameOfDatasheet").Range("G2:G" & lastRow)) If (MinVal = MaxVal) Then MinVal = 0 End If MaxVal = MaxVal + 0.1 MinVal = MinVal - 0.1 .Axes(xlValue).MinimumScale = MinVal .Axes(xlValue).MaximumScale = MaxVal End With With wb.Charts("NameOfChart4") **.SetSourceData Source:=wb.Sheets("NameOfDatasheet").Range("A2:A" & lastRow & ",B2:B" & lastRow)** MaxVal = app.Max(wb.Sheets("NameOfDatasheet").Range("C2:C" & lastRow)) MinVal = app.Min(wb.Sheets("NameOfDatasheet").Range("C2:C" & lastRow)) If (MinVal = MaxVal) Then MinVal = 0 End If MaxVal = MaxVal + 0.1 MinVal = MinVal - 0.1 .Axes(xlValue).MinimumScale = MinVal .Axes(xlValue).MaximumScale = MaxVal End With End Sub 

一些事情要考虑…为什么不使用内置的工作表对象,它比Sheets集合更干净? 另外,如果问题中的工作表不是“第一”,则必须先激活“调用”,然后才能访问字段。 (取决于Excel的版本,它可能需要在任何情况下被激活,所以我会build议不pipe)你可以这样做:

 wb.Sheets("nameOfWorksheet").Activate 

要么

 Worksheets("nameOfWorksheet").Activate 

这里只是一个说明,你做了很多重复调用集合。 你不能指望编译器为你优化。 每一个collection.get(),尤其是一个string被parsing为一个索引号的地方,会吃掉一些周期。 最好抓住一个引用,并通过该指针访问工作表,并在完成时释放它。

我有同样的问题,但我努力寻找一个好的解决scheme。 我的代码的主要问题之一,得到这个( 令人沮丧的 )错误是,我已经End了一个代码块的一部分,这是一个forms,我用Me.Hide取代的Me.Hide

另一个帮助的是testing我声明的全局variables(作为代表应用程序和工作簿的模块的一部分)是否在使用它们的代码中。

换一种说法:

 If app Is Nothing Then Set app = Excel.Application End If 

也许你的wbvariables也一样。 在使用工作簿和工作表对象来逐步查看哪些是违规行之前,在代码中放置断点可能会很好。

否则,请查看此Microsoft文章以了解有关此事的一些信息。

我希望这有帮助。

PS。 我的代码是来自Excel 2003的升级版本,并且它始终在旧版本中运行,而不会出现此错误。