基于Excel中某一列,拆分成N个独立的文件

让Excel的归VBA。

场景:

拿到一张销售数据大表,要根据不同的销售人员/不同的销售区域拆分小表分发出去。

分析

这个场景,其实可以利用Power BI进行filter,并利用role based security给不同的分组以不同的权限。
然而,搭建起这套BI系统,需要建立数据库,AD等系统。
如果数据量本身不大,就是想简单的对Excel进行拆分,然后人工分发出去,那么可以利用VBA来进行数据拆分和文件写入。

解决方案

  1. 打开Excel,开启开发工具选项卡("Developer"),点击"Visual Basic" 或直接使用快捷键 Alt + F11
    基于Excel中某一列,拆分成N个独立的文件_第1张图片
    开发工具
  2. "插入"-"模块"(Insert-Module),复制粘贴下面的VBA Code,并保存
    基于Excel中某一列,拆分成N个独立的文件_第2张图片
    image.png
  3. 点击"宏"("Macros"),运行前面保存的宏"splitContent"
  4. 键入作为基准的列的序号,默认为1
  5. 键入生成的文件所需要的后缀,例如日期等
  6. 等待"finish"提示,拆分后的文件会在源Excel的同路径下

VBA Code

较为随意,到处抄了些。有空再修。

Sub splitContent()
    Dim arr, d As Object, k, t, i&, lc%, rng As Range, c%
    Dim x As String
    c = Application.InputBox("type in which col to split", , 1, , , , , 1)
    x = Application.InputBox("type in suffix, like data or something else", , 20180901, , , , , 1)
    If c = 0 Then Exit Sub
    If x = 0 Then Exit Sub
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    arr = [a1].CurrentRegion
    lc = UBound(arr, 2)
    Set rng = [a1].Resize(, lc)
    Set d = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)
        If Not d.Exists(arr(i, c)) Then
            Set d(arr(i, c)) = Cells(i, 1).Resize(1, lc)
        Else
            Set d(arr(i, c)) = Union(d(arr(i, c)), Cells(i, 1).Resize(1, lc))
        End If
    Next
    k = d.Keys
    t = d.Items
    For i = 0 To d.Count - 1
        With Workbooks.Add(xlWBATWorksheet)
            rng.Copy .Sheets(1).[a1]
            t(i).Copy .Sheets(1).[a2]
            .SaveAs Filename:=ThisWorkbook.Path & "\" & k(i) & x & ".xls"
            .Close
        End With
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "finish"
End Sub

Code 解析

有空再补

你可能感兴趣的:(基于Excel中某一列,拆分成N个独立的文件)