Tôi gặp sự cố với một ứng dụng được tạo trong Excel 2003 trong công ty của tôi. Ứng dụng truy xuất dữ liệu từ một nguồn và cập nhật Biểu đồ bằng cách sử dụng SetSourceData
trong quy trình VBA thông qua Phạm vi chứa các ô nơi dữ liệu có liên quan được ghi.Các cuộc gọi lặp lại của Chart.SetSourceData cho lỗi 1004
Ứng dụng này chỉ chạy tốt trong Office 2003, nhưng khi ứng dụng được thực hiện trong Office 2010 nó mang lại cho lỗi này:
Run-time error '1004': Method 'SetSourceData' of object'_Chart' failed.
Tôi đã tạo ra một vòng lặp For
trong một file Excel đơn giản trong Office 2010 và tùy về số cột được chuyển trong Phạm vi tới Biểu đồ, lỗi sẽ sớm xuất hiện. Càng nhiều cột được truyền trong phạm vi thì càng sớm càng xuất hiện. Tôi đoán điều này phải được liên quan với số lượng các chuỗi trong bảng xếp hạng (nhiều cột hơn loạt).
Đây có phải là một số loại cơ chế/bộ đệm trong đối tượng biểu đồ hoặc chuỗi được triển khai trong Office 2010 không tồn tại trong Office 2003 không? Các vòng lặp For
giống nhau không bao giờ cho thấy một vấn đề khi nó được chạy trong Office 2003 và tôi không chắc chắn làm thế nào để giải quyết vấn đề này.
Cho đến nay tôi chỉ có thể xóa tất cả Chuỗi kiểm soát lỗi bằng lệnh Goto để xóa tất cả chuỗi trong SeriesCollection bằng cách sử dụng vòng lặp For Each
để chọn tất cả các đối tượng trong SeriesCollection của Biểu đồ. Nếu tôi làm điều này và tiếp tục thực hiện các ứng dụng khi tôi vượt qua dãy một lần nữa tất cả các dữ liệu được vẽ trong đối tượng biểu đồ đúng.
Ví dụ để tạo lại lỗi. Mã sau đây được đặt trong mô-đun VBA trong sổ làm việc Excel 2010 mới. Chạy Sub setDataChart
và ứng dụng sẽ chạy cho đến khi thông báo lỗi hiển thị.
Sub setDataChart()
Call createAColValues
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
ActiveChart.SetSourceData Source:=Range("A1:FA6"), PlotBy:=xlColumns
ActiveSheet.ChartObjects(1).Activate
With ActiveChart.Parent
.Height = 325
.Width = 900
.Top = 120
.Left = 10
End With
Call updateValues
Call sendData
End Sub
Sub sendData()
Dim cht As ChartObject
Set cht = ActiveSheet.ChartObjects(1)
'On Error GoTo delSeries:
For i = 0 To 1000
cht.Chart.SetSourceData Source:=ActiveSheet.Range("A1:FA6"), PlotBy:=xlColumns
Next i
End Sub
Sub createAColValues()
Range("A1").Select
ActiveCell.FormulaR1C1 = "1"
Range("A2").Select
ActiveCell.FormulaR1C1 = "2"
Range("A1:A2").Select
Selection.AutoFill Destination:=Range("A1:A6"), Type:=xlFillDefault
Range("A1:A6").Select
End Sub
Sub updateValues()
Range("B1").Select
ActiveCell.FormulaR1C1 = "=RANDBETWEEN(0,10)"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B6"), Type:=xlFillDefault
Range("B1:B6").Select
Selection.AutoFill Destination:=Range("B1:FA6"), Type:=xlFillDefault
Range("B1:FA6").Select
End Sub
Không thành công sau 209 lần lặp; Tôi không biết tại sao. Tuy nhiên, nếu tôi xóa tất cả các chuỗi ở đầu mỗi lần lặp (sử dụng ví dụ 'Đối với j = cht.Chart.SeriesCollection.Count To 1 Bước -1: cht.Chart.SeriesCollection (j) .Xóa: Tiếp theo j') thì nó hoạt động tốt. –
Xin chào Jean-François, nếu bạn thay đổi số chuỗi nó sẽ thất bại ở một số lần lặp khác nhau, số lượng chuỗi càng lớn thì càng sớm càng thất bại. Tôi chỉ tò mò về lý do tại sao cùng một đối tượng và cùng một mã tạo ra các kết quả khác nhau trong các phiên bản Office khác nhau. Tôi đoán tôi sẽ phải kiểm soát lỗi và tiến hành xóa chuỗi trong biểu đồ bằng mã của bạn và tiếp tục thực thi mã sau khi chuỗi bị xóa.Cảm ơn sự giúp đỡ của bạn. – Pocerus
Công cụ biểu đồ Excel đã được xây dựng lại hoàn toàn cho Excel 2007 và công cụ này đã được sử dụng kể từ đó. Có rất nhiều thay đổi, tốt nhất, một vài điều xấu. Ngoài ra nhiều hành vi nhỏ trong VBA là khác nhau. Bạn có thể hỏi tại sao một cái gì đó là, và không ai thực sự biết khác hơn là trích dẫn các công cụ biểu đồ cập nhật. Nếu bạn có thể nhận giải pháp cho bất kỳ vấn đề nào của bạn, giống như một vấn đề mà Jean-François đã đăng, hãy chạy với nó. –