Question

J'ai copié certains graphiques d'un classeur identique, mais les données source de chaque graphique (42 graphiques, avec 6 séries dans chacune) contiennent toujours le chemin d'accès complet au nom de fichier. La feuille source et les cellules sont identiques, je souhaite simplement rechercher la chaîne de chemin d'accès et la remplacer par "". Cependant, je ne peux pas trouver le moyen d'obtenir le nom du sourcedata (tel qu'il apparaît dans la zone de modification). À partir de là, je peux remplacer ce dont j'ai besoin.

Voici ce que nous avons:

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

Et je veux juste que la partie soit dans """ comme une chaîne, et effectuer ma fonction pour supprimer le chemin de fichier. Si j’essaie d’obtenir une chaîne, c’est-à-dire:

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

Je reçois une erreur; il semble que VBA le considère comme un tableau lors de la lecture de celui-ci, mais peut utiliser une chaîne pour l'affecter. Des idées?

Était-ce utile?

La solution

Vous avez raison, vous ne pouvez pas obtenir la même formule que celle affichée dans la zone de modification: vous devez manipuler la propriété .Formula ou .FormulaR1C1 de la série sur laquelle vous travaillez et reconstruire le formule et définissez-le sur la propriété values ??et / ou xvalues.

Ce code devrait fonctionner, il existe quelques fonctions pour extraire différentes parties de la formule ... Je pense que cela devrait fonctionner pour vous, ou du moins, espérons-nous vous aider à déterminer ce qu'il y a de mieux à faire ...

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top