|
楼主 |
发表于 2015-12-5 11:30
|
显示全部楼层
第四个:数据透视表式汇总,这是兰色幻想老师的经典案例
本帖最后由 autumnalRain 于 2015-12-31 22:18 编辑
重点是列数如何确定。分析如下:
************************************************************************************************************************************
列数 = (InStr("1月2月3月4月5月6月", arr(x, 2)) + 1) / 2 + 1
-----------------------------------------------------------------------------------------------------------------------------------------
第一步、确定棋盘中已占用的列数,这里为1,存放产品名称
-----------------------------------------------------------------------------------------------------------------------------------------
第二步、确定应放在已占用列后的第几列
arr(x, 2)是2个字符的字符串,后面除以2,得出把两个字符视同一个整体时的所在的位置,这里字符串长度为几就除以几;若实际字符长度不一,可以用left、mid、
或right等字符串函数获致其部分关键字,并根据关键字的长度判断应该除以2或是其它的数字
-----------------------------------------------------------------------------------------------------------------------------------------
第三步、确定该字符应该在棋盘中出现的列的位置
通过原有列数+第二步得现的位置数字
-----------------------------------------------------------------------------------------------------------------------------------------
比如当arr(x, 2)=“2月”时,其位置为3,加1,除以2后等于2,得出其在字符串的位置(两个字符视同一个位置),加上红色字体1为原有列数,所以2月应在棋盘的第3列
*****************************************************************************************************************************************************
参考29楼列数计算的另一个例子
- Sub 下棋法之数据透视表式汇总()
- Dim d As New Dictionary
- Dim 棋盘(1 To 10000, 1 To 7)
- Dim 行数, 列数
- Dim arr, x, k
- arr = Range("a2:c" & Range("a65536").End(xlUp).Row)
- For x = 1 To UBound(arr)
- 列数 = (InStr("1月2月3月4月5月6月", arr(x, 2)) + 1) / 2 + 1
- If d.Exists(arr(x, 1)) Then
- 行数 = d(arr(x, 1))
- 棋盘(行数, 列数) = 棋盘(行数, 列数) + arr(x, 3)
- Else
- k = k + 1
- d(arr(x, 1)) = k
- 棋盘(k, 1) = arr(x, 1)
- 棋盘(k, 列数) = arr(x, 3)
- End If
- Next x
- Range("f2").Resize(k, 7) = 棋盘
- End Sub
复制代码
|
|