我有用于比较第一列的 VBA 代码,并突出显示sheet2第一列中sheet1中不存在的单元格。
我是 VBA 新手,不擅长编码部分,需要它在具有多个电子表格的 Excel 工作表中工作(可能从 5 到 10 个不等)。 sheet1 是主工作表,其他工作表应与主工作表进行比较,并突出显示主工作表中不存在的单元格。
Public Sub CompareSheets()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim cell As Range, rng As Range
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
Set rng = ws1.Range("A1:A20")
For Each cell In rng
Celladdress = cell.Address
If cell <> ws2.Range(Celladdress) Then
cell.Interior.Color = vbYellow
ws2.Range(Celladdress).Interior.Color = vbYellow
End If
Next cell
End Sub
最佳答案
此代码避免了逐行比较(根据您的注释),并在 Sheet2、Sheet3、Sheet4 等的 A 列中查找每个值,以便在 Sheet1 的 A 列中找到。它还会查找大于 Sheet1 中包含值的行总数的行。
这不会强制单元格变为 vbYellow。相反,它使用条件格式在不匹配的单元格上显示 vbYellow。这些可以像强制 vbYellow 单元一样被过滤。这样做的好处是,一旦值被更正(与 Sheet1!A:A 匹配),突出显示将自动神奇地删除。
Option Explicit
Sub CompareSheets()
Dim lrw1 As Long, lrwn As Long, w As Long
'get the last row of values in master sheet
With Worksheets(1)
lrw1 = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
'the first worksheet (e.g. worksheets(1) ) is the 'master sheet' so we start at 2
For w = 2 To Worksheets.Count
With Worksheets(w)
lrwn = .Cells(.Rows.Count, "A").End(xlUp).Row
With .Range(.Cells(1, "A"), .Cells(Application.Max(lrwn, lrwn), "A"))
.FormatConditions.Delete
With .FormatConditions.Add(Type:=xlExpression, _
Formula1:="=OR(ROW()>" & lrw1 & ", ISNA(MATCH($A1, " & Worksheets(1).Columns("A").Address(external:=True) & ", 0)))")
With .Interior
.PatternColorIndex = xlAutomatic
.Color = vbYellow
End With
.StopIfTrue = True
End With
End With
End With
Next w
End Sub
FWIW,我发现你的叙述有点令人困惑。它要么与所提供的代码相矛盾,要么与自身相矛盾。这个提议的解决方案背后的逻辑主要来自您的评论。
关于用于将多个电子表格的第一列与母版表进行比较的 VBA 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122263/