Excel 如何根据VBA中的其他单元格为其他单元格着色
我对VBA的了解有限,所以即使是完成这项简单的任务,我也很难做到。我想检查B列中的每个单元格,如果该单元格的值在另一个工作表的A列中重复,那么如果该单元格的值在该范围内重复,它会将该单元格颜色为黄色。我让这部分工作。接下来我要做的是给C、D和F列中同一行的单元格上色。这部分对我不起作用,它给了我一个类型不匹配错误。在此方面的任何帮助都将不胜感激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
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,在这种情况下,您肯定会对查找上次使用的行和使用数组而不是范围对象感兴趣。