|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 香川群子 于 2013-5-2 19:39 编辑
解释后补:
ReDim drr$(m, 1) '定义存放结果的数组drr
For i = 2 To m - 1 '遍历比对2 to m-1 (最后一行不需要检查了)
For l = 2 To nn '遍历最初的nn行 即 总列数-相同列数+1 =20-15+1=6
'(实际为5行,因为我的实际列数是从第2列开始到第6列)
r = brr(i, brr(0, l)) 'brr(0, l)为按从小到大排序的对应实际列位置,brr(i, brr(0, l))就是对应实际的行、列交叉位置值(字典关键词)
For k = 1 To crr(l)(r)(0) '遍历嵌套数组中对应关键词相同的所有行元素
'crr(l)为嵌套数组中对应本列,crr(l)(r)为嵌套数组中对应该字典关键词r的对应一维数组x,该数值的(0)元素就是对应数组x的元素个数。
'因此crr(l)(r)(0)就是 与被检查的行、列交叉位置对应数值完全相同的所有行的个数。也可以写作ubound(crr(l)(r))
ii = crr(l)(r)(k) '同样的,ii=crr(l)(r)(k) 表示取得遍历嵌套数组中的每一个行位置
If ii > i Then '如果该行位置比当前行大就继续,否则退出(因为嵌套数组x中包括所有行位置,需要排除)
If InStr(s, " " & ii - 1 & "(") = 0 Then '进一步检查该行位置是否已经被检查为相同个数符合条件而取出,避免重复。
'我是在这里就进行排除重复的,而Lee1892改进前的代码是所有计算完成后再进行比较排除。这个是有算法差异的地方。
cnt = cnt + 1 '统计比对次数
cc = 1 '比对相同列数初始化(我的所有列数都是以1为0处理的。这是为了和原始数据的列位置保持一致。)
For jj = 2 To n '遍历检查各列
' If brr(ii, jj) - brr(i, jj) Then cc = cc + 1 '数值不同时计数+1
If cc = nn Then Exit For 计数值达到界限值(=6)时退出检查
Next
If cc < nn Then s = s & " " & ii - 1 & "(" & n - cc & ")" '如果检查计数值没超过界限值则符合列数条件可以输出结果
End If
End If
Next
Next
If Len(s) Then drr(kk, 0) = i - 1: drr(kk, 1) = s: s = "": kk = kk + 1 '如果检查结果有满足列数条件的则把结果写入数组drr
' Application.StatusBar = i & " /Cnt: " & cnt & " /Result: " & kk
Next
ss = ss & vbCr & "Compare Check: " & Format(Timer - tms, "0.000s"): tms = Timer
最后是输出结果到工作表,以及返回各种信息。
' Sheet2.[a1].CurrentRegion.Offset(1) = ""
' Sheet2.[a2].Resize(kk, 2) = drr
'
' ss = ss & vbCr & "Output: " & Format(Timer - tms, "0.000s") & vbCr
ss = ss & vbCr & "Time Total: " & Format(Timer - tts, "0.000s") & vbCr
ss = ss & vbCr & "Compare same >= " & n - nn + 1
ss = ss & vbCr & "Get: " & kk & " / " & cnt & " cnt" & vbCr
MsgBox ss & vbCr & " - by kagawa -"
End Sub
|
|