Pr0*_*0no 48 excel charts vba excel-vba excel-formula
请考虑以下工作表:
A B C D
1 COMPANY XVALUE YVALUE GROUP
2 Apple 45 35 red
3 Xerox 45 38 red
4 KMart 63 50 orange
5 Exxon 53 59 green
Run Code Online (Sandbox Code Playgroud)
我在Excel中使用了scatterplot函数来创建以下图表:
但是,图表中的每个点都有一个附加属性:GROUP
.有四组:red
,orange
,black
和green
.我想相应地为每个点着色,这样我就可以看到一个模式(例如,组green
几乎总是位于图表的左侧).因为我的列表是500行长,我不能手动执行此操作.我该如何自动执行此操作?
cha*_*cea 79
您需要为每个颜色组创建一组额外的数据,以表示该特定组的Y值.您可以使用这些组在图表中创建多个数据集.
以下是使用您的数据的示例:
A B C D E F G
----------------------------------------------------------------------------------------------------------------------
1| COMPANY XVALUE YVALUE GROUP Red Orange Green
2| Apple 45 35 red =IF($D2="red",$C2,NA()) =IF($D2="orange",$C2,NA()) =IF($D2="green",$C2,NA())
3| Xerox 45 38 red =IF($D3="red",$C3,NA()) =IF($D3="orange",$C3,NA()) =IF($D3="green",$C3,NA())
4| KMart 63 50 orange =IF($D4="red",$C4,NA()) =IF($D4="orange",$C4,NA()) =IF($D4="green",$C4,NA())
5| Exxon 53 59 green =IF($D5="red",$C5,NA()) =IF($D5="orange",$C5,NA()) =IF($D5="green",$C5,NA())
Run Code Online (Sandbox Code Playgroud)
之后看起来应该是这样的:
A B C D E F G
---------------------------------------------------------------------
1| COMPANY XVALUE YVALUE GROUP Red Orange Green
2| Apple 45 35 red 35 #N/A #N/A
3| Xerox 45 38 red 38 #N/A #N/A
4| KMart 63 50 orange #N/A 50 #N/A
5| Exxon 53 59 green #N/a #N/A 59
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用不同的数据集生成图形.这是一张显示此示例数据的图片:
您可以更改系列(X;Y)
值B:B ; E:E
,B:B ; F:F
,B:B ; G:G
分别,使它使图形会自动更新,当您添加更多的数据.
Dav*_*ens 18
我回答了一个非常相似的问题:
您只需要遍历系列的.Points
集合,然后您可以.Format.Fill.ForeColor.RGB
根据您需要的任何条件分配点的值.
更新
下面的代码将根据屏幕截图为图表着色.这仅假设使用三种颜色.您可以为其他颜色值添加其他case语句,并myColor
为每个颜色值更新相应RGB值的分配.
Option Explicit
Sub ColorScatterPoints()
Dim cht As Chart
Dim srs As Series
Dim pt As Point
Dim p As Long
Dim Vals$, lTrim#, rTrim#
Dim valRange As Range, cl As Range
Dim myColor As Long
Set cht = ActiveSheet.ChartObjects(1).Chart
Set srs = cht.SeriesCollection(1)
'## Get the series Y-Values range address:
lTrim = InStrRev(srs.Formula, ",", InStrRev(srs.Formula, ",") - 1, vbBinaryCompare) + 1
rTrim = InStrRev(srs.Formula, ",")
Vals = Mid(srs.Formula, lTrim, rTrim - lTrim)
Set valRange = Range(Vals)
For p = 1 To srs.Points.Count
Set pt = srs.Points(p)
Set cl = valRange(p).Offset(0, 1) '## assume color is in the next column.
With pt.Format.Fill
.Visible = msoTrue
'.Solid 'I commented this out, but you can un-comment and it should still work
'## Assign Long color value based on the cell value
'## Add additional cases as needed.
Select Case LCase(cl)
Case "red"
myColor = RGB(255, 0, 0)
Case "orange"
myColor = RGB(255, 192, 0)
Case "green"
myColor = RGB(0, 255, 0)
End Select
.ForeColor.RGB = myColor
End With
Next
End Sub
Run Code Online (Sandbox Code Playgroud)