基于数组中的值的颜色形状
我正试图自动化在excel中的形状依赖于表中的值。 我采取的方法是将表读入一个数组,然后我想用它来确定如何着色形状。 我遇到的问题是当我使用数组来select一个形状,它会出现,我得到一个数组索引号,而不是实际值。
因为我花了几个小时试图find一个没有运气的结果,所以我会大大地指出正确的方向。
表格数据:
Shape Value AB 900 DD 99 DG 647 EH 513 FK 191 G 446 HS 369 IV 259 KA 601 KW 351 KY 23 ML 509 PA 987 PH 167 TD 325 ZE 873
VBA代码:
Public i As Variant Public j As Integer Function mkArray() Dim areaArr As Variant areaArr = Range("I1:J16").Value Sheets("Sheet1").Select For i = 1 To UBound(areaArr, 1) For j = 1 To UBound(areaArr, 2) Debug.Print areaArr(i, j) Next j Call colourShapes Next i End Function Sub colourShapes() If j >= 500 Then Call formatGreen Else Call formatRed End If End Sub Sub formatGreen() With ActiveSheet .Shapes(i).Fill.ForeColor.SchemeColor = 11 End With End Sub Sub formatRed() With ActiveSheet .Shapes(i).Fill.ForeColor.SchemeColor = 2 End With End Sub
非常感谢。
你不需要这个全局variables。 更简单的版本可能是这样的:
Function mkArray() Const COLR_GREEN As Long = 11 Const COLR_RED As Long = 2 Dim areaArr As Variant, i As Long areaArr = ActiveSheet.Range("I1:J16").Value For i = 1 To UBound(areaArr, 1) Debug.Print areaArr(i, 1), areaArr(i, 2) Sheets("Sheet1").Shapes(areaArr(i, 1)).Fill.ForeColor.SchemeColor = _ IIf(areaArr(i, 2) > 500, COLR_GREEN, COLR_RED) Next i End Function
如果你真的想分割成独立的子文件,那么你应该使用参数来代替全局variables:
例如
Function mkArray() Dim areaArr As Variant, i As Long areaArr = ActiveSheet.Range("I1:J16").Value For i = 1 To UBound(areaArr, 1) ColorShape Cstr(areaArr(i, 1)), areaArr(i, 2) Next i End Function Sub ColorShape(shpName as string, shpVal) Const COLR_GREEN As Long = 11 Const COLR_RED As Long = 2 Sheets("Sheet1").Shapes(shpName).Fill.ForeColor.SchemeColor = _ IIf(shpVal > 500, COLR_GREEN, COLR_RED) End Sub
这可能会起作用:
Sub myColor() Dim rng As Excel.Range Dim row As Excel.Range Dim cell As Excel.Range Set rng = Range("I2:J17") i = 1 For Each row In rng.Rows myShapeName = row.Cells(1, 1).Value myShapeValue = row.Cells(1, 2).Value If myShapeValue >= 500 Then myFill = 11 Else myFill = 2 End If ActiveSheet.Shapes(i).Fill.ForeColor.SchemeColor = myFill i = i + 1 Next End Sub