ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6332|回复: 10

[求助] 如何根据一列编码将一个excel拆分为多个500条数据的excel文件?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-7-6 11:04 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请各位帮忙看一下如何根据一列编码将一个excel拆分为多个500条数据的excel文件?
具体要求请见附件,谢谢帮助!

拆分编程求助.zip

447.76 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2016-7-6 11:16 | 显示全部楼层
根据B列编码拆分为500行一个Excel文件,例如BP4 500个,但同一个拆分文件仅保留一个编码,如BP4最终有100个,单独拆分,不与其他编码混在一起

没看懂?

如果有501条数据,如何拆分呢,一个500条,一个一条。

并且最终拆分文件命名为自定义名称+B列对应编码+对应编码文件序号
对应编码文件序号如BP4拆分了20个文件,编号依次由1-20

能举个例子吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-6 11:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2016-7-6 11:16
根据B列编码拆分为500行一个Excel文件,例如BP4 500个,但同一个拆分文件仅保留一个编码,如BP4最终有100个 ...

比如BP4有1100条数据,BP5有800条数据
最终拆分结果为5个文件,文件名及数据量如下:
自定义名称-BP4-1 500
自定义名称-BP4-2 500
自定义名称-BP4-3 100
自定义名称-BP5-1 500
自定义名称-BP5-2 300

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-6 11:48 | 显示全部楼层
本帖最后由 peaxenia 于 2016-7-6 12:15 编辑

顶一下,求帮助

TA的精华主题

TA的得分主题

发表于 2016-7-6 14:19 | 显示全部楼层
本帖最后由 魂断蓝桥 于 2016-7-6 14:21 编辑
peaxenia 发表于 2016-7-6 11:48
顶一下,求帮助

代码有一个问题,数据中有bm1的数据的时候,
运行到bm1的第17个表格,就会出错,
调试了好长时间,没有结果,也不知道是什么原因,
如果表格中只保留bm1,拆分没有问题,实在是不知道怎么办了。

楼主自己测试一下吧。

实在不行,先把bm1 删除,拆分完后,再把bm1粘贴回来,再拆

QQ截图20160706141624.png

QQ截图20160706141600.png


Sub 拆分()
Dim i&, j%, d, arr, k, m%, tim
tim = Timer
Set d = CreateObject("Scripting.Dictionary")
arr = [a1].CurrentRegion
Application.ScreenUpdating = False
For i = 1 To UBound(arr)
    d(arr(i, 2)) = d(arr(i, 2)) + 1
Next
k = d.keys
Dim cnn, rs As Object, Sql As String, wb As Workbook
Set cnn = CreateObject("adodb.connection")
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullName
For j = 0 To UBound(k)
    Sql = "select * from [sheet1$a1:c] where F2='" & k(j) & "'"
    Set rs = cnn.Execute(Sql)
        For m = 1 To (d(k(j)) / 500 + 0.5) \ 1
            Set wb = Workbooks.Add
                arr = rs.GetRows(500, 0)
                Range("a1").Resize(UBound(arr, 2) + 1, 3) = Application.Transpose(arr)
                wb.SaveAs ThisWorkbook.Path & "\分表\" & "自定义名称-" & k(j) & "-" & m & " " & UBound(arr, 2) + 1
                wb.Close True
        Next
Next
Application.ScreenUpdating = True
Set d = Nothing
Set rs = Nothing
Set cnn = Nothing
End Sub






TA的精华主题

TA的得分主题

 楼主| 发表于 2016-7-6 16:27 | 显示全部楼层
魂断蓝桥 发表于 2016-7-6 14:19
代码有一个问题,数据中有bm1的数据的时候,
运行到bm1的第17个表格,就会出错,
调试了好长时间,没有 ...

谢谢,但还是不行,编码非常多,还有其他编码也运行到17个就会出错。

TA的精华主题

TA的得分主题

发表于 2016-7-6 16:30 | 显示全部楼层
peaxenia 发表于 2016-7-6 16:27
谢谢,但还是不行,编码非常多,还有其他编码也运行到17个就会出错。

其中原因,我也不太清楚了。

TA的精华主题

TA的得分主题

发表于 2016-7-6 20:29 | 显示全部楼层
peaxenia 发表于 2016-7-6 16:27
谢谢,但还是不行,编码非常多,还有其他编码也运行到17个就会出错。

终于搞明白了。

