2013-04-03 42 views
5

我正在写一些VBA代码,它可以在打开我的excel文件时动态设置某些图表的属性,如数据范围。这是因为我用于从.Net项目导出Excel的库不完全支持图表属性。如何使excel vba代码完全合格/如何规避运行时错误?

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

然而,在该文件的第一开口,示出了以下错误:

Run-Time Error: '-2147417848 (80010108)': 

Automation 
The object invoked has disconnected from its clients. 

(也,在所述第一开口中,示出一个警告,该文件可能是不安全的,并手动我必须允许打开,但我不确定这是否与此问题有任何关系)

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

我搜索的计算器和论坛,发现this Microsoft KB article

基础上给出有建议,我尝试(使用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 
+0

+ 1对于一个很好解释的问题:) –

+0

在黑暗中拍摄。在这行之前添加'DoEvents' With wb.Charts(“NameOfChart4”)' –

+0

'Dim app As Application' does not fully qualified。这会将“app”设置为它在工具>引用排序顺序中遇到的第一个对象库。最好写作'Excel.Application'以避免含糊不清。 – JimmyPena

回答

1

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

wb.Sheets("nameOfWorksheet").Activate 

或者

Worksheets("nameOfWorksheet").Activate 

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

0

我有同样的问题,但我努力寻找一个好的解决方案。 与我的代码和获取此(令人沮丧的)的主要问题之一是错误是我有End在一个代码块的一部分,这是一个形式,我用Me.Hide取代的一部分的末尾。

帮助的另一件事是测试我声明的全局变量(作为表示应用程序和工作簿的模块的一部分)是否在使用它们的代码中为Nothing

换句话说:

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

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

否则,请查看this Microsoft article了解相关情况。

我希望这会有所帮助。

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