
Sub 标记多个连贯列中的共同值()
Dim qs As Range, q As Range, r As Long, c As Integer, _
rz As Long, cz As Integer, js As Integer, _
rd As Integer, a As Integer, g As Integer, _
t As Integer, cl As Double
On Error GoTo en
' With Sheet1'此句已注释掉
With ActiveSheet
Set qs = Application.InputBox( _
"请选中数据区域左上角所在的单元格,然后点击确定", "起始参数设置:", Type:=8)
If qs = False Or qs.Cells.Count > 1 Then GoTo en
Set q = .Range(qs.Address).CurrentRegion
'返回一个 Range 对象,该对象表示当前区域。当前区域是以空行与空列的组合为边界的区域。只读
With q
.Select
rz = .Rows.Count '总行数
cz = .Columns.Count '总列数
a = Application.InputBox( _
"你要从几个连贯的列中标记出它们的共同值?输入列数:", _
"提示:数据区域为" & .AddressLocal(0, 0), cz, , , , , 1)
If a = False Or a <= 0 Or a > cz Then GoTo en '不符合列的参数条件就结束
.Interior.Pattern = xlNone '清除填充的颜色
For r = 1 To rz
If Trim(.Cells(r, 1)) <> "" Then '只找非空值
For c = 2 To a
t = WorksheetFunction.CountIf(.Columns(c), .Cells(r, 1))
If t > 0 Then
js = js + 1 '统计起始列之后的连贯列数
ElseIf t = 0 Then
If js > 0 Then js = 0
Exit For '若不是连贯的列,则退出此循环,查找下一单元格
End If
Next c
If js = a - 1 Then '共同值出现在参数列数a的每一列中
cl = RGB(Int(Rnd * 255), Int(Rnd * 255), Int(Rnd * 255))
g = g + 1 '统计标注了几个
.Cells(r, 1).Interior.Color = cl '颜色值
For rd = 1 To rz
For c = 2 To a
If .Cells(rd, c) = .Cells(r, 1) Then
g = g + 1 '统计标注了几个
.Cells(rd, c).Interior.Color = cl '颜色值
End If
Next c
Next rd: js = 0: t = 0 '标记完一个共同值后恢复初始值
End If
End If
Next r
End With
en: Set qs = Nothing: Set q = Nothing '释放
End With
MsgBox "程序从至少" & a & "列中标记出了它们之间的共同值,共" _
& g & "个单元格", IIf(g = 0, 16, 64), "提示:" & Err.Description
End Sub