Excel效率手册:早做完,不加班(升级版)
上QQ阅读APP看书,第一时间看更新

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 二维表与一维表

因为以前没有人告诉我数据源规范的重要性,以致我走了很多弯路,靠自己摸索是件很痛苦的事情。成功是有捷径的,那就是站在巨人的肩膀上看问题、学习。