Как получить x- и y-диапазоны ряда в VBA? - PullRequest
0 голосов
/ 01 марта 2019

Как получить диапазоны x и y ряда в VBA?

Код VBA должен выглядеть примерно так:

Sub Getxyrng(ch as chart)
Dim ser As series
Dim xrng As Range
Dim yrng As Range

Set ser = ch.SeriesCollection(1) ' the series with a x- and y-range already referenced

Set xrng = ser.xvalues 'this doesn't work
Set yrng = ser.Values  'what would the code need to look like in order to return a range?

End Sub

Так чтовопрос заключается в том, какое свойство типа серии является диапазоном x- / y, который содержит исходные данные их ряда. Если вы вручную измените диапазон, он будет выглядеть следующим образом:

enter image description here

Итак, вручную это доступно примерно так: щелкните левой кнопкой мыши> выберите данные> изменить

Это означает, что должно быть свойство, которое сохраняет эти ссылки на диапазон.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Будет ли что-то подобное для вас работать?

Sub GetSourceCellsAddress()

Dim MyArr() As String
Dim xrng As Range, yrng As Range

MyArr() = Split(ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Formula, ",")
Set yrng = Range(MyArr(UBound(MyArr) - 1))
Set xrng = Range(MyArr(UBound(MyArr) - 2))

End Sub

Ввод:

enter image description here

Выход:

enter image description here

0 голосов
/ 01 марта 2019

Хорошо, я признаю это.Я не очень горжусь решением, но оно делает свою работу.Как уже указывалось в комментариях к вопросу, одним из способов решения этой проблемы является анализ свойства .formula.Следует обратить внимание на то, что заголовок серии может содержать запятую, поэтому решение сначала фильтрует последний апостроф, а затем использует запятые в качестве разделителей.

Private Function GetSerRng(ser As series, Xval As Boolean) As Range
Dim f As String
Dim i As Integer
Dim parts As New Collection
f = ser.Formula

' filter "
For i = 1 To 2
    f = Right(f, Len(f) - InStr(1, f, """"))
Next i

' split by ,
While InStr(f, ",") <> 0
    parts.Add Replace(Left(f, InStr(2, f, ",")), ",", vbNullString)
    f = Right(f, Len(f) - InStr(2, f, ","))
Wend

' set Range
If Xval Then
Set GetSerRng = Range(parts(1))
Else
Set GetSerRng = Range(parts(2))
End If
End Function

Это не самое элегантное решение, но оноработы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...