Программный доступ к имени источника данных диаграммы

StackOverflow https://stackoverflow.com/questions/605808

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть несколько диаграмм, которые я скопировал из идентичной книги, но исходные данные для каждой диаграммы (42 диаграммы по 6 серий в каждой) по-прежнему содержат полный путь к файлу.Исходный лист и ячейки идентичны, поэтому я просто хочу найти строку пути и заменить ее на «».Однако я не могу найти способ получить имя исходных данных (как оно отображается в поле повторной загрузки).Оттуда я могу заменить то, что мне нужно.

У нас есть следующее:

ActiveChart.SeriesCollection(1).Values = "='C:\[oldfile.xls]Charts.Data'!R1C17:R1C28"

И я просто хочу получить часть «» в виде строки и выполнить свою функцию по удалению пути к файлу.Если я попытаюсь получить из него строку, то есть:

sourcestring = ActiveChart.SeriesCollection(1).Values

Я получаю сообщение об ошибке;кажется, что VBA считает его массивом при чтении из него, но может использовать строку при назначении ему.Есть идеи?

Это было полезно?

Решение

Вы правы, вы не можете получить ту же формулу, которая отображается в поле повторного редактирования... вам нужно манипулировать свойством .Formula или .FormulaR1C1 в ряду, с которым вы работаете, и перестроить формулу и установить это к свойству значений и/или 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top