|
楼主 |
发表于 2012-1-4 10:10
|
显示全部楼层
下面在用第一题的效果二来说明一下思路,完全和效果1是一样的。
关键在于凑数- Sub 必做1效果2_012_sunjing_zxl()
- Dim d As New Dictionary, d1 As New Dictionary
- Dim d2 As New Dictionary, d3 As New Dictionary
- Dim arr, arr1()
- Dim i As Long, j As Long, n As Long, m As Long
- Range("F1:IV1000").ClearContents
- Range("F1:IV1000").NumberFormatLocal = "@"
- arr = Range("A1:D" & [A65536].End(xlUp).Row)
- '统计每个仓库名的个数
- For i = 2 To UBound(arr)
- d(arr(i, 1)) = d(arr(i, 1)) + 1
- Next i
- '添加两个计数器
- n = 1
- m = 0
- '统计每个仓库名所占行数(d2)
- '统计每个仓库名起点行号(d3)
- '行号不固定,列好固定所以需要计算数组的行数
- '由题意(5行是基本行数,超出5行就添加)
- '上面字典的item值是每个仓库的总个数
- '所以RoundUp((d.Items(i) + 1) / 3, 0),就是该仓库需要用的行数,而加上最低行数限制。用max比较取一个最大值即可
- For i = 0 To d.Count - 1
- 'd2的item就是key所需要的行数
- d2(d.Keys(i)) = WorksheetFunction.max(WorksheetFunction.RoundUp((d.Items(i) + 1) / 3, 0), 5)
- 'd3的item就是key的起点行号
- d3(d.Keys(i)) = n
- '计数器n计算下一个的起点行号
- m = d2(d.Keys(i))
- n = n + m
- Next i
- '最后的n值减1肯定就我们所需要数组的总行数了
- ReDim arr1(1 To n - 1, 1 To 14)
- '规律循环赋值(万变不离其中的凑数)
- For i = 2 To UBound(arr)
- '统计循环点得仓库类别及该类别的个数
- d1(arr(i, 1)) = d1(arr(i, 1)) + 1
- '分析标题需要站一行数据,所以每一类仓库前面5行只能放下14个
- '所以用D1的item值+1来判断是否超出15个,超出15就需要添加行数了
- If d1(arr(i, 1)) + 1 > 15 Then
- m = d3(arr(i, 1)) + 5 '超出5行的起点行号
- n = d2(arr(i, 1)) - 5 '增加的行数
- '用m,n来凑数达到行列变化
- m = (d1(arr(i, 1)) - 15) Mod n + m
- n = Int((d1(arr(i, 1)) - 15) / n) * 5
- For j = 1 To 4
- arr1(m, n + j) = arr(i, j)
- Next j
- 'else下面的就不说了 , 和效果1基本一样
- Else
- m = d3(arr(i, 1)) + d1(arr(i, 1)) Mod 5
- n = Int(d1(arr(i, 1)) / 5) * 5
- For j = 1 To 4
- arr1(d3(arr(i, 1)), j) = arr(1, j)
- arr1(m, n + j) = arr(i, j)
- Next j
- End If
- Next i
- Range("F1").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
- End Sub
复制代码 |
评分
-
查看全部评分
|