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 Application
và Dim 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à:
- 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?
- 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
+ 1 Đối với câu hỏi được giải thích rõ ràng :) –
Chụp trong bóng tối. Thêm 'DoEvents' trước dòng này' Với wb.Charts ("NameOfChart4") ' –
' 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