|
根据语文,模拟了一次。自己修改一下吧。排名是从论坛大侠:chx68,学习而来的。感谢  
- Sub pm()
- Dim arr, targetCols(), resultCols(), j As Integer, i As Long
- Dim d As Object, fs_sz, fs, cnt As Long, mc As Long
- Set d = CreateObject("scripting.dictionary")
- Set d2 = CreateObject("scripting.dictionary")
- arr = Sheet1.[a1].CurrentRegion.Value
- targetCols = Array(3, 4, 5) '需排名的列(如第2、3列)
- resultCols = Array(6, 7, 8) '结果写入列(如第3、4列)
- For j = LBound(targetCols) To UBound(targetCols)
- d.RemoveAll
- '统计频率
- For i = 2 To UBound(arr)
- If arr(i, targetCols(j)) <> "" Then
- d(arr(i, targetCols(j))) = ""
- End If
- Next
- fs_sz = d.keys
- '计算排名
- For i = 0 To UBound(fs_sz)
- fs = WorksheetFunction.Large(fs_sz, i + 1)
- d2(arr(1, targetCols(j)) & i + 1) = fs
- d(fs) = i + 1
- Next
- '写入结果列
- For i = 2 To UBound(arr)
- arr(i, resultCols(j)) = d(arr(i, targetCols(j)))
- Next
- Next j
- '开始操作了
- Set d = Nothing
- Set d = CreateObject("scripting.dictionary")
- For i = 2 To UBound(arr)
- n = 0
- For j = 6 To UBound(arr, 2)
- n = n + 1
- If Not d.exists(arr(i, 1)) Then
- d(arr(i, 1)) = Application.WorksheetFunction.Round(arr(i, j) / n, 0)
- Else
- d(arr(i, 1)) = WorksheetFunction.Round((d(arr(i, 1)) + arr(i, j)) / n, 0)
- End If
- Next
- Next
- For j = 3 To 5
- For i = 2 To UBound(arr)
- If arr(i, j) = "" Or arr(i, j) = 0 Then
- arr(i, j) = d2(arr(1, j) & d(arr(i, 1)))
- End If
- Next
- Next
- Sheet1.[a1].CurrentRegion = arr
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|