让Excel的归VBA。
场景:
拿到一张销售数据大表,要根据不同的销售人员/不同的销售区域拆分小表分发出去。
分析
这个场景,其实可以利用Power BI进行filter,并利用role based security给不同的分组以不同的权限。
然而,搭建起这套BI系统,需要建立数据库,AD等系统。
如果数据量本身不大,就是想简单的对Excel进行拆分,然后人工分发出去,那么可以利用VBA来进行数据拆分和文件写入。
解决方案
- 打开Excel,开启开发工具选项卡("Developer"),点击"Visual Basic" 或直接使用快捷键 Alt + F11
- "插入"-"模块"(Insert-Module),复制粘贴下面的VBA Code,并保存
- 点击"宏"("Macros"),运行前面保存的宏"splitContent"
- 键入作为基准的列的序号,默认为1
- 键入生成的文件所需要的后缀,例如日期等
- 等待"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 解析
有空再补