|
本帖最后由 9lee 于 2011-12-27 16:06 编辑
- Private Function Jc(rng, Optional n As Long = 1)'9lee
- Dim arr, d As New Dictionary, nMax, a, i, j, x, dd As New Dictionary
-
- On Error Resume Next
- '======第一参数不是数组时,显示错误值
- If IsArray(rng) = False Then Jc = "#VALUE!": Exit Function
- arr = rng
- '========确定数组的维数
- For x = 1 To 64
- If IsEmpty(UBound(arr, x)) Then Exit For
- Next
- '========统计各元素出现的次数
- If x = 2 Then '一维时
- For i = 1 To UBound(arr)
- If IsEmpty(arr(i)) = False Then d(arr(i)) = d(arr(i)) + 1
- Next
- Else '二维时
- For i = 1 To UBound(arr, 1)
- For j = 1 To UBound(arr, 2)
- If IsEmpty(arr(i, j)) = False Then d(arr(i, j)) = d(arr(i, j)) + 1
- Next j
- Next i
- End If
- '======统计出现次数的值
- For i = 0 To d.Count - 1
- dd(d.Items(i)) = ""
- Next
- '===如果第二参数大于次数的值的个数,则显示空值
- If n > dd.Count Then Jc = "": Exit Function
- '====
- nMax = Application.Large(dd.Keys, n)
- '====获取出现N次的元素
- For i = 0 To d.Count - 1
- If d.Items(i) = nMax Then a = a & "|" & d.Keys(i)
- Next
- Jc = Mid(a, 2, 10000)
- Set d = Nothing
- Set dd = Nothing
- End Function
复制代码- Sub 必做二_9lee()
- Dim d As New Dictionary, arr, i, sh As Worksheet, a
- With Sheets("必做二")
- a = Sheets("必做二").Tab.ColorIndex
- For Each sh In ThisWorkbook.Sheets
- If sh.Tab.ColorIndex = a And sh.Name <> "必做二" Then
- arr = sh.Range("a1").CurrentRegion
- For i = 2 To UBound(arr)
- d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2) * 1
- Next i
- End If
- Next
- .Range("a:b").ClearContents
- .Range("a1") = "产品型号"
- .Range("b1") = "数量"
- If d.Count > 0 Then
- .Range("a2:a" & d.Count) = Application.Transpose(d.Keys)
- .Range("b2:b" & d.Count) = Application.Transpose(d.Items)
- End If
- End With
- Set d = Nothing
- End Sub
复制代码- Sub 选做二_9lee()
- Dim brr, d As New Dictionary
- Dim a, irow, i
- t = Timer
- With Sheets("选做二数据源")
- a = .[a65536].End(3).Row
- Do
- irow = Int(a * Rnd + 1)
- If Not d.Exists(d(irow)) Then
- d(irow) = .Cells(irow, 1).EntireRow
- End If
- i = i + 1
- Loop Until i = 10
- End With
- brr = Application.Transpose(Application.Transpose(d.Items))
- With Sheets("选做二")
- .Range("a1").CurrentRegion.ClearContents
- .[a1].Resize(10, UBound(brr, 2)) = brr
- End With
- Set d = Nothing
- MsgBox Timer - t
- End Sub
复制代码- Sub 选做一_9lee()
- Dim arr, brr, chaxun As String, d As New Dictionary
- With Sheets("选做一")
- .[e2:e65536].ClearContents
- chaxun = UCase(.[e1])
- arr = Range("a1").CurrentRegion.Formula
- For i = 2 To UBound(arr)
- If UCase(arr(i, 1)) Like chaxun Then
- d(i) = Mid(arr(i, 2), 2, 10000)
- End If
- Next
- If d.Count > 0 Then
- brr = Split(Join(d.Items, "+"), "+")
- .[e2].Resize(UBound(brr)) = Application.Transpose(brr)
- Else
- MsgBox .[e1] & "没有找到!"
- End If
- End With
- Set d = Nothing
- End Sub
复制代码- Sub 附加题_9lee()
- Dim arr, brr, crr(), d As New Dictionary, d_Name As New Dictionary, dd As New Dictionary
- Dim i, j, my, k, m
- Application.ScreenUpdating = False
- t = Timer
- With Sheets("附加题")
- arr = .Range("a1").CurrentRegion
- brr = .Rows(1)
- '=============获取拆分项目
- For i = 2 To UBound(arr, 1)
- d(arr(i, 14)) = ""
- Next
- '============获取已有的工作表名称
- For Each sh In ThisWorkbook.Sheets
- d_Name(sh.Name) = ""
- Next
- '=========拆分
- For i = 0 To d.Count - 1
- Set sh = Sheets.Add(after:=Sheets(ThisWorkbook.Sheets.Count))
- '==========判断工作表是否存在,选择是否需要删除
- If d_Name.Exists(d.Keys(i)) Then
- my = MsgBox(d.Keys(i) & "的工作表已存在,是否需要删除该工作表?", vbYesNo)
- If my = vbYes Then
- Application.DisplayAlerts = False
- Sheets(d.Keys(i)).Delete
- sh.Name = d.Keys(i)
- Application.DisplayAlerts = True
- End If
- Else
- sh.Name = d.Keys(i)
- End If
- ReDim crr(1 To UBound(arr), 1 To UBound(arr, 2))
- For j = 2 To UBound(arr)
- If arr(j, 14) = d.Keys(i) Then
- For k = 1 To UBound(arr, 2)
- crr(m + 1, k) = arr(j, k)
- Next k
- m = m + 1
- End If
- Next
- sh.[a1].Resize(1, UBound(brr, 2)) = brr
- sh.[a2].Resize(UBound(crr, 1), UBound(crr, 2)) = crr
- Set dd = Nothing
- m = 0
- Next
- End With
- Set d = Nothing
- Set d_Name = Nothing
- MsgBox "拆分完毕!用时" & Timer - t & "秒."
- Application.ScreenUpdating = True
- End Sub
复制代码
|
|