Pregunta

Tengo algunos gráficos que he copiado de un libro de trabajo idéntico, pero los datos de origen de cada gráfico (42 gráficos, con 6 series en cada uno) aún contienen la ruta completa del nombre de archivo. La hoja de origen y las celdas son idénticas, así que solo quiero encontrar la cadena de ruta y reemplazarla con " " ;. Sin embargo, no puedo encontrar una manera de obtener el nombre de la fuente (como aparece en el cuadro de refedit). A partir de ahí, puedo reemplazar lo que necesito.

Lo que tenemos es esto:

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

Y solo quiero obtener la parte en " " como una cadena, y realizar mi función para eliminar la ruta de archivo. Si intento obtener una cadena, es decir:

sourcestring = ActiveChart.SeriesCollection (1) .Values ??

Me sale un error; Parece que VBA lo considera una matriz al leerlo, pero puede usar una cadena al asignárselo. ¿Alguna idea?

¿Fue útil?

Solución

Tienes razón, realmente no puedes eliminar la misma fórmula que se muestra en el cuadro refedit ... tienes que manipular la propiedad .Formula o .FormulaR1C1 en la serie con la que estás trabajando, y reconstruir la formula y configúralo con los valores y / o la propiedad xvalues.

Este código debería funcionar, hay algunas funciones para extraer diferentes partes de la fórmula ... Creo que debería funcionar para usted, o al menos con suerte ayudarlo a descubrir qué es lo mejor que puede hacer ...

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top