Как мога да променя цвета на точка върху точкова графика във VBA/Excel като функция на координатите X, Y на самата точка?

Разработвам базиран на Excel симулатор, който изпълнява конкретен тест 1000 пъти. Резултатът от всеки тест е две координати. Тези координати се записват в диапазон. След това създавам X-Y Scatter графика въз основа на този диапазон.

Това, което сега искам да направя, е да премина през всяка от 1000 точки на графиката и да променя цвета на тази точка въз основа на координатите X и Y на точката. По-конкретно, искам да взема X Mod (Half Max X) и Y Mod (Half Max Y), за да създам ефекта, че интензитетът на цвета ще нараства с точките близо до средата на графиката.

Кодът, който искам да използвам, е следният:

Temp = "'" + FirstCalcs.Name + "'!" + FirstCalcs.Cells(SOWD + 3, 2).Address + ":" + FirstCalcs.Cells(SOWD + 3, NumOfTests + 1).Address
Temp2 = "'" + FirstCalcs.Name + "'!" + FirstCalcs.Cells(SOWD + 4, 2).Address + ":" + FirstCalcs.Cells(SOWD + 4, NumOfTests + 1).Address
Set chtChart = Charts.Add
With chtChart

    Do Until .SeriesCollection.Count = 1     ' remove extra series, which Excel spawns like rabbits, for some reason
        .SeriesCollection(1).Delete
    Loop

    .Name = Institution + " summary"
    .ChartType = xlXYScatter
    'Link to the source data range.

    '.SetSourceData Source:=FirstCalcs.Range(Temp)

    .SeriesCollection(1).Values = Temp2
    .SeriesCollection(1).XValues = Temp

    For Each pts In .SeriesCollection(1).Points

            .Format.Fill.Solid

            'The next line is what I can't figure out
            .MarkerBackgroundColor = RGB(XFunctionOf(.pts.XCoor),  YFunctionOf(.pts.YCoor), 128)

            .MarkerStyle = xlMarkerStyleDiamond
            .MarkerSize = 10
    End With

    Next i

    .HasTitle = True
    .ChartTitle.Text = "Summary"
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "T"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Time before T achieved"
    .HasLegend = False

End With

Въпреки това не мога да намеря начин да получа стойността на X И Y, за да изпълня необходимата функция върху тях. Мога да променя цвета според номера на самата точка (1 до 1000), но това не е, което искам да направя - цветът е функция на координатите X, Y на всяка точка. Струва си да се каже, че обхватите както на X, така и на Y координатите са променливи, т.е. тестът не връща резултати, които са в една и съща скала всеки път.

Всяка помощ ще бъде изключително оценена и благодарим предварително.


person user2723257    schedule 27.08.2013    source източник


Отговори (1)


Ето прост пример за това как да получите достъп до стойността на x и y за всяка точка:

Sub Tester()

    Dim s As Series, i As Long, x, y

    Set s = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)

    For i = 1 To s.Points.Count
        x = s.XValues(i)
        y = s.Values(i)
        If x > 3 And y < 40 Then
            s.Points(i).MarkerBackgroundColor = vbRed
        End If
    Next i

End Sub
person Tim Williams    schedule 27.08.2013
comment
Благодаря за това, Тим. Остави ме да играя и да видя дали мога да го направя. През нощта също използвах включването на етикети за данни, извличане на текста и разделянето му (не е елегантно, разбирам), но все още не съм разбрал как да включа етикетите X и Y. Първо ще твоето (изглежда по-просто). Ще публикувам моето решение, след като го накарам да работи. Благодаря отново, Марк. - person user2723257; 28.08.2013
comment
Работи перфектно и използва mcpher.com/Home/excelquirks/snippets/heatmap както и аз имам страхотен резултат. - person user2723257; 28.08.2013