Excel精英培训网

 找回密码
 注册
查看: 3175|回复: 6

[资料] [心得]字典第3课作业分析

[复制链接]
发表于 2012-1-4 09:33 | 显示全部楼层 |阅读模式
本帖最后由 sunjing-zxl 于 2012-1-4 10:11 编辑


字典第三课作业,基本属于一类型的题目,我现在以“必做一的效果1”为例子来分析这类题目的思路和做法
效果二的分析在二楼

分析附件: 凑数分析.rar (8.84 KB, 下载次数: 98)

评分

参与人数 5 +60 金币 +10 收起 理由
wcymiss + 10 赞一个!
9lee + 18 赞一个!
白开水的微笑 + 10 赞一个!
开心妙妙 + 12 是我学习的榜样
liuguansky + 10 谢谢分享

查看全部评分

 楼主| 发表于 2012-1-4 10:10 | 显示全部楼层
下面在用第一题的效果二来说明一下思路,完全和效果1是一样的。
关键在于凑数
  1. Sub 必做1效果2_012_sunjing_zxl()
  2.     Dim d As New Dictionary, d1 As New Dictionary
  3.     Dim d2 As New Dictionary, d3 As New Dictionary
  4.     Dim arr, arr1()
  5.     Dim i As Long, j As Long, n As Long, m As Long
  6.     Range("F1:IV1000").ClearContents
  7.     Range("F1:IV1000").NumberFormatLocal = "@"
  8.     arr = Range("A1:D" & [A65536].End(xlUp).Row)
  9.     '统计每个仓库名的个数
  10.     For i = 2 To UBound(arr)
  11.         d(arr(i, 1)) = d(arr(i, 1)) + 1
  12.     Next i
  13.     '添加两个计数器
  14.     n = 1
  15.     m = 0
  16.     '统计每个仓库名所占行数(d2)
  17.     '统计每个仓库名起点行号(d3)
  18.     '行号不固定,列好固定所以需要计算数组的行数
  19.     '由题意(5行是基本行数,超出5行就添加)
  20.     '上面字典的item值是每个仓库的总个数
  21.     '所以RoundUp((d.Items(i) + 1) / 3, 0),就是该仓库需要用的行数,而加上最低行数限制。用max比较取一个最大值即可
  22.     For i = 0 To d.Count - 1
  23.         'd2的item就是key所需要的行数
  24.         d2(d.Keys(i)) = WorksheetFunction.max(WorksheetFunction.RoundUp((d.Items(i) + 1) / 3, 0), 5)
  25.         'd3的item就是key的起点行号
  26.         d3(d.Keys(i)) = n
  27.         '计数器n计算下一个的起点行号
  28.         m = d2(d.Keys(i))
  29.         n = n + m
  30.     Next i
  31.     '最后的n值减1肯定就我们所需要数组的总行数了
  32.     ReDim arr1(1 To n - 1, 1 To 14)
  33.     '规律循环赋值(万变不离其中的凑数)
  34.     For i = 2 To UBound(arr)
  35.         '统计循环点得仓库类别及该类别的个数
  36.         d1(arr(i, 1)) = d1(arr(i, 1)) + 1
  37.         '分析标题需要站一行数据,所以每一类仓库前面5行只能放下14个
  38.         '所以用D1的item值+1来判断是否超出15个,超出15就需要添加行数了
  39.         If d1(arr(i, 1)) + 1 > 15 Then
  40.             m = d3(arr(i, 1)) + 5    '超出5行的起点行号
  41.             n = d2(arr(i, 1)) - 5    '增加的行数
  42.             '用m,n来凑数达到行列变化
  43.             m = (d1(arr(i, 1)) - 15) Mod n + m
  44.             n = Int((d1(arr(i, 1)) - 15) / n) * 5
  45.             For j = 1 To 4
  46.                 arr1(m, n + j) = arr(i, j)
  47.             Next j
  48.         'else下面的就不说了 , 和效果1基本一样
  49.         Else
  50.             m = d3(arr(i, 1)) + d1(arr(i, 1)) Mod 5
  51.             n = Int(d1(arr(i, 1)) / 5) * 5
  52.             For j = 1 To 4
  53.                 arr1(d3(arr(i, 1)), j) = arr(1, j)
  54.                 arr1(m, n + j) = arr(i, j)
  55.             Next j
  56.         End If
  57.     Next i
  58.     Range("F1").Resize(UBound(arr1), UBound(arr1, 2)) = arr1
  59. End Sub
复制代码

评分

参与人数 1 +5 金币 +5 收起 理由
半个城市 + 5 + 5 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2012-1-4 10:51 | 显示全部楼层
孙哥  辛苦了 很给力啊 赞一个!
回复

使用道具 举报

发表于 2012-1-4 19:59 | 显示全部楼层
谢谢分享               
回复

使用道具 举报

发表于 2012-1-13 09:10 | 显示全部楼层
vba这样的思路用的比较少,函数倒是很常见
回复

使用道具 举报

发表于 2012-2-20 19:31 | 显示全部楼层
wcymiss 发表于 2012-1-13 09:10
vba这样的思路用的比较少,函数倒是很常见

不断提高并且不断学习
回复

使用道具 举报

发表于 2012-4-6 08:00 | 显示全部楼层
学习,谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-30 04:03 , Processed in 0.338811 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表