【问题标题】:Excel formula that prints cell color (ColorIndex or RGB)打印单元格颜色(ColorIndex 或 RGB)的 Excel 公式
【发布时间】:2013-01-11 16:04:37
【问题描述】:

在 Excel 中是否有检索单元格的 ColorIndex(或 RGB)的公式?

我找到了以下功能:

CELL(info_type, the_cell)

记录了here,但它没有任何单元格颜色的参考信息。

这是一个color 信息,但对我来说没用。 其实是这样描述的:

"color" 如果单元格的颜色格式为负值,则值为 1;否则返回 0(零)。

有什么想法吗?

另外,我发现执行此操作的 VBA 属性是 Cell.Interior.Color,但实际上我使用的不是宏,而是简单的 Excel 公式。有没有办法用公式模拟 VBA 函数?

【问题讨论】:

  • 恐怕 Excel 对象的许多属性只能从 VBA 访问。但是您想要的信息可以通过 3-liner 获得,您可以在 Excel 工作表中使用这种用户定义的公式,就像内置公式一样。如果需要,我可以为您发布 VBA 解决方案。 =CELL("color"..) 与条件格式有关
  • 说真的,我不知道什么是 3-liner,而且 Google 似乎没有帮助我。如果你能解释清楚,我会很高兴你:)
  • 对不起我的行话...... 3-liner 表示 3 行 VBA 代码
  • 哦,好的!所以解决方案是创建一个 VBA 宏,将其保存在工作簿中,然后构建一个使用该宏的公式?
  • 确实是的....我只是给你发一个...

标签: excel excel-formula


【解决方案1】:

这里有一些小功能供您使用。在您的工作表中,按 Alt-F11 进入 VBA 编辑器,插入一个新模块,粘贴以下代码,返回您的工作表并用他们的名字来使用它们,比如=FillColor(A1)

前两个是承诺的“3-liners”,为字体和背景颜色提供十进制值 - 虽然不是很有用

第二对将十进制数转换为RGB,返回格式为N,N,N的字符串

第三对是数组公式 - 连续选择3个单元格,输入公式然后按Ctrl+Shift+ 输入获取3个相邻单元格中的数字RGB值

Function FillColor(Target As Range) As Variant
    FillColor = Target.Interior.Color
End Function

Function FontColor(Target As Range) As Variant
    FontColor = Target.Font.Color
End Function

Function FillColorRGB(Target As Range) As Variant
Dim N As Double

    N = Target.Interior.Color
    FillColorRGB = Str(N Mod 256) & ", " & Str(Int(N / 256) Mod 256) & ", " & Str(Int(N / 256 / 256) Mod 256)
End Function

Function FontColorRGB(Target As Range) As Variant
Dim N As Double

    N = Target.Font.Color
    FontColorRGB = Str(N Mod 256) & ", " & Str(Int(N / 256) Mod 256) & ", " & Str(Int(N / 256 / 256) Mod 256)
End Function

Function FillColorRGBArray(Target As Range) As Variant
Dim N As Double, A(3) As Integer

    N = Target.Interior.Color
    A(0) = N Mod 256
    A(1) = Int(N / 256) Mod 256
    A(2) = Int(N / 256 / 256) Mod 256
    FillColorRGBArray = A
End Function

Function FontColorRGBArray(Target As Range) As Variant
Dim N As Double, A(3) As Integer

    N = Target.Font.Color
    A(0) = N Mod 256
    A(1) = Int(N / 256) Mod 256
    A(2) = Int(N / 256 / 256) Mod 256
    FontColorRGBArray = A
End Function

请注意:更改单元格的颜色不会通过上述函数/公式开始重新计算,因为通常重新着色单元格不应该驱动重新计算。您必须使用 Ctrl+Alt+Shift+F9手动开始完全重新计算>

【讨论】:

  • 最好将 Application.Volatile 添加到这些函数中,而不是使用 Ctrl-alt-F9 强制进行完整计算(您不需要 shift)
  • +1 对查尔斯的评论。或者您可以将 volatile 函数连接到 UDF,例如 RAND()
  • 就我上面的测试而言,Application.Volatile True 如果您只更改颜色并没有帮助 - 您仍然需要更改正在查看的单元格的值。组合中的 SHIFT 可防止重新计算所有打开的工作簿 - 您可能不希望这样做 ;-) - 请参阅 msdn.microsoft.com/en-us/library/office/bb687891.aspx(底部)了解所有可能的重新计算组合键
  • 感谢您的帮助。如果可能,我会在今天进行测试,并通知您。
  • 抱歉来晚了,我上周一直在忙其他事情。经过测试和工作,接受了你的答案。
【解决方案2】:

以下函数将显示选定单元格的 RGB 值。

Function CellColorValue(CellLocation As Range)
    Dim sColor As String

    Application.Volatile
    'Retrieve hex value into string sColor    
    sColor = Right("000000" & Hex(CellLocation.Interior.Color), 6)
    'Return the string Version e.g. 255,255,255 RGB color value found in 
    'Excel cell. Use in built worksheet function to convert Hex to Decimal
    'Use string function to separate Hex string into three parts
    CellColorValue = Application.WorksheetFunction.Hex2Dec(Right(sColor, 2)) & "," & application.WorksheetFunction.Hex2Dec(Mid(sColor, 3, 2)) & "," & Application.WorksheetFunction.Hex2Dec(Left(sColor, 2))
End Function

【讨论】:

    【解决方案3】:

    请在下面尝试

    所做的更改:查看代码中的注释

    模块

    Public Function Performance_Message(NonPreferredAvg As Single _
                                      , NonPreferredAvgname As String _
                                      , PreferredAvg As Single _
                                      , PreferredAvgname As String _
                                      , Optional Outputtype As String _
                                       ) As Variant
    
        Dim performancemessage As String
        Dim averagedifference As Single
        Dim stravgdif As String
        Dim cellcolor As String
    
        averagedifference = Abs(NonPreferredAvg - PreferredAvg)
        stravgdif = FormatPercent(averagedifference, 2)
    
        Select Case PreferredAvg
            Case Is < NonPreferredAvg
                performancemessage = PreferredAvgname & " Is " & stravgdif & " Less Than " & NonPreferredAvgname
                cellcolor = 4 '"green" 'Changes made
    
            Case Is = NonPreferredAvg
                performancemessage = PreferredAvgname & " Equals " & NonPreferredAvgname
                cellcolor = 6 '"yellow" ''Changes made
    
            Case Is > NonPreferredAvg
                performancemessage = PreferredAvgname & " Is " & stravgdif & " Greater Than " & NonPreferredAvgname
                cellcolor = 5 '"blue" 'Changes made
            Case Else
                performancemessage = "Something Bad Happened"
        End Select
        If Outputtype = "color" Then
            Performance_Message = cellcolor
        Else
            Performance_Message = performancemessage
        End If
    End Function
    

    工作表

    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim myColor As Double
      myColor = Target.Value ''Changes made
      Call SetPerformancecolor(Target, myColor)
    End Sub
    
    Private Sub SetPerformancecolor(Target As Range, myColor As Double)
      Target.Interior.ColorIndex = myColor ''Changes made
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2015-10-21
      • 2017-11-11
      • 1970-01-01
      • 2017-03-26
      • 2019-12-25
      相关资源
      最近更新 更多