Programaticamente nome fonte de dados gráfico de acesso
Pergunta
Eu tenho algumas cartas que eu copiados ao longo de uma pasta de trabalho idênticas, mas os dados de origem para cada gráfico (42 cartas, com 6 séries em cada) ainda contém o caminho nome do arquivo completo. A folha de origem e as células são idênticas, então eu só quero encontrar a cadeia de caminho e substituí-lo com "". No entanto, não consigo encontrar uma maneira de obter o nome do SourceData (como aparece na caixa RefEdit). De lá, eu posso substituir o que eu preciso.
O que temos é esta:
ActiveChart.SeriesCollection(1).Values = "='C:\[oldfile.xls]Charts.Data'!R1C17:R1C28"
E eu só quero pegar o papel em "" como uma string, e realizar minha função para remover o caminho de arquivo. Se eu tentar obter uma string a partir dele, ou seja:
sourcestring = ActiveChart.SeriesCollection(1).Values
Eu recebo um erro; parece VBA considera que é um array ao ler a partir dele, mas pode usar uma corda ao atribuir a ele. Alguma idéia?
Solução
Você está certo, você não pode realmente sair a mesma fórmula que é exibido na caixa RefEdit ... você tem de manipular a propriedade .Formula ou .FormulaR1C1 na série você está trabalhando com, e reconstruir o fórmula e conjunto que a valores e / ou XValues ??propriedade.
Este código deve funcionar, existem algumas funções para retirar diferentes partes da fórmula ... eu acho que deveria trabalhar para você, ou pelo menos esperamos ajudá-lo a descobrir o que é melhor para fazer ...
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