- Sub 必做一_效果一_liuts()
- Dim t
- t = Timer
- With Sheets("必做一")
- Dim brr(1 To 10000, 1 To 50)
- Dim arr, 行标%, 列标 As Byte, 步长 As Byte, i%, dic As New Dictionary, arr1, k%, imax%
- arr1 = [{"仓库名称","序号","商品代码","数量",""}]
- arr = .Range("a1:e" & Range("a65536").End(xlUp).Row)
- For i = 2 To UBound(arr)
- If Not dic.Exists(arr(i, 1)) Then
- 行标 = (dic.Count) * 5 + 1: dic(arr(i, 1)) = 1: 列标 = 0
- For k = 1 To 5
- brr(行标, k) = arr1(k)
- brr(行标 + 1, 列标 + k) = arr(i, k)
- Next
- Else
- dic(arr(i, 1)) = dic(arr(i, 1)) + 1
- 列标 = (dic(arr(i, 1)) \ 5) * 5: 步长 = (dic(arr(i, 1)) - 1) Mod 4 + 1
- If imax < 列标 Then imax = 列标
- For k = 1 To 5
- brr(行标 + 步长, 列标 + k) = arr(i, k)
- Next
- End If
- Next
- .Range("g2").Resize(dic.Count * 5, imax) = brr
- End With
- MsgBox Timer - t
- End Sub
- Sub 必做一_效果二_liuts()
- Dim t
- t = Timer
- With Sheets("必做一")
- Dim brr(1 To 10000, 1 To 100)
- Dim arr, 行标%, 列标 As Byte, 步长 As Byte, 间隔 As Byte, 跨距 As Byte, 个数%, i%, dic As New Dictionary, d As New Dictionary, k%, x%, m%
- arr1 = [{"仓库名称","序号","商品代码","数量",""}]
- arr = .Range("a1:e" & .Range("a65536").End(xlUp).Row)
- For i = 2 To UBound(arr)
- d(arr(i, 1)) = d(arr(i, 1)) + 1
- Next
- For i = 2 To UBound(arr)
- 个数 = d(arr(i, 1))
- If Not dic.Exists(arr(i, 1)) Then
- dic(arr(i, 1)) = dic(arr(i, 1)) + 1
- 行标 = dic(arr(i, 1)) + 间隔: 列标 = 0
- For k = 1 To 5
- brr(行标, k) = arr1(k)
- brr(行标 + 1, 列标 + k) = arr(i, k)
- Next
- 间隔 = 间隔 + IIf(个数 < 15, 5, 个数 / 3 + 1)
- 跨距 = IIf(个数 < 15, 5, 个数 / 3 + 1)
- Else
- dic(arr(i, 1)) = dic(arr(i, 1)) + 1
- 列标 = (dic(arr(i, 1)) \ 跨距) * 5: 步长 = dic(arr(i, 1)) Mod 跨距
- For k = 1 To 5
- brr(行标 + 步长, 列标 + k) = arr(i, k)
- Next
- End If
- Next
- .Range("g25").Resize(UBound(brr), 15) = brr
- End With
- MsgBox Timer - t
- End Sub
- Sub 必做二_liuts()
- Dim t
- t = Timer
- Dim sh As Worksheet, brr, i%, arr, dic As New Dictionary, sr$, k As Byte, crr(1 To 10000, 1 To 256), n As Integer
- For Each sh In Worksheets
- If sh.Name Like "必二#" Then
- arr = sh.UsedRange.Offset(1, 0)
- For i = 1 To UBound(arr) - 1
- For j = 1 To UBound(arr, 2)
- crr(i + x, j) = arr(i, j)
- Next
- If Not dic.Exists(arr(i, 5)) Then
- k = k + 1
- dic(arr(i, 5)) = k
- End If
- Next
- x = UBound(arr) - 1
- n = x + n
- End If
- Next
- With Sheets("必做二")
- .Columns("c:z").ClearContents
- .Range("c1").Resize(1, dic.Count) = dic.Keys
- brr = .Range("a1").CurrentRegion
- For i = 1 To UBound(brr)
- dic(brr(i, 1) & brr(i, 2)) = i
- Next
- For i = 1 To n
- brr(dic(crr(i, 1) & crr(i, 2)), dic(crr(i, 5)) + 2) = crr(i, 4) + brr(dic(crr(i, 1) & crr(i, 2)), dic(crr(i, 5)) + 2)
- Next
- .Range("a1").Resize(UBound(brr), UBound(brr, 2)) = brr
- End With
- MsgBox Timer - t
- End Sub
- Sub 选做_liuts()
- Dim t
- t = Timer
- On Error GoTo err1
- Dim arr, brr, i As Integer, j As Integer, dic As New Dictionary, x As Double, sr As String, 合计 As Double, d As New Dictionary
- With Sheets("选做")
- arr = .Range("a1:e" & .Range("a65536").End(xlUp).Row).CurrentRegion
- brr = .Range("h1").CurrentRegion
- For j = 2 To UBound(brr)
- d(brr(j, 1) & brr(j, 2)) = Split(Split(Join(Application.Index(brr, j, 0), ","), ",", 3)(2), ",")
- Next
- For i = 2 To UBound(arr)
- sr = arr(i, 2) & arr(i, 3)
- dic(sr) = dic(sr) + arr(i, 4): 合计 = dic(sr): temp = 0: k = 1
- Do
- If Not d.Exists(sr) Then GoTo err1
- temp = temp + Val(d(sr)(k))
- Select Case 合计
- Case Is <= temp
- arr(i, 5) = d(sr)(k - 1)
- Exit Do
- End Select
- k = k + 2
- Loop Until d(sr)(k) = ""
- If 合计 > temp Then arr(i, 5) = d(sr)(k - 3)
- 10: Next
- .Range("a1:e" & UBound(arr)) = arr
- If s <> "" Then MsgBox s & "————" & Chr(13) & "以上不存在!"
- End With
- MsgBox Timer - t
- Exit Sub
- err1:
- s = sr & Chr(13) & s: GoTo 10
- End Sub
- Sub 附加_liuts()
- On Error Resume Next
- Application.EnableEvents = False
- Dim 一列$, 四列$, m%, 结果(1 To 100, 1 To 3), tp(1 To 8, 1 To 3)
- If Target.Address(0, 0) = "B2" Or Target.Address(0, 0) = "E2" Then
- 一列 = [b2]: 四列 = "2010" & [e2]
- ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- Dim arr, dic As New Dictionary, i As Integer, j As Integer, k As Integer, brr(1 To 10000, 1 To 5), crr
- Dim rg As Range, sr$
- With Sheets("附加1")
- If IsNull(.Columns("A:A").MergeCells) Then
- Set rg = .Columns("A:A").SpecialCells(xlCellTypeConstants, 23).SpecialCells(xlCellTypeBlanks)
- With rg
- .MergeCells = False
- .Offset(1, 0).FormulaR1C1 = "=R[-1]C"
- End With
- End If
- arr = .Range("a3").CurrentRegion
- For i = 2 To UBound(arr)
- For j = 5 To UBound(arr, 2)
- sr = arr(i, 1) & "," & arr(i, 3) & "," & arr(i, 4) & "," & Year(arr(1, j)) & Month(arr(1, j))
- If Not dic.Exists(sr) And arr(i, 3) <> "" Then
- k = k + 1
- dic(sr) = Val(arr(i, j))
- ElseIf arr(i, 3) <> "" Then
- dic(sr) = dic(sr) + Val(arr(i, j))
- End If
- Next
- Next
- For i = 1 To dic.Count
- crr = Split(dic.Keys(i - 1), ","): temp = dic.Items(i - 1)
- brr(i, 1) = crr(0)
- brr(i, 2) = crr(1)
- brr(i, 3) = crr(2)
- brr(i, 4) = crr(3)
- brr(i, 5) = temp
- Next
- ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- For m = 1 To k
- If brr(m, 1) = 一列 And brr(m, 4) = 四列 Then
- icount = icount + 1
- 结果(icount, 1) = brr(m, 2)
- 结果(icount, 2) = brr(m, 3)
- 结果(icount, 3) = brr(m, 5)
- End If
- Next
- 总不良数 = Application.Sum(Application.Index(结果, , 3))
- For m = 1 To UBound(结果)
- If 结果(m, 1) = "其他" Or 结果(m, 1) = "其它" Then
- tp(8, 1) = 结果(m, 1)
- tp(8, 2) = 结果(m, 2)
- tp(8, 3) = 结果(m, 3)
- 结果(m, 3) = 0
- Exit For
- End If
- Next
- For m = 1 To UBound(结果)
- If 结果(m, 3) = Application.Max(Application.Index(结果, , 3)) Then
- y = y + 1
- If y > 7 Then Exit For
- tp(y, 1) = 结果(m, 1)
- tp(y, 2) = 结果(m, 2)
- tp(y, 3) = 结果(m, 3)
- 结果(m, 3) = 0
- End If
- Next
- 其他数 = 总不良数 - (Application.Sum(Application.Index(tp, , 3)) - Application.Sum(Application.Index(tp, 8, 3)))
- tp(8, 3) = 其他数
- Sheets("附加题").Range("b8").Resize(8, 3) = tp
- Sheets("附加题").Range("e5") = Application.Sum(Sheets("附加题").Range("d8:d15"))
- Sheets("附加题").Range("b5") = Sheets("附加题").Range("e5") * 4
- Application.DisplayAlerts = False
- If rg Is Nothing Then GoTo 100
- rg.MergeCells = True
- Application.DisplayAlerts = True
- End With
- End If
- 100:
- Application.EnableEvents = True
- End Sub
-
复制代码 用了不少土办法,有时间再改用高效的方法 :)
附加题 数组排序还不太理解,用了土法 检查数与不良数的关系没看太懂 简单地做成了*4关系。
|