2014-10-22 20 views
46

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 
+1

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. –

+0

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

+2

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ó. –

Trả lời

15

Điều này không giải thích tại sao lỗi xảy ra. Đây là một giải pháp.

Trước khi gọi SetSourceData, hãy xóa tất cả chuỗi hiện có hiện có trong biểu đồ và mã sẽ chạy như mong đợi.

For j = cht.Chart.SeriesCollection.Count To 1 Step -1 
    cht.Chart.SeriesCollection(j).Delete 
Next j 

Tôi không chắc chắn tại sao lỗi xảy ra ngay từ đầu, nhưng điều này làm cho nó biến mất.

+0

Cảm ơn sự giúp đỡ của bạn Jean-François. Thật không may tôi đã không tìm thấy bất kỳ thông tin về vấn đề này với Chart/Series cho đến nay. Tôi sẽ cố gắng điều tra thêm một chút về vấn đề này và sử dụng giải pháp được đề xuất của bạn trong thời gian này. – Pocerus

0

Một khả năng khác là xác định phạm vi được đặt tên cho dữ liệu được xác định bằng cách sử dụng công thức Offset và các ô tham chiếu thích hợp. Điều này yêu cầu dữ liệu tiếp giáp, không thay đổi hàng đầu tiên & cột bắt đầu và để bạn thiết lập ít nhất một công thức tham chiếu (=COUNTA() trên cột/hàng chứa dữ liệu) có thể được sử dụng để đặt chiều cao/chiều rộng của phạm vi bù đắp.

Nếu không, hãy sử dụng các macro và đặt nó vào trong bảng tính logic.

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