2013-04-03 70 views
5

Tôi đang viết một số mã VBA tự động đặt thuộc tính của một số biểu đồ, như phạm vi dữ liệu, khi mở tệp excel của tôi. Điều này là do thư viện tôi sử dụng để xuất Excel từ dự án .Net của tôi không hỗ trợ đầy đủ các thuộc tính biểu đồ.Làm thế nào để làm cho mã excel vba đủ điều kiện/cách phá vỡ lỗi thời gian chạy?

Tôi có 4 tờ biểu đồ và 1 trang dữ liệu trong tệp này.

Tuy nhiên, khi các khai mạc đầu tiên của tập tin, các lỗi sau đây được hiển thị:

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

Automation 
The object invoked has disconnected from its clients. 

(cũng có, khi mở cửa đầu tiên, một cảnh báo được chỉ ra rằng các tập tin có lẽ là không an toàn và tôi tự phải cho phép mở, nhưng tôi không chắc chắn nếu điều này có bất kỳ liên quan đến vấn đề này)

Mở tiếp theo của tệp này không kích hoạt lỗi.

tôi đã tìm kiếm trên stackoverflow và trên các diễn đàn và thấy this Microsoft KB article

Dựa trên các khuyến nghị đưa ra ở đó, tôi đã cố gắng để làm cho mã của tôi có đủ điều kiện (ví dụ bằng cách sử dụng Dim app As ApplicationDim wb As Workbook). Tuy nhiên, điều này không giải quyết được vấn đề của tôi.

Dòng vi phạm được đánh dấu bằng **

Câu hỏi của tôi là:

  1. Tôi đã thất bại trong việc thực hiện một số phần của mã của tôi có đủ điều kiện?
  2. Có bất kỳ lý do nào khác có thể xảy ra đối với lỗi này và nếu có, làm cách nào để có thể giải quyết được ?

Mã của tôi (trong đối tượng 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 Đối với câu hỏi được giải thích rõ ràng :) –

+0

Chụp trong bóng tối. Thêm 'DoEvents' trước dòng này' Với wb.Charts ("NameOfChart4") ' –

+0

' Dim app As Application' không đủ điều kiện. Thao tác này sẽ đặt 'ứng dụng' thành thư viện đối tượng đầu tiên mà nó đi qua trong các công cụ> Sắp xếp thứ tự sắp xếp. Tốt hơn để viết 'như Excel.Application' để tránh mơ hồ. – JimmyPena

Trả lời

1

Một vài điều cần lưu ý ... tại sao không bạn bằng cách sử dụng được xây dựng trong đối tượng Worksheets, nó sạch hơn so với bộ sưu tập Sheets? Ngoài ra nếu bảng tính trong Câu hỏi không phải là 'đầu tiên', nó phải có Kích hoạt được gọi trước khi bạn có thể truy cập các trường. (Tùy thuộc vào phiên bản của Excel, nó có thể cần phải được kích hoạt trong mọi trường hợp vì vậy tôi sẽ khuyên bạn nên làm nó bất kể), bạn có thể làm điều này:

wb.Sheets("nameOfWorksheet").Activate 

Hoặc

Worksheets("nameOfWorksheet").Activate 

Chỉ cần một lưu ý ở đây, bạn thực hiện rất nhiều cuộc gọi lặp lại thành các bộ sưu tập. Bạn không thể dựa vào trình biên dịch để tối ưu hóa điều đó cho bạn. Mỗi collection.get(), đặc biệt là nơi một chuỗi được giải quyết cho một số chỉ số ăn chu kỳ. Tốt hơn là lấy một tham chiếu và truy cập vào bảng tính bằng con trỏ đó và nhả nó khi hoàn thành.

0

Tôi gặp vấn đề tương tự nhưng tôi đã cố gắng tìm một giải pháp tốt. 1 trong các vấn đề chính với mã của tôi và nhận được lỗi này (bực bội) là tôi đã có End ở cuối khối mã là một phần của biểu mẫu mà tôi đã thay thế bằng Me.Hide.

Một điều khác giúp kiểm tra xem các biến toàn cục mà tôi đã khai báo (như một phần của mô-đun trình bày ứng dụng và sổ làm việc) là Nothing trong mã sử dụng chúng.

Nói cách khác:

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

Và có lẽ tương tự cho biến wb của bạn. Nó có thể là tốt để đặt breakpoint trong mã của bạn trước khi sử dụng các bảng tính và các đối tượng bảng tính để bước qua chúng để xem đó là dòng vi phạm.

Nếu không, hãy xem this Microsoft article để biết thêm một số vấn đề.

Tôi hy vọng điều này sẽ hữu ích.

PS. Mã của tôi là một bản nâng cấp từ Excel 2003 và nó hoạt động mọi lúc trong phiên bản cũ mà không có lỗi này.

Các vấn đề liên quan