web-dev-qa-db-ja.com

Chart.SetSourceDataを繰り返し呼び出すと、エラー1004が発生します。

会社のExcel2003で作成されたアプリケーションに問題があります。アプリケーションはソースからデータを取得し、VBAルーチンでSetSourceDataを使用してグラフを更新し、関連するデータが書き込まれるセルを含む範囲を渡します。

アプリケーションはOffice2003で正常に実行されますが、Office 2010で実行すると、次のエラーが発生します。

実行時エラー「1004」:オブジェクト「_Chart」のメソッド「SetSourceData」が失敗しました。

Office2010の単純なExcelファイルにForループを作成しましたが、範囲からグラフに渡される列の数に応じて、遅かれ早かれエラーが発生します。範囲内で渡される列が多いほど、表示が早くなります。これは、チャート内のシリーズの数に関連している必要があると思います(列が多いほどシリーズが多い)。

これは、Office2003には存在しなかったOffice2010で実装されたグラフオブジェクトまたはシリーズのある種のメカニズム/バッファーですか?同じForループをOffice2003で実行しても問題が発生することはなく、この問題を解決する方法がわかりません。

これまでのところ、エラーを制御するすべてのシリーズを削除するには、Goto命令を使用して、For Eachループを使用してSeriesCollection内のすべてのシリーズを削除し、チャートのSeriesCollection内のすべてのオブジェクトを選択しました。これを実行し、範囲を再度渡したときにアプリケーションの実行を再開すると、すべてのデータがチャートオブジェクトに正しく描画されます。

エラーを再現する例次のコードは、新しいExcel2010ワークブックのVBAモジュールに配置されます。 Sub setDataChartを実行すると、エラーメッセージが表示されるまでアプリケーションが実行されます。

    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
47
Pocerus

これは、エラーが発生する理由には対応していません。これは回避策です。

SetSourceDataを呼び出す前に、現在チャートにある既存のシリーズをすべて削除すると、コードは期待どおりに実行されます。

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

そもそもなぜエラーが発生するのかわかりませんが、これでエラーはなくなります。

もう1つの可能性は、Offset数式と適切な参照セルを使用して定義されたデータの名前付き範囲を定義することです。これには、データが連続している必要があり、最初の行と列を変更するのではなく、使用できる少なくとも1つの参照式(データを含む列/行の=COUNTA())を設定する必要がありますオフセット範囲の高さ/幅を設定します。

それ以外の場合は、これをマクロから取り出してワークシートロジックに配置するための非常に便利な小さな回避策です。

0
JMichael