|
本帖最后由 Datous 于 2019-3-5 11:56 编辑
就是拍一下序,后面是排序方法。
- Sub TagRepetition()
- Dim vntData, strRpt() As String, lngCount As Long
- Dim lngNoRpt() As Long, blnRpt As Boolean
- Dim A, B, N, T
- vntData = Range("A1").Resize(Range("A60000").End(xlUp).Row, 1)
- lngCount = UBound(vntData)
- If lngCount = 1 Then Exit Sub
- ReDim strRpt(1 To lngCount)
- T = Split(vntData(1, 1), " ")
- Call MergeSort(T, LBound(T), UBound(T))
- vntData(1, 1) = Join(T, " ")
- N = 1
- ReDim lngNoRpt(1 To N)
- lngNoRpt(N) = 1
- For A = 2 To lngCount
- blnRpt = False
- T = Split(vntData(A, 1), " ")
- Call MergeSort(T, LBound(T), UBound(T))
- vntData(A, 1) = Join(T, " ")
- For B = 1 To N
- If vntData(A, 1) = vntData(lngNoRpt(B), 1) Then
- strRpt(A) = "重复"
- strRpt(lngNoRpt(B)) = "重复"
- blnRpt = True
- Exit For
- End If
- Next
- If Not blnRpt Then
- N = N + 1
- ReDim Preserve lngNoRpt(1 To N)
- lngNoRpt(N) = A
- End If
- Next
- Range("C1").Resize(lngCount, 1) = Application.WorksheetFunction.Transpose(strRpt)
- End Sub
复制代码
- Sub MergeSort(vntArr, lngLeft As Long, lngRight As Long)
- Dim lngMid As Long
- If lngRight > lngLeft Then
- lngMid = Int((lngLeft + lngRight) / 2)
- Call MergeSort(vntArr, lngLeft, lngMid)
- Call MergeSort(vntArr, lngMid + 1, lngRight)
- Call Merge(vntArr, lngLeft, lngMid, lngRight)
- End If
- End Sub
- Sub Merge(vntArr, lngL As Long, lngM As Long, lngR As Long)
- Dim vntTmp()
- Dim I As Long, J As Long, K As Long
- I = lngL
- J = lngM + 1
- K = lngL
- ReDim vntTmp(lngL To lngR)
- While I <= lngM And J <= lngR
- If vntArr(I) <= vntArr(J) Then
- vntTmp(K) = vntArr(I)
- K = K + 1
- I = I + 1
- Else
- vntTmp(K) = vntArr(J)
- K = K + 1
- J = J + 1
- End If
- Wend
- While I <= lngM
- vntTmp(K) = vntArr(I)
- K = K + 1
- I = I + 1
- Wend
- While J <= lngR
- vntTmp(K) = vntArr(J)
- K = K + 1
- J = J + 1
- Wend
- For I = lngL To lngR
- vntArr(I) = vntTmp(I)
- Next
- End Sub
复制代码 |
|