1.2 以身说法
成长是需要付出代价的,多从别人那里获取失败和成功的经验,这样你就能少走很多弯路。闭门造车是不可取的,否则终将付出惨重的代价!
2010年年初卢子接手中山隆成那边的工作,中山隆成有事先设置好的表格模板,如图1-11所示。这种二维表格经常会见到,它的好处就是录入数据简单。由于那时没有考虑到以后要对数据源进行汇总分析,所以也就没去重新设置表格模板。但是,表格存在很多不合理,如合并单元格,当时因贪图一时之便,后来害苦了自己。
图1-11 中山隆成模板
有一次,领导要卢子对不良数据进行汇总,以查看每个月各类产品的出货检查情况。通过对图1-11所示的明细表进行汇总,得到图1-12所示的一张汇总表。
图1-12 汇总表
通过明细表获得这张汇总表,对当时的我来说难度不亚于上青天。为了完成工作,我利用了各种转换方法,费了九牛二虎之力才勉强做完,效率极低。
为了寻求更简便的方法,我苦思一周无果,不得已在网络上到处求助。皇天不负有心人,后来我在wangjguo44老师的帮助下完成了这项艰巨的任务,在这里我对他老人家说一声:谢谢!
我晒出其中一条公式,有兴趣的朋友可以研究一下。
=INDEX(小天使!G:G, RIGHT(TEXT(LARGE(MMULT((LOOKUP(ROW($5:$136), IF(小天使!$B$5:$B$136<>"", ROW($5:$136)),小天使!$B$5:$B$136)=$B$4)*(MONTH(小天使!$I$4:$DJ$4)=$F$4)*(小天使!$G$5:$G$136<>"检查数")*(小天使!$G$5:$G$136<>"其他")*小天使!$I$5:$DJ$136, ROW($1:$106)^0)+(LOOKUP(ROW($5:$136), IF(小天使!$B$5:$B$136<>"", ROW($5:$136)),小天使!$B$5:$B$136)=$B$4)*(小天使!$G$5:$G$136<>"检查数")*(小天使!$G$5:$G$136<>"其他")*(小天使!$G$5:$G$136<>"")*0.1+ROW($5:$136)%%, ROW(A1)), "0.0000"),3)*1)
不知道你看到这里有什么想法?不过我可以肯定地告诉你,工作上不应存在任何炫耀技能的行为,公式越长,只能说明你的表格设置越不合理。这就是我前面花那么长的篇幅介绍Access的原因,其目的就是学会规范数据源。故事的结局是,我狠下心来对这张数据源“做手术”,将它变成一张标准的一维表格,然后用数据透视表轻松搞定,其结果如图1-13所示。
图1-13 转换后的效果
VBA转换代码(好友——无言的人提供)。
Option Explicit Public Sub 二维转一维() Dim Arr, Brr(), i As Byte, ii As Integer, T As Long Dim iR As Long, iC As Byte, iRC As Long, iTem As Long Arr = Sheets("小天使").Range("A4").CurrentRegion iR = UBound(Arr): iC = UBound(Arr, 2): iRC = iR * iC iTem=1 '计数器 ReDim Preserve Brr(1 To iRC, 1 To 9) For i = 9 To iC For ii = 2 To iR ' If i=113 And ii=80 Then Stop Brr(iTem,1)=iTem '序号 If Arr(ii, 1) <> "" And Arr(ii, 1) <> "合计" Then Brr(iTem,2)=Arr(ii,1) '番号 Brr(iTem,3)=Arr(ii,2) '俗称 ' ElseIf Arr(ii,1)="合计"Then '' MsgBox Arr(ii,1)&vbTab&ii ' ii=ii+1 ' Brr(iTem,2)=Arr(ii,1) ' Brr(iTem,3)=Arr(ii,2)'俗称 Else Brr(iTem, 2) = Brr(iTem - 1, 2) Brr(iTem, 3) = Brr(iTem - 1, 3) '俗称 End If Brr(iTem,4)=Arr(ii,7) '不良内容 Brr(iTem,5)=Arr(ii,8) '等级 Brr(iTem,6)=Arr(1, i) '日期 If Arr(ii,7)<>"检查数"Then Brr(iTem,7)=Arr(ii, i) '不良数 If Arr(ii, i) <> "" And Arr(ii, 7) <> "检查数" Then Brr(iTem, 8) = 1 '不良数次数 If Arr(ii,7)="检查数"Then Brr(iTem,9)=Arr(ii, i) '检查数 iTem = iTem + 1 Next ii Next i With Sheet4.Range("A2") .CurrentRegion.Clear .Resize(iRC, 9) = Brr .Offset(-1, 0).Resize(1, 9) = Array("序号", "番号", "俗称", "不良内容", "等级", "日期", "不良数", "不良数次数", "检查数") .CurrentRegion.Columns.AutoFit .CurrentRegion.Borders.LineStyle = 1 .CurrentRegion.Borders.ColorIndex = 3 End With End Sub
数据透视表汇总结果如图1-14所示。
图1-14 数据透视表汇总
如果你不会高级公式和VBA,那么最好还是规规矩矩地做表格,否则你只能无数次求助别人!规范做表后,自己就能够轻松搞定,求人不如求己。
温馨提示
说了那么多,什么是二维表?什么是一维表呢?
如图1-15所示,左边是二维表,金额491对应产品A跟4月1日;右边是一维表,491对应金额,4月1日对应日期,A对应产品。也就是说,一维表每个数据只对应一个属性,而二维表每个数据对应两个属性。
图1-15 二维表与一维表
因为以前没有人告诉我数据源规范的重要性,以致我走了很多弯路,靠自己摸索是件很痛苦的事情。成功是有捷径的,那就是站在巨人的肩膀上看问题、学习。