无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1193|回复: 8
打印 上一主题 下一主题

一个excel工作表中10多万数据分类导出为多个excel表格

[复制链接]
跳转到指定楼层
1#
发表于 2022-10-16 12:26:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 likeyouli 于 2022-11-22 15:05 编辑

单位领导安排的,要把一个excel表中的几十万数据(有姓名、身份证号、联系电话、参保单位等列),按照“参保单位”分类导出到单个的excel表格文件,细看了下,参保单位大约上千个,一个一个导出估计能把我累出血,研究了一天,终于成功,,高手别嘲笑....
1. 利用数据透视表,将这一个工作表,拆分为多个工作表:插入透视表,将参保单位拖到筛选器,其余列拖到行;选中设计菜单,分类汇总选中 不显示分类汇总,总计勾选 对行和列禁用,报表布局选中 以表格形式显示,同时选中 “重复所有项目标签”(这里务必注意,本人刚开始没注意,导致重复的姓名或重复的其他内容 老是显示空白,还以为透视数据出问题了呢,研究了半天才发现是这个原因),别忘了把-按钮去除,最后点选项,显示报表筛选页,就会自动生成一个一个按参保单位命名的工作表。通过shift键,分别按第一个与最后一个新生成的工作表(即选中),全选复制,然后接着粘贴为数值,继续调整某一个工作表,达到自己想要的样式,因为是全选中状态,其余也会跟着改变。
2. 导出工作表,需要利用代码了,以excel 2016为例,新建空白命名的工作表,点开发工具,插入activeX控件,双击后输入如下代码:
Private Sub CommandButton1_Click()
Dim sht As Worksheet
For Each sht In Sheets
   If sht.Name <> "空白" Then
    sht.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "E:\wuyou\" & sht.Name & ".xlsx"
    ActiveWorkbook.Close savechanges:=False
  End If
Next
  MsgBox "恭喜你,已完成!!"
End Sub  (空白是你新建的输入代码的工作表名称,请根据实际替换)
运行后,便会自动将每一个工作表存为单独的excel文件。<br>

Sub 拆分带人数()
Dim sht As Worksheet, n%
For Each sht In Sheets
n = sht.UsedRange.Rows.Count - 2
   If sht.Name <> "空白" Then
    sht.Copy
    ActiveWorkbook.SaveAs Filename:="V:\迅雷下载\" & sht.Name & n & "人未激活" & ".xlsx"
    ActiveWorkbook.Close savechanges:=False
  End If
Next
  MsgBox "恭喜你,已完成!!"
End Sub---变量n赋值必须在for each之后,且用&连接变量n时必须前边有空格。.
不用透视表了,全部vba代码完成:
Sub 拆分并分别保存()
Dim x As Byte, f As Range, wb As Workbook
Range("a2", Cells(Rows.Count, 1).End(xlUp)).Copy [o1]
Range("o:o").RemoveDuplicates Columns:=1, Header:=xlNo
x = Application.WorksheetFunction.CountA([o:o])
Do
y = y + 1
Range("a1").AutoFilter 1, Cells(y, "o")
Set f = Range("a1").CurrentRegion
Set wb = Workbooks.Add
f.Copy wb.Sheets(1).[a1]
wb.SaveAs "E:\wuyou\" & ThisWorkbook.Sheets(1).Cells(y, "o") & ".xlsx"
wb.Close
Loop Until y = x
ThisWorkbook.Sheets(1).AutoFilterMode = False
[o:o].Delete
MsgBox "恭喜你,已完成!!"
End Sub
.
再换种写法:Sub 拆分并分别保存()Dim x As Byte, f As Range, wb As Workbook
Range("g2", Cells(Rows.Count, 7).End(xlUp)).Copy [z1]
Range("z:z").RemoveDuplicates Columns:=1, Header:=xlNo
x = Application.WorksheetFunction.CountA([z:z])
Do
y = y + 1
Range("a1").AutoFilter 7, Cells(y, "z")
Set f = Range("a1").CurrentRegion
Set wb = Workbooks.Add
f.Copy wb.Sheets(1).[a1]
wb.SaveAs "E:\wuyou\" & ThisWorkbook.Sheets(1).Cells(y, "z") & ".xlsx"
wb.Close
Loop Until y = x
ThisWorkbook.Sheets(1).AutoFilterMode = False
[z:z].Delete
MsgBox "恭喜你,已完成!!"
End Sub
又换种写法,带上总人数和未激活人数:
Sub 拆分并分别保存()
Dim x As Byte, f As Range, wb As Workbook
Range("g2", Cells(Rows.Count, 7).End(xlUp)).Copy [z1]
Range("z:z").RemoveDuplicates Columns:=1, Header:=xlNo
x = Application.WorksheetFunction.CountA([z:z])
Do
y = y + 1
Range("a1").AutoFilter 7, Cells(y, "z")
Set f = Range("a1").CurrentRegion
Set wb = Workbooks.Add
f.Copy wb.Sheets(1).[a1]
n = Cells(Rows.Count, 3).End(xlUp).Row'这里的活动工作表是新增的工作簿wb中的sheets(1),n是统计的这个工作表里的
p = Application.WorksheetFunction.CountIf([d:d], "已激活")
If ThisWorkbook.Sheets(1).Cells(y, "z") <> "" Then
wb.SaveAs "E:\wuyou\" & ThisWorkbook.Sheets(1).Cells(y, "z") & "总人数" & n - 1 & "未激活" & n - p - 1 & ".xlsx"
    Else
    wb.SaveAs "E:\wuyou\" & "不是乡镇" & "总人数" & n - 1 & "未激活" & n - p - 1 & ".xlsx"
    End If
