|
张雄友 发表于 2015-5-8 22:27
能不能排序的?谢谢了。
加一个排序代码,各个工号所做的工序种类不多,所以用最原始的冒泡法进行排序就行了。- Sub cbtaja()
- '第2列工号,第3列姓名,第8列制单号,第11列工序名称,第14列产量!
- Dim arr, brr, d, d2, i&, j&, k&, zl&, r&, h&, l&, p&, t#, ghgx$, tmp
- t = Timer
- Set d = CreateObject("scripting.dictionary")
- arr = Sheets("交飞明细").Range("A1").CurrentRegion
- r = UBound(arr)
- If r > 1 Then zl = 4 Else Exit Sub '有明细中包含有效数据,则结果至少有4列
- ReDim brr(1 To 65535) '假设工人人数65535以内
- ReDim crr(1 To 65535, 1 To 99) '假设工序99以内
- For i = 2 To r
- arr(i, 2) = Format(arr(i, 2), String(8, "0")) '本厂工号不会超过8位数!
- ghgx = arr(i, 2) & arr(i, 11)
- If Not d.Exists(arr(i, 2)) Then
- h = h + 1
- d(arr(i, 2)) = h
- brr(h) = 4
- d(ghgx) = 4
- crr(h, 1) = arr(i, 2) '工号
- crr(h, 2) = arr(i, 3) '姓名
- crr(h, 3) = arr(i, 14) '第1笔的数量,直接取值
- crr(h, 4) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '单号、工序、数量
- Else
- p = d(arr(i, 2))
- '----------------------------------------------------------
- crr(p, 3) = crr(p, 3) + arr(i, 14) '后续各笔的数量,需要累计。
- '-----------------------------------------------------------
- If d.Exists(ghgx) Then
- l = d(ghgx) '从字典中查取已知工序的列号
- tmp = crr(p, l)
- tmp(2) = tmp(2) + arr(i, 14) '按工序累计
- If InStr(tmp(0), arr(i, 8)) = 0 Then tmp(0) = tmp(0) & "/" & arr(i, 8)
- crr(p, l) = tmp
- Else
- l = brr(p) + 1 '定位新工序的列,为该工号原有工序最大列号+1
- d(ghgx) = l '把工号工序对应的列号存入字典,以便后续累加时定位列号所需
- If zl < l Then zl = l '比较所有工号的最大列数
- brr(p) = l
- crr(p, l) = Array(arr(i, 8), arr(i, 11), arr(i, 14)) '新工号工序的单号、工序、数量
- End If
- End If
- Next
- For i = 1 To h
- '----------最原始的冒泡法排序------------------
- For j = 4 To brr(i)
- For k = j + 1 To brr(i)
- If crr(i, j)(2) < crr(i, k)(2) Then temp = crr(i, j): crr(i, j) = crr(i, k): crr(i, k) = temp
- Next
- Next
- '----------------------------------------------
- For j = 4 To brr(i)
- If InStr(crr(i, j)(0), "/") > 0 Then crr(i, j)(0) = "(" & crr(i, j)(0) & ")"
- crr(i, j) = Join(crr(i, j), " ") & "件"
- Next
- Next
- With Sheets("get")
- .Rows("2:65535").Delete '减轻负担!针对 clear 后遗证!
- .Range("A2").Resize(h, zl) = crr
- '.Range("A2").Resize(h, zl).EntireColumn.AutoFit
- End With
- MsgBox "用时" & Format(Timer - t, "0.00") & "秒"
- End Sub
复制代码 |
|