因为楼主的数据超出65536 excel2003的限制,在excel2010 中,虽然行数增加到100多万,但用 【sheet1$A:C】这种形式,只能取到65535的数据,其余的不能得出,所以,需要用[SHEET1$] 这种写法。

拆分出137个分表

新建文件夹.part1.rar (1.39 MB, 下载次数: 22)

新建文件夹.part2.rar (732.39 KB, 下载次数: 22)





代码改成

Sub 拆分()
Dim i&, j%, d, arr, k, m%, tim
tim = Timer
Set d = CreateObject("Scripting.Dictionary")
arr = [a1].CurrentRegion
Application.ScreenUpdating = False
For i = 1 To UBound(arr)
    d(arr(i, 2)) = d(arr(i, 2)) + 1
Next
k = d.keys
Dim cnn, rs As Object, Sql As String, wb As Workbook
Set cnn = CreateObject("adodb.connection")
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullName
For j = 0 To UBound(k)
    Sql = "select * from [sheet1$] where F2='" & k(j) & "'"
    Set rs = cnn.Execute(Sql)
        For m = 1 To (d(k(j)) / 500 + 0.5) \ 1
            Set wb = Workbooks.Add
                arr = rs.GetRows(500, 0)
                Range("a1").Resize(UBound(arr, 2) + 1, 3) = Application.Transpose(arr)
                wb.SaveAs ThisWorkbook.Path & "\分表\" & "自定义名称-" & k(j) & "-" & m & " " & UBound(arr, 2) + 1
                wb.Close True
        Next
Next
Application.ScreenUpdating = True
Set d = Nothing
Set rs = Nothing
Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2016-7-6 21:26 | 显示全部楼层
  1. Sub Opiona()

  2. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  3. Application.ScreenUpdating = False '//关闭屏幕刷新
  4. Application.DisplayAlerts = False '//关闭系统提示
  5. t = Timer   '//开始时间

  6.     PathG = ThisWorkbook.Path & "\分表"
  7.     Set FSO = CreateObject("Scripting.FileSystemObject")
  8.     If FSO.FolderExists(PathG) = True Then
  9.         FSO.GetFolder(PathG).Delete   '//删除文件夹
  10.     End If
  11.     Delay 1   '延迟3秒
  12.     MkDir PathG    '//创建文件夹
  13.    
  14.    
  15.     Set SH1 = Sheets("Sheet1")

  16.     Str_coon = "HDR=NO';Data Source =" & ThisWorkbook.FullName     '//OFFICE2003,2007 通用
  17.     StrSQL = "SELECT DISTINCT F2 FROM [" & SH1.Name & "$A:C] WHERE LEN(F2)>0"
  18.    
  19.     ARX = GET_SQL_To_Arr(StrSQL, Str_coon, False)
  20.     For X = 0 To UBound(ARX, 1)
  21.         StrSQL = "SELECT F1,F2,F3 FROM [" & SH1.Name & "$] WHERE F2='" & ARX(X, 0) & "'"
  22.         SQLARX = GET_SQL_To_Arr(StrSQL, Str_coon, False)
  23.         
  24.         INTG = 1   '记录是此编码的第几个表
  25.         For I = 0 To UBound(SQLARX, 1) Step 500
  26.             Set WB = Workbooks.Add
  27.             Set SHW = WB.Worksheets(1)
  28.             ReDim ARXX(0 To 499, 0 To 2)
  29.             
  30.             MAXROW = 0
  31.             For Y = 0 To 499
  32.                 MAXROW = MAXROW + 1  '//记录本表有多少行数据
  33.                 If I + Y <= UBound(SQLARX, 1) Then
  34.                     For m = 0 To 2
  35.                         ARXX(Y, m) = SQLARX(I + Y, m)
  36.                     Next m
  37.                 Else
  38.                     Exit For
  39.                 End If
  40.             Next Y
  41.             SHW.Range("A1").Resize(UBound(ARXX, 1) + 1, UBound(ARXX, 2) + 1) = ARXX
  42.             WB.SaveAs PathG & "\自定义名称-" & ARX(X, 0) & "-" & Format(INTG, "00") & " " & MAXROW & ".XLSX"
  43.             WB.Close True
  44.             INTG = INTG + 1
  45.         Next I
  46.     Next X

  47. Application.ScreenUpdating = True '//恢复屏幕刷新
  48. Application.DisplayAlerts = True '//恢复系统提示
  49. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  50. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-7-6 21:28 | 显示全部楼层
拆分编程求助.rar (338.35 KB, 下载次数: 36)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 16:09 , Processed in 0.026718 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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