找到值时的VBA Excel格式范围

时间:2018-01-10 10:27:50

标签: excel vba excel-vba formatting

我试图实现一个寻找单词" TRUE"和"错误"在大量数据中 - 然后,当找到时,会更改其上方单元格的颜色。

具体来说,我希望它不是TRUE / FALSE单元格,而是直接在它上面的30个单元格。这是事情变得棘手的地方......我希望有人可以提供帮助。

我尝试过修改下面的代码,但大多数时候我都把它作为灵感来添加。

Sub ChangeColor()
    lRow = Range("C" & Rows.Count).End(xlUp).Row
    Set MR = Range("C2:C" & lRow)
    For Each cell In MR
        Select Case cell.Value
            Case "Yes"
                cell_colour = 4
            Case "y"
                cell_colour = 4
            Case Else
                cell_colour = 3
            End Select
        cell.Interior.ColorIndex = cell_colour
    Next
End Sub

5 个答案:

答案 0 :(得分:1)

使用数据字段数组

在一个范围内循环总是很耗时;这应该加快它。

警告:格式化单个单元格可以最大化文件大小,因此至少我将整个列C重新格式化为xlColorIndexNone

Option Explicit

Public Sub Mark30CellsAbove()
Dim ws   As Worksheet
Set ws = ThisWorkbook.Worksheets("MySheet")
Dim v    As Variant
Dim i    As Long, j As Long, n As Long, m As Long, r As Long
Dim Rng  As Range
Dim t    As Double
' stop watch
  t = Timer
' get last row in column C
  n = ws.Range("C" & ws.Rows.Count).End(xlUp).Row
' get values to one based 2dim array
  v = ws.Range("C1:C" & n).Value
' clear existing colors over the WHOLE column to minimize file size
  ws.Range("C:C").Interior.ColorIndex = xlColorIndexNone
' loop through C2:Cn and mark 30 rows before found condition
  For i = 2 To n
      ' check condition, find string "true" or "false"
        If InStr(".true.false.", "." & LCase(v(i, 1)) & ".") > 0 Then

            ' set range block - fixed rows count 30 above found cell
            If i < 32 Then      ' only in case of less than 30 rows
               Set rng = ws.Range("C2:C" & (i - 1))
            Else
               Set rng = ws.Range("C" & (i - 30) & ":C" & (i - 1))
            End If
            rng.Interior.ColorIndex = 4

        End If
  Next i
  MsgBox "Time needed: " & Format(Timer - t, "0.00") & " seconds."
End Sub

当然你也可以在If - EndIf内循环,只是为了看到这个更慢的方法:

        If InStr(".true.false.", "." & LCase(v(i, 1)) & ".") > 0 Then

            ' Always avoid to loop through a range
            ' For j = i - 1 To i - 30 Step -1
                ' If j < 2 Then Exit For      ' optional escape if one line under title row
                ' ws.Cells(j, 3).Interior.ColorIndex = 4
            ' Next
         End If

答案 1 :(得分:0)

我发布的代码应该只突出显示B列中的单元格,其值与A列中的相应单元格不同。我测试了它并且工作正常。

如果您想尝试条件格式:

选择要有条理着色的列B或列B的部分。

在下文中,我将假设B1是选择中的活动单元格。

在功能区的“主页”选项卡上,单击“条件格式”&gt;新规则......

选择&#34;使用公式确定要格式化的单元格&#34;。 输入公式= B1&lt;&gt; A1

如果活动单元格不在第1行,请相应地调整公式。例如,如果选择内的活动单元是B3,则使用= B3&lt;&gt; A3

点击格式化...

激活“填充”选项卡。

选择所需的填充颜色。

单击“确定”直到所有对话框都已关闭。

更改A列和/或B列中的某些值以查看结果。

参考 - https://social.technet.microsoft.com/Forums/ie/en-US/2fffa4d8-bbba-473b-9346-5fce8f0728a8/using-vba-to-change-a-cell-colour-based-on-the-information-in-a-different-cell-excel-2010?forum=excel

答案 2 :(得分:0)

首先,你需要检查单元格的行是否高于30,然后你可以偏移来改变颜色:

因此而不是这一行:cell.Interior.ColorIndex = cell_colour 写下这个:

If cell.Row > 30 Then cell.Offset(-30, 0).Interior.ColorIndex = cell_colour

答案 3 :(得分:0)

我会使用 条件格式

执行此操作

标记所有数据,然后按“条件格式”。使用使用公式... 输入2个规则 第一条规则是TRUE。假设你从Col A开始:

=COUNTIF(A2:A31;TRUE)

第二条规则类似,只需通过 FALSE 交换 TRUE 。在公式下方,按“格式”按钮设置颜色。

说明: 我恢复了逻辑:我没有搜索TRUE / FALSE然后格式化上面的单元格,而是查找每个单元格,如果它至少有一个条目TRUE resp。在接下来的30个细胞中错误。但是,我不得不承认我不知道Excel能够以多快的速度处理如此大量的数据。

答案 4 :(得分:0)

这可以在没有VBA的情况下完成。您应该使用公式设置两个条件格式。第一:

=COUNTIF(OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),1,0,29,1), "TRUE")>0

和假的相同。要突出显示单元格,您只需使用突出显示单元格规则(CF的顶部选项)。