【VBA研究】用VBA创建数据透视表

作者:iamlaosong

有个拣货报表,想先从货品信息中分离出颜色信息,再根据储位、名称和颜色创建一个数据透视表,由于数据是变化的(结构不变,记录数会变),每次重新创建很麻烦,因此想做个工具,用VBA分离颜色并创建数据透视表,供其他人使用。分离颜色的代码很好写,创建数据透视表的代码自然采用录制宏的方法最简单,代码出来后修改一下就行了。

1、工具界面如下:


2、拣货单的内容如下,需要分离SKU信息中的颜色:


3、工具的代码如下:

'分离信息
Sub separate_information()
    
    On Error GoTo Err
    thisfile = ThisWorkbook.name   '本文件的名字,这样赋值就可以随便改名了
    Worksheets("系统参数").Select
    If Cells(2, 2) = "Y" Or Cells(2, 2) = "y" Then                              '导出出库文件
        Application.ScreenUpdating = True
    Else
        Application.ScreenUpdating = False
    End If
    
    'curdate = Cells(2, 2)
    'pos_qsh = Cells(2, 7)
    'pos_sku = Asc(Cells(3, 7)) - 64
    pos_fst = Cells(2, 7)
    pos_sku = Cells(3, 7)
    pos_sav = Cells(4, 7)
    pos_tag = Cells(5, 7)
    pos_end = Cells(6, 7)
    
    'If MsgBox("开始生成清分数据......", vbOKCancel, "iamlaosong") = vbCancel Then Exit Sub
    
    lineno = [A65536].End(xlUp).Row           '行数,文件数量
    
    For unit_num = 5 To lineno                 '文件循环
    
        datfile = Cells(unit_num, 2)                              '文件名称
        datFullName = ThisWorkbook.Path & "\" & datfile
        If Dir(datFullName, vbNormal) <> vbNullString Then
            Workbooks.Open Filename:=datFullName        '打开订单文件
            ext = Right(datfile, 3)
            If ext = "xls" Then
                MaxRow = Cells(65536, pos_sku).End(xlUp).Row
            Else
                MaxRow = Cells(1048576, pos_sku).End(xlUp).Row
            End If
        Else
            MsgBox "数据文件不存在!", vbOKOnly, "iamlaosong"
            Exit Sub
        End If
        
        tag_len = Len(pos_tag)
        Cells(pos_fst - 1, pos_sav) = pos_tag
        Cells(pos_fst - 1, pos_sav).Font.Bold = True
       
        '分离信息,取pos_tag和pos_end之间的信息
        For row1 = pos_fst To MaxRow
            buf = Cells(row1, pos_sku)
            m1 = InStr(1, buf, pos_tag, vbTextCompare)
            If m1 > 0 Then
                m2 = InStr(m1 + tag_len, buf, pos_end, vbTextCompare)
                buf_sel = Mid(buf, m1 + tag_len, m2 - m1 - tag_len)
            Else
                buf_sel = "notfound"
            End If
            Cells(row1, pos_sav + 0) = buf_sel
            '单元格中的数值是文本的,转换成数值型
            tmp = Cells(row1, 7)
            Cells(row1, 7) = CInt(tmp)
        Next row1
        '建立数据透视表
        pdata1 = ActiveSheet.name & "!R1C1:R" & MaxRow & "C9"     '数据源工作表
        Sheets.Add
        pdata2 = ActiveSheet.name & "!R3C1"                       '新增工作表
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=pdata1, _
            Version:=xlPivotTableVersion12).CreatePivotTable TableDestination:=pdata2, _
            TableName:="拣货单数据透视表", DefaultVersion:=xlPivotTableVersion12
        '设置透视表格式,表格型、无小计    
        Cells(3, 1).Select
        ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("拣货储位").Subtotals(1) = False
        ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("货品名称").Subtotals(1) = False
        ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("颜色:").Subtotals(1) = False
        ActiveSheet.PivotTables("拣货单数据透视表").RowAxisLayout xlTabularRow
        
        '添加行标签和数值字段(计数、求和)
        With ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("拣货储位")
            .Orientation = xlRowField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("货品名称")
            .Orientation = xlRowField
            .Position = 2
        End With
        With ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("颜色:")
            .Orientation = xlRowField
            .Position = 3
        End With
        
        ActiveSheet.PivotTables("拣货单数据透视表").AddDataField ActiveSheet.PivotTables( _
            "拣货单数据透视表").PivotFields("拣货单号"), "拣货单数量", xlCount
        ActiveSheet.PivotTables("拣货单数据透视表").AddDataField ActiveSheet.PivotTables("拣货单数据透视表" _
            ).PivotFields("应拣货数量 "), "应拣货总量 ", xlSum
        
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\new" & datfile          'ActiveWorkbook.Save
        ActiveWindow.Close
        Windows(thisfile).Activate
        Worksheets("系统参数").Select
        Cells(unit_num, 3) = "成功"

    Next unit_num

    MsgBox "信息处理完毕!", vbOKOnly, "iamlaosong"
    Exit Sub
Err:
    MsgBox "错误#" & Str(Err.Number) & Err.Description & "-位置: " & row1, vbOKOnly + vbExclamation, "iamlaosong"
End Sub

4、生成的数据透视表如下所示:


5、关于取消汇总的语句,录制宏提供的语句是:

        ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("拣货储位").Subtotals = Array(False, _
            False, False, False, False, False, False, False, False, False, False, False)

实际上可以使用下面语句简化:

ActiveSheet.PivotTables("拣货单数据透视表").PivotFields("拣货储位").Subtotals(1) = False


  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值