会社の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
これは、エラーが発生する理由には対応していません。これは回避策です。
SetSourceData
を呼び出す前に、現在チャートにある既存のシリーズをすべて削除すると、コードは期待どおりに実行されます。
For j = cht.Chart.SeriesCollection.Count To 1 Step -1
cht.Chart.SeriesCollection(j).Delete
Next j
そもそもなぜエラーが発生するのかわかりませんが、これでエラーはなくなります。
もう1つの可能性は、Offset
数式と適切な参照セルを使用して定義されたデータの名前付き範囲を定義することです。これには、データが連続している必要があり、最初の行と列を変更するのではなく、使用できる少なくとも1つの参照式(データを含む列/行の=COUNTA()
)を設定する必要がありますオフセット範囲の高さ/幅を設定します。
それ以外の場合は、これをマクロから取り出してワークシートロジックに配置するための非常に便利な小さな回避策です。