【问题标题】:Set the color of one cell based on the color of another cell根据另一个单元格的颜色设置一个单元格的颜色
【发布时间】:2015-01-07 20:55:03
【问题描述】:

我想要的是:

IF   A1 in Sheet 2 is blue  
Then A1 in Sheet 1 changes to blue

我知道我可以通过以下方法获得 Sheet 2 中 A1 的颜色:

=GET.CELL(63,Sheet2!A1)

(Excel: Can I create a Conditional Formula based on the Color of a Cell?)

但我不知道下一步该做什么。

2015 年 1 月 12 日更新

一开始我以为函数可以工作,但考虑到我的文件,可能需要 VBA。

它是关于 SPSS 相关分析的输出,共有三列:相关系数、p 值和样本量。 我需要同时检查系数和 p 值,并以可读的方式呈现系数。假设我在 50 个变量和 100 个变量之间运行相关性,我不会将系数和 p 值粘贴在一张纸上,而是:

第一张:系数 表二:p值

我想要的是:

如果 p 值大于 0.05,则系数(单元格)变为蓝色/深蓝色或黑色。

所以当我看第一张纸时,我知道蓝色的应该被忽略,因为没有意义。

【问题讨论】:

  • 您的问题需要结合几个“技巧”。我正在测试实现它们的代码...
  • 标题为“无 VBA”,标签为“VBA”。
  • @CharlesWood 在我发布该链接时并没有说没有 VBA。如果这就是你所拥有的,请不要发布
  • @pnuts,这是你自己陷入的又一团糟:-)。我会问 OP,如果有的话。

标签: excel vba format excel-4.0 xlm


【解决方案1】:

您需要一种检测单元格格式变化的方法。 似乎没有任何事件会在格式更改时触发。看 How to detect changes in cell format?

我将逐步描述一种解决方法。它不是一个按键一个按键,所以你可能需要用谷歌搜索一下,这取决于你的背景知识。 说明不短,请仔细阅读。

你必须:

  1. 检测选择的变化(有一个事件)。
  2. 查询源单元格的颜色。
  3. 根据需要采取行动。

转到 Visual Basic 编辑器 (VBE) 并在三个模块中添加代码:

  1. 标准模块(例如,Module1)。您必须先插入模块。
  2. 此工作簿。
  3. 表 2。

在模块 1 中:

Public prev_sel As Range
Public wssrc As Worksheet, wstrg As Worksheet
Public ssrc As String, strg As String
Public rngsrc As Range, rngtrg As Range

Sub copy_color(rngs As Range, rngt As Range)
    Dim csrc As Long
    csrc = rngs.Interior.Color
    If (csrc = vbBlue) Then
        rngt.Interior.Color = vbBlue
    End If
End Sub

Sub copy_color2(rngs As Range, rngt As Range)
    If (TypeName(prev_sel) = "Range") Then
        Dim pss As String
        pss = prev_sel.Parent.Name
        If (pss = ssrc) Then
            Dim ints As Range
            Set ints = Application.Intersect(rngs, prev_sel)
            If (Not (ints Is Nothing)) Then
                Call copy_color(rngs, rngt)
            End If
        End If
    End If
End Sub

在本工作簿中:

Private Sub Workbook_Open()
    ssrc = "Sheet2"
    strg = "Sheet1"
    Set wssrc = Worksheets(ssrc)
    Set wstrg = Worksheets(strg)
    Set rngsrc = wssrc.Range("A1")
    Set rngtrg = wstrg.Range("A1")
    Call copy_color(rngsrc, rngtrg)

    If (TypeName(Selection) = "Range") Then
        Set prev_sel = Selection
    Else
        Set prev_sel = Nothing
    End If
End Sub

在 Sheet2 中:

Private Sub Worksheet_Deactivate()
    Call copy_color(rngsrc, rngtrg)
    If (TypeName(Selection) = "Range") Then
        Set prev_sel = Selection
    Else
        Set prev_sel = Nothing
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call copy_color2(rngsrc, rngtrg)
    If (TypeName(Target) = "Range") Then
        Set prev_sel = Target
    End If
End Sub

我将很快编辑解释。不过仔细阅读,还是很容易理解的。

注意事项:

  1. 如果源单元格颜色从 vbBlue 更改为其他颜色,则此代码不起作用。您没有为此操作指定任何内容。实际上,您的规范不够详细,无法涵盖所有​​可能的情况。

  2. 可能存在此代码失败的情况(我猜极不可能)。例如,如果通过其他 VBA 代码更改颜色,而不选择/取消选择单元格。

  3. 这个想法是在尽可能多的相关事件之后检查是否需要采取行动。我在这里检测到Workbook_OpenWorksheet_DeactivateWorksheet_SelectionChange。您可以使用合适的Subs 添加其他事件,例如Workbook_BeforeCloseWorkbook_BeforeSave。所有这些都是一种替代不存在的更改单元格格式事件的方法。

  4. 我喜欢answer by pnuts(虽然我没有时间测试它)。但是目前的一个提供了另一种所不具备的灵活性。可能有一些情况(取决于你需要做什么)它不会被涵盖。

  5. 还有其他可能的位置组合来定位变量声明和其他代码,基本上执行相同的操作。

