Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何根据VBA中的其他单元格为其他单元格着色_Excel_Vba_Colors - Fatal编程技术网

Excel 如何根据VBA中的其他单元格为其他单元格着色

Excel 如何根据VBA中的其他单元格为其他单元格着色,excel,vba,colors,Excel,Vba,Colors,我对VBA的了解有限,所以即使是完成这项简单的任务,我也很难做到。我想检查B列中的每个单元格,如果该单元格的值在另一个工作表的A列中重复,那么如果该单元格的值在该范围内重复,它会将该单元格颜色为黄色。我让这部分工作。接下来我要做的是给C、D和F列中同一行的单元格上色。这部分对我不起作用,它给了我一个类型不匹配错误。在此方面的任何帮助都将不胜感激 Sub Mark_Duplicates() Dim Cell As Variant Dim Source As Range D

我对VBA的了解有限,所以即使是完成这项简单的任务,我也很难做到。我想检查B列中的每个单元格,如果该单元格的值在另一个工作表的A列中重复,那么如果该单元格的值在该范围内重复,它会将该单元格颜色为黄色。我让这部分工作。接下来我要做的是给C、D和F列中同一行的单元格上色。这部分对我不起作用,它给了我一个类型不匹配错误。在此方面的任何帮助都将不胜感激

Sub Mark_Duplicates()

    Dim Cell As Variant
    Dim Source As Range
    Dim Source2 As Range
    Dim rownumber As Variant

    Set Source = Range("B1:B1000")
    Set Source2 = Worksheets("Chain").Range("A1:A1000")

    For Each Cell In Source

        If Application.WorksheetFunction.CountIf(Source2, Cell) > 1 Then

            rownumber = ActiveCell.Row
            Cell.Interior.Color = RGB(255, 255, 0)
            Range("C" & rownumber).Interior.Color = RGB(255, 255, 0)
            Range("D" & rownumber).Interior.Color = RGB(255, 255, 0)
            Range("F" & rownumber).Interior.Color = RGB(255, 255, 0)

        End If

    Next

End Sub

根据@BigBen的说法,代码中最明显需要纠正的是连接范围的方式。您当前使用的是算术加法(
+
),而正确的VBA语法应该是
&

这样,您也不应该引用
ActiveCell
。由于您从未激活任何其他单元格,因此引用的行将始终保持不变。总的来说,根据我的评论,提及一些积极的东西是非常重要的。而是使用
Cell.Row

另一个好的做法是对全整数使用
Long
数据类型变量,而不是数据类型
Variant
。让VBA决定变量数据类型的缺点之一是使用
Long
需要花费大量时间。因此,您正在降低代码的速度。事实上,你不需要它本身

您还可以一次为区域着色,而不是逐个单元格着色。您可以简单地引用更大的范围

最后一点需要注意的是,您至少从未完全限定
源代码
的参考表,在这种情况下,它将再次在
活动表
上引用
B1:B1000
。我个人更喜欢指一张纸

总之,您可以像这样重新编写代码:

Sub Mark_Duplicates()

Dim Source1 As Range: Set Source1 = Sheet1.Range("B1:B1000") 'Use a worksheet's CodeName instead of sheet name (which can change)
Dim Source2 As Range: Set Source2 = Sheet2.Range("A1:A1000")
Dim cell As Range

For Each cell In Source1
    If Application.CountIf(Source2, cell) > 1 Then
        Sheet1.Range(Replace("B?:D?,F?", "?", cell.Row)).Interior.Color = RGB(255, 255, 0)
    End If
Next

End Sub
如果您的范围将扩大到一个更大的数据集,那么明智的做法是不再在一个范围内进行迭代,而是切换到一个可以加快处理速度的数组


问题仍然存在,您甚至需要VBA(根据@BigBen),因为您可以通过条件格式(范围越大,项目速度越慢,因为CF根据定义是不稳定的)

&
,而不是
+
,来连接。谢谢,它帮助解决了类型不匹配错误。但是,它仍然不起作用,它只给一行着色。除此之外,
ActiveCell。如果没有其他单元格被激活,row
将始终返回同一行。一般来说,使用
ActiveCell
是个坏主意。您正在查找
Cell.Row
rownumber=Cell.Row
。注意-您可以使用条件格式完成所有操作-VBA是必须的吗?谢谢,这对我来说非常有用。我将使用此VBA代码为我标记一些重要信息,打印它,然后删除数据。此数据一天更改多次,因此我认为使用VBA优于Conditionla格式,因此我只需单击一个按钮即可。@TomasPerlecky,在这种情况下,您肯定会对查找上次使用的行和使用数组而不是范围对象感兴趣。