根据另一个单元格的颜色设置一个单元格的颜色

时间:2015-01-07 20:55:03

标签: excel excel-vba format xlm vba

我想要的是:

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,则系数(单元格)变为蓝/深蓝或黑色。

因此,当我观看第一张纸时,我知道应该忽略蓝色纸,因为它们不重要。

我会尝试以下所有建议并稍后报告。

4 个答案:

答案 0 :(得分:2)

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

我将逐步描述一种解决方法。这不是按键击键,因此您可能需要谷歌一点,具体取决于您的背景知识。 说明不简短,请仔细阅读。

你必须:

  1. 检测选择中的更改(有一个事件)。
  2. 询问源小区的颜色。
  3. 如果需要,可以采取行动。
  4. 转到Visual Basic编辑器(VBE)并在三个模块中添加代码:

    1. 标准模块(例如,Module1)。您必须先插入模块。
    2. 的ThisWorkbook。
    3. 图纸2。
    4. 在Module1中:

      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
      

      在ThisWorkbook中:

      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。您可以使用合适的Sub添加其他事件,例如Workbook_BeforeCloseWorkbook_BeforeSave。所有这些都是替代不存在的改变单元格格式的一种方式。

      4. 我喜欢answer by pnuts(虽然我没时间测试它)。但是现在的那个提供了另一个不具备的灵活性。可能存在某些情况(取决于您需要做什么)。

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

答案 1 :(得分:1)

不建议使用,因为依赖于XLM(非XML)宏功能GET.CELL。这是30年前引入的技术,八年后被有效取代。由于几乎所有的元素现在已经不存在,剩下的少数元素预计会有较低的预期寿命。 Microsoft鼓励迁移到VBA。

尽管如此,你问'怎么'而不是'为什么不',所以我建议你从你到达的地方继续,然后选择Sheet1 A1和HOME>样式 - 条件格式 - 新规则...,使用公式确定要格式化的单元格此公式为真的格式值:

=CellColor=23  

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

23是一个相当标准的蓝色数字(不是Light,而不是Dark),但您的配置可能会有不同的数字。

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


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

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

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

=Sheet2!A1>0.05

格式化... ,选择深蓝色或适合,OK,OK。

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

答案 2 :(得分:0)

GET.CELL函数虽然有用,但它来自VBA之前使用的旧XLM宏语言。您可能会遇到限制,例如那时Excel使用了有限数量的颜色(我在60左右的某处读过?)。

或者,使用一点VBA,您可以试用Interior Object以及Font 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

您可能需要探索指定颜色的各种方法,以便为您提供最大程度的控制/灵活性。

答案 3 :(得分:0)

为了清楚并保持简单的功能,您可以使用条件格式并选择使用颜色设置格式。一旦你知道如何,这非常容易。主要技巧是输入什么公式,具体是当条件格式应用于多单元格范围时,需要条件格式公式的单元格。

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

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

因此,您最终会在具有着色的单元格旁边的单元格中使用公式。公式将使用返回true或false的命名范围,具体取决于单元格的颜色是否与您在命名范围中指定的颜色匹配。您在另一个工作表上的条件格式将引用此公式单元格并设置新单元格的颜色。

您可以在名为“Get”的命名范围中使用以下公式。 = GET.CELL(65,OFFSET(间接(“RC”,FALSE),0,1))

我已经开始工作了,关键信息可以在引用的网站页面找到。

好?