【讨论】:

  • 来自标题:“没有VBA
  • @CharlesWood - 如果您基于“没有 VBA”投了反对票,请根据上面 cmets 的帖子进行修改。
  • 在您的代码中,Sub Worksheet_SelectionChange 将 Target 参数声明为 Range,因此您无需使用 typename 测试它是否具有类型范围。
  • @HarveyFrench - 我阻止了Target = Nothing 的案件。不过,我不知道这是否可能。
  • 如果目标在选择更改事件中不等于任何内容,那就像没有耶稣的圣诞节一样。该事件被调用,因为选择了新单元格时。如果发生这种情况,我会非常担心。
【解决方案2】:

不推荐,因为依赖于 XLM(不是 XML)宏函数 GET.CELL。这是 30 年前引入的一项技术,八年后被有效取代。由于几乎所有元素现在都已失效,因此可以预期剩下的少数元素的预期寿命会很短。 Microsoft 鼓励迁移到 VBA。

尽管如此,你问的是“如何”而不是“为什么不”,所以我建议你从你到达的地方继续并选择 Sheet1 A1 和 HOME > 样式 - 条件格式 - 新规则...,使用确定要格式化哪些单元格的公式在此公式为真的情况下格式化值:

=CellColor=23  

然后选择您选择的蓝色格式,OK,OK,Apply。

23 是一个相当标准的蓝色数字(不是浅色,也不是深色),但您的配置可能需要不同的数字。

请注意,另一个缺点是,与一般的 CF 不同,响应不是自动的 - 您可能需要在 Sheet1 A1 中输入一些内容,或 Shift+F9 来强制更新。


如果您的数据分布在两个工作表(Sheet1 和 Sheet2,均为 ColumnA)并且存在 1:1 的关系(Sheet2 的 A1 中的 p 值是 Sheet1 的 A1 中的相关系数),那么一个简单的条件格式规则可能就足够了:

选择 Sheet1 ColumnA 和 HOME > 样式 - 条件格式,新规则...

使用公式确定要格式化的单元格
在此公式为真的情况下格式化值:

=Sheet2!A1>0.05

Format...,选择深蓝色或适合,OK,OK。

相同的规则可能会以相同的方式应用在 Sheet2(ColumnA)中,因此在一张表中按条件格式化的单元格(按行)是在另一张表中按条件格式化的单元格。

【讨论】:

  • 帮助!您能否解释一下您添加到工作表 1 A1 的 CF 如何与工作表 2 A1 单元格的颜色相关联。我不明白。公式中的文本“CellColour”指的是什么? SI 它是一个命名范围吗?
  • 我阅读了链接的网页。我的问题仍然存在。如果需要格式化的目标单元格上的条件格式具有对命名范围的引用,因为命名范围是使用“RC”定义的,那么它将检查具有条件格式的单元格的颜色。我试过了,这是真的。不过,使用我的答案末尾描述的技术是可行的。
  • 啊。所以你需要为每个单元格命名一个范围......我明白了。有点乱。但它会起作用。
  • 实际上不是每个单元格的命名范围,一个相对范围就可以了。
【解决方案3】:

GET.CELL 函数虽然有用,但来自于 VBA 之前使用的旧 XLM 宏语言。您可能会遇到使用限制,例如当时 Excel 使用的颜色数量有限(我读过大约 60 种颜色?)。

或者,使用一点 VBA,您可以尝试使用 Interior ObjectFont Object

Sheets("Sheet1").Range("A1").Interior.Color = vbBlue
Sheets("Sheet1").Range("A1").Font.Color = vbYellow
    If Sheets("Sheet1").Range("A1").Interior.Color = vbBlue Then _
    Sheets("Sheet2").Range("A1").Interior.Color = vbBlue
    If Sheets("Sheet1").Range("A1").Font.Color = vbYellow Then _
    Sheets("Sheet2").Range("A1").Font.Color = vbYellow

您可能需要探索各种指定颜色的方法,以便最大限度地控制/灵活使用。

【讨论】:

    【解决方案4】:

    为了清楚起见并保持您提供的功能简单,您可以使用条件格式并选择使用颜色设置格式。一旦您知道如何操作,这将非常容易。主要技巧是输入什么公式,特别是当条件格式应用于多单元格范围时,您需要条件格式公式来引用哪个单元格。

    举个例子。如果您创建的条件格式规则适用于 $C$5:$C$10 范围,则您使用的公式通常需要输入为 =(A5="A")。请注意,这是一个相对寻址公式,即没有美元符号。这具有单元格 c6 检查 a6 等值的效果。

    您现在唯一的麻烦是检查单元格的格式而不是它存储的值。在 2013 年,您仍然可以使用=GET.CELL(63,A5) 来执行此操作,但是这不能输入到 CF 规则的公式中……其他帖子讨论了使用它的原因和原因。请参阅this link,其中描述了如何获取单元信息。

    因此,您最终会在具有颜色的单元格旁边的单元格中得到一个公式。该公式将使用一个命名范围,该范围返回真或假,具体取决于单元格的颜色是否与您在命名范围中指定的颜色相匹配。您在另一张纸上的条件格式将引用此公式单元格并设置新单元格的颜色。

    您将在名为“Get . =GET.CELL(65,OFFSET(间接("RC",FALSE),0,1))

    我已经完成了这项工作,关键信息可以在引用的网站页面中找到。

    好吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多