グラフのソースデータ名にプログラムでアクセスする
質問
同一のブックからコピーしたいくつかのチャートがありますが、各チャートのソースデータ(42チャート、それぞれ6シリーズ)にはまだ完全なファイル名パスが含まれています。ソースシートとセルは同一であるため、パス文字列を見つけて""に置き換えたいだけです。ただし、(refeditボックスに表示されるように)ソースデータの名前を取得する方法が見つかりません。そこから、必要なものを置き換えることができます。
これは次のとおりです:
ActiveChart.SeriesCollection(1).Values =" = 'C:\ [oldfile.xls] Charts.Data'!R1C17:R1C28"
そして""の一部を取得したいだけです。文字列として、私の機能を実行してファイルパスを削除します。私はそれから文字列を取得しようとすると、すなわち:
sourcestring = ActiveChart.SeriesCollection(1).Values
エラーが発生しました。 VBAは読み取り時に配列と見なしますが、割り当てるときに文字列を使用できます。アイデアはありますか?
解決
そうです、refeditボックスに表示されるのと同じ式を実際に取得することはできません...作業しているシリーズの.Formulaまたは.FormulaR1C1プロパティを操作し、再構築する必要があります数式を作成し、valuesまたはxvaluesプロパティに設定します。
このコードは機能するはずです、式のさまざまな部分を引き出すための関数がいくつかあります...私はそれがあなたのために働くと思うか、少なくともうまくいけば何が最善かを理解するのに役立ちます...
Sub ChangeActiveChartData()
ChangeChartData ActiveChart
End Sub
Sub ChangeChartData(TheChart As Chart)
If TheChart Is Nothing Then Exit Sub
Dim TheSeries As Series
Set TheSeries = TheChart.SeriesCollection(1)
Dim TheForm As String
TheForm = TheSeries.FormulaR1C1
Dim XValsForm As String
XValsForm = GetXValuesFromFormula(TheForm)
Debug.Print XValsForm
XValsForm = GetRangeFormulaFromFormula(XValsForm)
Debug.Print XValsForm
Dim ValsForm As String
ValsForm = GetValuesFromFormula(TheForm)
Debug.Print ValsForm
ValsForm = GetRangeFormulaFromFormula(ValsForm)
Debug.Print ValsForm
XValsForm = "=" & TheChart.Parent.Parent.Name & "!" & XValsForm ' TheChart's parents parent is the worksheet; we're assuming the chart is embedded in a worksheet
ValsForm = "=" & TheChart.Parent.Parent.Name & "!" & ValsForm
TheSeries.XValues = XValsForm
TheSeries.Values = ValsForm
End Sub
Function GetXValuesFromFormula(SeriesFormula As String) As String
' Find string between first and second commas
Dim FormulaParts() As String
FormulaParts = Split(SeriesFormula, ",")
GetXValuesFromFormula = FormulaParts(1)
End Function
Function GetValuesFromFormula(SeriesFormula As String) As String
' Find string between second and third commas
Dim FormulaParts() As String
FormulaParts = Split(SeriesFormula, ",")
GetValuesFromFormula = FormulaParts(2)
End Function
Function GetRangeFormulaFromFormula(TheFormula As String) As String
' return to the right of the ! character in theformula
Dim ExclamPos As Integer
ExclamPos = InStrRev(TheFormula, "!")
If ExclamPos > 0 Then
GetRangeFormulaFromFormula = Right(TheFormula, Len(TheFormula) - ExclamPos)
Else
GetRangeFormulaFromFormula = TheFormula
End If
End Function