Excel 彩色特殊字符的总和
Excel Sum of Colored Special Characters
你好 Whosebug 社区
我试图自动计算每列的模块 + 小时数。最终我放弃了,因为我没有足够的经验并且使用的符号是特殊字符+彩色。
在 Excel 单元格中显示“u u”
- 红色和黄色“u u”表示 2h
- 绿色和黄色“u u”表示 1h
- 蓝色和黄色“u u”表示 0.5h
是否可以制作一个VBA公式来对字符求和?
到目前为止我尝试使用的代码是:
Public Function SumColorRed(pRange1 As Range, pRange2 As Range) As Double
Application.Volatile
Dim rng As Range
For Each rng In pRange1
If rng.Font.Color = pRange2.Font.Color Then
SumColor = SumColor + 2
End If
Next
End Function
提前致谢
第一件事很简单:单元格文本实际上是 u u
,只是用 Font WinDings 格式化后会显示 ◆
如果使用rng.Font.Color
读取或设置颜色,则表示该颜色对整个单元格有效。如果您想获取(或设置)单个字符的颜色(或其他属性,如粗体或斜体),您可以使用 Characters
-属性。您需要将开始和长度指定为参数,例如 rng.Characters(3, 1)
到单元格的第 3 个字符。
以下代码查看单元格的第一个和第三个字符并检查颜色。我不能 100% 确定我的颜色定义与您 sheet 中使用的颜色完全一致,也许您必须调整常量定义。
Function getColorTime(cell As Range) As Date
Const redCharColor = &HFF&
Const yellowCharColor = &HC0FF&
Const greenCharColor = &H50B000
Const blueCharColor = &HC07000
Dim c1 As Long, c2 As Long
c1 = cell.Characters(1, 1).Font.Color
c2 = cell.Characters(3, 1).Font.Color
' Debug.Print c1, c2
If c1 = redCharColor And c2 = yellowCharColor Then
getTime = TimeSerial(2, 0, 0)
ElseIf c1 = yellowCharColor And c2 = greenCharColor Then
getTime = TimeSerial(1, 0, 0)
ElseIf c1 = blueCharColor And c2 = greenCharColor Then
getTime = TimeSerial(0, 30, 0)
End If
End Function
这是我的两分钱:
C1
中的公式:
=CountColor(A1:A4)
引用 UDF:
Function CountColor(rng As Range) As Double
Dim cl As Range
For Each cl In rng
Select Case cl.Characters(1, 1).Font.Color & "|" & cl.Characters(3, 1).Font.Color
Case "255|49407"
CountColor = CountColor + 2
Case "12874308|4697456"
CountColor = CountColor + 1
Case "49407|4697456"
CountColor = CountColor + 0.5
Case Else
CountColor = CountColor
End Select
Next
End Function
显然,您想找出 color-codes 作为您的“王牌”。
你好 Whosebug 社区
我试图自动计算每列的模块 + 小时数。最终我放弃了,因为我没有足够的经验并且使用的符号是特殊字符+彩色。
在 Excel 单元格中显示“u u”
- 红色和黄色“u u”表示 2h
- 绿色和黄色“u u”表示 1h
- 蓝色和黄色“u u”表示 0.5h
是否可以制作一个VBA公式来对字符求和?
到目前为止我尝试使用的代码是:
Public Function SumColorRed(pRange1 As Range, pRange2 As Range) As Double
Application.Volatile
Dim rng As Range
For Each rng In pRange1
If rng.Font.Color = pRange2.Font.Color Then
SumColor = SumColor + 2
End If
Next
End Function
提前致谢
第一件事很简单:单元格文本实际上是 u u
,只是用 Font WinDings 格式化后会显示 ◆
如果使用rng.Font.Color
读取或设置颜色,则表示该颜色对整个单元格有效。如果您想获取(或设置)单个字符的颜色(或其他属性,如粗体或斜体),您可以使用 Characters
-属性。您需要将开始和长度指定为参数,例如 rng.Characters(3, 1)
到单元格的第 3 个字符。
以下代码查看单元格的第一个和第三个字符并检查颜色。我不能 100% 确定我的颜色定义与您 sheet 中使用的颜色完全一致,也许您必须调整常量定义。
Function getColorTime(cell As Range) As Date
Const redCharColor = &HFF&
Const yellowCharColor = &HC0FF&
Const greenCharColor = &H50B000
Const blueCharColor = &HC07000
Dim c1 As Long, c2 As Long
c1 = cell.Characters(1, 1).Font.Color
c2 = cell.Characters(3, 1).Font.Color
' Debug.Print c1, c2
If c1 = redCharColor And c2 = yellowCharColor Then
getTime = TimeSerial(2, 0, 0)
ElseIf c1 = yellowCharColor And c2 = greenCharColor Then
getTime = TimeSerial(1, 0, 0)
ElseIf c1 = blueCharColor And c2 = greenCharColor Then
getTime = TimeSerial(0, 30, 0)
End If
End Function
这是我的两分钱:
C1
中的公式:
=CountColor(A1:A4)
引用 UDF:
Function CountColor(rng As Range) As Double
Dim cl As Range
For Each cl In rng
Select Case cl.Characters(1, 1).Font.Color & "|" & cl.Characters(3, 1).Font.Color
Case "255|49407"
CountColor = CountColor + 2
Case "12874308|4697456"
CountColor = CountColor + 1
Case "49407|4697456"
CountColor = CountColor + 0.5
Case Else
CountColor = CountColor
End Select
Next
End Function
显然,您想找出 color-codes 作为您的“王牌”。