'此版纠正了楼上代码混乱的数组数据写入逻辑,并再度优化代码

Sub 标记多个连贯列中的共同值()
Dim Na As String, 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, n As Long, j As Integer, _
sz() As String, NB As Worksheet
On Error GoTo en
With ActiveWorkbook
For Each NB In .Worksheets
If InStr(1, NB.Name, "比对结果") > 0 Then
Application.DisplayAlerts = False
NB.Delete '删除比对结果表
Application.DisplayAlerts = True
End If
Next NB
End With
Na = ActiveSheet.Name '改成待比对的源数据表格名称
Set qs = Application.InputBox( _
"请选中数据区域左上角所在的单元格,然后点击确定", "起始参数设置:", Type:=8)
If qs = False Or qs.Cells.Count > 1 Then GoTo en
Application.ScreenUpdating = False
With Worksheets(Na)
Set q = .Range(qs.Address).CurrentRegion
.Select
'返回一个 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))
For c = 1 To a
For rd = 1 To rz
If .Cells(rd, c) = .Cells(r, 1) And _
.Cells(rd, c).Interior.Color = 16777215 Then '值匹配且未染色
g = g + 1 '统计标注了几个
.Cells(rd, c).Interior.Color = cl '颜色值
j = j + 1 '同一共同值出现的次数
If j = 1 Then n = n + 1 '开始找同一个共同值时
ReDim Preserve sz(1 To 10000, 1 To n)
sz(1, n) = n '比对序号
sz(2, n) = .Cells(r, 1).Value '共同值
sz(3, n) = j '出现次数
sz(j + 3, n) = .Cells(rd, c).AddressLocal(0, 0) '共同值地址
End If
Next rd
Next c: js = 0: t = 0: j = 0 '标记完一个共同值后恢复初始值
End If
End If
Next r
End With
If g > 0 Then
With ActiveWorkbook
Set NB = .Sheets.Add(after:=.Sheets(.Sheets.Count))
With NB
.Name = Format(Now, "yyyymmddhmmss") & "比对结果"
.Range("A1") = .Name & ",源数据表:" & Na: .Range("A2") = "比对序号":
.Range("B2") = "共同值": .Range("C2") = "出现次数"
.Range("D2") = "共同值对应的单元格地址"
.Range("A3").Resize(n, UBound(sz)) = WorksheetFunction.Transpose(sz)
.Range("A1:" & [A1].Offset(0, [A1].CurrentRegion.Columns.Count - 1).Address).Merge
.Range("D2:" & [A2].Offset(0, [A1].CurrentRegion.Columns.Count - 1).Address).Merge
.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous
.Range("A1").CurrentRegion.HorizontalAlignment = xlCenter
.Rows("1:2").RowHeight = 30: .Rows("1:2").Font.Bold = True
.UsedRange.Columns.AutoFit
With .Tab
.Color = RGB(0, 0, 255)
End With
End With
Set NB = Nothing
End With
End If
en: Set qs = Nothing: Set q = Nothing: Erase sz '释放
Application.ScreenUpdating = True
End With
MsgBox "程序从" & a & "个连贯的列中标记出了它们之间的共同值,共" _
& g & "个单元格", IIf(g = 0, 16, 64), "提示:" & Err.Description
End Sub