wb.Close
Loop Until y = x + 1
ThisWorkbook.Sheets(1).AutoFilterMode = False
[z:z].Delete
MsgBox "恭喜你,已完成!!"
End Sub
vba论坛,暂时放这里记忆一下,https://club.excelhome.net/forum.php.
Sub 拆分工作簿要求新增的工作簿含5个工作表 ()
Dim x%, wb As Workbook, f AsRange, x1&, a1 As Range, a2 As Worksheet
Range("j2",Cells(Rows.Count, "j").End(xlUp)).Copy [z1]
Range("z:z").RemoveDuplicatesColumns:=1, Header:=xlNo
x = Cells(Rows.Count,"z").End(xlUp).Row
Set wb1 =Workbooks("2022.1.1-10.29.xls").Sheets("nihao")
For n = 0 To 50
Set wb = Workbooks.Add
  Do
  s = s + 1
  n = n + 1
  wb1.Range("a1").AutoFilter 10, wb1.Cells(n, "z")
  Set f = wb1.Range("a1").CurrentRegion
If wb.Worksheets(1).Range("a1").CurrentRegion.Rows.Count <2 Then
   f.Copy wb.Sheets(1).Range("a1")
   wb.Sheets(1).Name = wb.Sheets(1).Range("j2")
Else
     Set a2 = wb.Worksheets.Add
     f.Copy a2.Range("a1")
     a2.Name = a2.Range("j2")
End If
Loop Until s = 5
  wb.SaveAs "v:\wuyou\" & n & ".xlsx"
  wb.Close savechanges:=True
  s = 0
  n = n - 1
