2013-08-27 3 views
1

Я разрабатываю симулятор на основе Excel, который запускает конкретный тест 1000 раз. Результатом каждого теста является две координаты. Эти координаты записываются в диапазон. Затем я создаю граф X-Y Scatter на основе этого диапазона.Как изменить цвет точки на графе рассеяния в VBA/Excel как функцию координат X, Y самой точки?

Теперь я хочу выполнить цикл каждой из 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 

Однако я не могу разработать способ получить Х и Y значение для выполнения требуемой функции на них. Я могу варьировать цвет в соответствии с количеством самой точки (от 1 до 1000), но это не то, что я хочу сделать - цвет является функцией координаты X, Y каждой точки. Стоит сказать, что диапазоны координат X и Y являются переменными, т. Е. Тест не возвращает результаты, которые имеют одинаковый масштаб каждый раз.

Любая помощь будет чрезвычайно оценена и благодарна вам заранее.

ответ

2

Вот простой пример того, как получить доступ к й и у значения для каждой точки:

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 
+0

Спасибо за это, Тим. Позвольте мне сыграть и посмотреть, смогу ли я сделать эту работу. В одночасье я также использовал возможность включения Datalabels, извлечение текста и разбиение его (не элегантный, я понимаю), однако я еще не понял, как включить ярлыки X и Y. Я буду первым (кажется, проще). Я отправлю свое решение, как только я его заработаю. Еще раз спасибо, Марк. – user2723257

+0

Работал отлично, и, используя http://www.mcpher.com/Home/excelquirks/snippets/heatmap, у меня есть отличный результат. – user2723257