2013-04-03 43 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升級的,並且它始終在舊版本中運行,而不會出現此錯誤。