Next
Sheets("nihao").AutoFilterMode = False
[z:z].Delete
MsgBox "恭喜你,已完成!!"
End Sub----写这个可费了大麻烦,历经多次f8逐行运行,历经千辛万苦,终于试验出来了,总的来说,这是一个for里边增加一个do循环,本想用for循环嵌套,可无论怎么嵌套都不行,最后几经摸索,发现for循环里边再来个do循环可以满足我的要求,for循环在外边,do循环在里边,do循环完我要求的数量后,再新增工作簿,外边的变量继续累加循环,里边的变量要从0开始再循环①是新建的工作簿会自动有一个sheet1工作表,我需要把这个工作表利用起来,也就是一开始不能新增工作表,直接复制,并且改一下这个工作表的名字②然后再新增4个工作表,使每个工作簿达到5个工作表,然后保存关闭,,其实这样写有个麻烦,随着n的增加,最后一次会达不到5个,那么s的值将永不会是5,会陷入死循环.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub 合并某文件夹下工作簿含多个工作表法1()
Dim s$, a As Workbook, b As Workbook
s = Dir("V:\wuyou\")
Set a = Workbooks.Add
Do
Set b = Workbooks.Open("V:\wuyou\" & s)
       n = b.Worksheets.Count
      For x = 1 To n
      a.Activate
      y = a.Sheets(1).UsedRange.Rows.Count
    If y = 1 Then
    b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(1, 1)
    Else
    b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(y + 1, 1)
    Rows(y + 1).Delete
    End If
     Next x
     b.Close savechanges:=False
s = Dir
Loop Until s = ""
MsgBox "恭喜,已全部合并完成"
End Sub '这种方法,
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub 合并某文件夹下工作簿含多个工作表法2()
Dim s$, a As Workbook, b As Workbook
s = Dir("V:\wuyou\")
Set a = Workbooks.Add
Do
Set b = Workbooks.Open("V:\wuyou\" & s)
       n = b.Worksheets.Count
      For x = 1 To n
      a.Activate
      y = a.Sheets(1).UsedRange.Rows.Count
      If y = 1 Then
       b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(y, 1)
       Else
         b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(y + 1, 1)
      End If
     Next x
     b.Close savechanges:=False
s = Dir
Loop Until s = ""
MsgBox "恭喜,已全部合并完成"
End Sub '这种方法,都用的表的可用区域,无删行,无论何种情况数据,都不会丢失行(usedrange一定要确保最前边几行不能空)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub 合并某文件夹下工作簿含多个工作表法3()
Dim s$, a As Workbook, b As Workbook
s = Dir("V:\wuyou\")
Set a = Workbooks.Add
Do
Set b = Workbooks.Open("V:\wuyou\" & s)
       n = b.Worksheets.Count
      For x = 1 To n
      a.Activate
      b.Worksheets(x).UsedRange.Copy a.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
     Next x
     b.Close savechanges:=False
s = Dir
Loop Until s = ""
MsgBox "恭喜,已全部合并完成"
End Sub '这种方法,定位的a列单元格从下往上找,再往下偏移一格进行复制,但衔接时正好a列有空的,复制会重复一行,无删除.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub 合并某文件夹下工作簿含多个工作表法4()
Dim s$, a As Workbook, b As Workbook
s = Dir("V:\wuyou\")
Set a = Workbooks.Add
Do
Set b = Workbooks.Open("V:\wuyou\" & s)
       n = b.Worksheets.Count
      For x = 1 To n
      a.Activate
      n1 = a.Sheets(1).Range("a1").CurrentRegion.Rows.Count
      b.Worksheets(x).UsedRange.Copy a.Sheets(1).Cells(n1 + 1, 1)
     Next x
     b.Close savechanges:=False
s = Dir
Loop Until s = ""
MsgBox "恭喜,已全部合并完成"
End Sub
-------------------------------------------------------------------------------------------------------------------------------------------
Sub 合并某文件夹下工作簿含多个工作表法5()
Dim s$, a As Workbook, b As Workbook, y%, y1%
s = Dir("V:\wuyou\")
Set a = Workbooks.Add
Do
Set b = Workbooks.Open("V:\wuyou\" & s)
       n = b.Worksheets.Count
   For x = 1 To n
'        a.Activate
'If Application.CountA(b.Worksheets(x).UsedRange.Cells) <> 0 Then 判断的是sheet表里是不是全是空的
If a.Sheets(1).[a1] = "" Then
    b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(1, 1)
Else
  If b.Worksheets(x).[a1] = a.Worksheets(1).[a1] And b.Worksheets(x).[b1] = a.Worksheets(1).[b1] _
  And b.Worksheets(x).[c1] = a.Worksheets(1).[c1] And b.Worksheets(x).[d1] = a.Worksheets(1).[d1] Then
    y = a.Sheets(1).UsedRange.Rows.Count + 1
    b.Sheets(x).UsedRange.Copy a.Sheets(1).Cells(y, 1)
    a.Sheets(1).Rows(y).Delete
    Else
    MsgBox "b工作簿" & x & "表里的四列第一行有问题": GoTo 100
    End If
End If
     Next x
     b.Close savechanges:=False
s = Dir
Loop Until s = ""
MsgBox "恭喜,已全部合并完成"
100: End Sub '这个方法应该完美,只有第一次复制的时候不能判断abcd四列标题是否相等

2#
发表于 2022-10-16 12:34:26 | 只看该作者
谢谢楼主,很实用的工具
回复

使用道具 举报

3#
发表于 2022-10-16 12:40:37 | 只看该作者
感谢分享经验
回复

使用道具 举报

4#
发表于 2022-10-16 12:48:34 | 只看该作者
感谢分享经验
回复

使用道具 举报

5#
发表于 2022-10-16 12:50:01 | 只看该作者
很实用,特别经常用到EXCEL的大表哥!感谢分享经验!!
回复

使用道具 举报

6#
发表于 2022-10-16 18:26:38 | 只看该作者
这用的是VBA吧
回复

使用道具 举报

7#
发表于 2022-10-16 19:00:30 | 只看该作者
好贴子。
回复

使用道具 举报

8#
发表于 2022-10-16 19:56:59 | 只看该作者
感谢分享经验
回复

使用道具 举报

9#
发表于 2022-10-16 20:11:53 | 只看该作者
#在这里快速回复#感謝分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-19 05:58

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表