ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将工作表中65536条数用VBA分割成2000行为一个文件报错

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-28 20:17 | 显示全部楼层 |阅读模式

如下工作表的文件,一共有65536行,我要导入到ERP中的BOM但条目太多,导入就卡死,软件一次性只能支持2000条,我按2000为基数,网找上了一个VBA代码,执行,能分割但在最后报错,无法完全分割,报错如下图:
微信图片_20240128200848.png

调试定位代码错误行如下图:

微信截图_20240128200918.png
VBA宏代码在附件文件中,请大神老师指教,如何修改,或者有没有更好的办法分割。
2520V-BOM模板.rar (512.31 KB, 下载次数: 3)

VAB代码:
  1. Sub copybat()
  2.     Dim i, j, k, m, r As Integer
  3.     Dim n, total_data As Long
  4.     Dim path As String
  5.     Dim title_area, data_column, data_areas As Range
  6.    
  7.     Set title_area = Application.InputBox(prompt:="请用鼠标选择表头及表标题所在区域", Title:="选择", Type:=8) '选取表头区域
  8.     Set data_column = Application.InputBox(prompt:="请鼠标选择需要拆分数据的开始行区域", Title:="选择", Type:=8) '选取拆分起始处
  9.     m = data_column.Row      '获取分割开始行所在区域行号
  10.     r = data_column.Column   '获取分割开始行所在区域列号
  11.     j = data_column.Columns.Count   '获取分割开始行区域列数
  12.     i = Application.InputBox(prompt:="请输入每次分割数据条目数", Title:="选择")
  13.   
  14.    '获取需要分割的数据总条数。这里,可以用两种办法获取到数据区域的尾部行号
  15.       '第一种,使用传统的:End(xlDown).Row,优点是速度快,缺点是有空白行时会出错
  16.       '第二种,使用查找方式find,优点是基本不会出错,缺点是条数较多时候可能会慢一点
  17.    'total_data = Cells(data_column(1, 1)).End(xlDown).Row - m + 1
  18.     total_data = Cells.Find("*", LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row - m + 1
  19.     If MsgBox("本次分割文件数据总数为:" & total_data & "条,将会被分割成" & WorksheetFunction.RoundUp(total_data / i, 0) & "个文件," _
  20.                 & "点击“确定”开始分割,点击“取消”返回", vbOKCancel, "确认") = vbOK Then
  21.         Filename = Application.InputBox(prompt:="请输入分割后的文件主名,默认为“分割文件”", Title:="选择", Default:="分割文件")
  22.         With Application.FileDialog(msoFileDialogFolderPicker)  '获取分割后的文件存储路径
  23.             If .Show = False Then Exit Sub
  24.                 path = .SelectedItems(1) & "" '加入"",否则,文件会被存储到选定路径的上一层
  25.         End With
  26.         Application.ScreenUpdating = False
  27.         k = 0   '第几次分割输出,用于标识分割文件次数
  28.         For n = m To total_data Step i   '从开始分割的行往下计数
  29.             Set data_areas = Range(Cells(n, r), Cells(n + i - 1, j))   '设置每次循环体内的分割数据主体
  30.             Application.Union(title_area, data_areas).Select           '把表头区域以及本次循环体内的数据区域进行合并
  31.             Selection.Copy
  32.             Workbooks.Add
  33.             Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  34.             , SkipBlanks:=False, Transpose:=False      '特殊粘贴:包含源格式的粘贴,以便保持所有格式一致
  35.            k = k + 1
  36.            ActiveWorkbook.SaveAs Filename:=path & Filename & "_" & k & ".xlsx", FileFormat:= _
  37.             xlOpenXMLWorkbook, CreateBackup:=False      '按照既有的文件名、路径、循环次数合并起来存储文件
  38.             ActiveWindow.Close
  39.         Next n
  40.         MsgBox "文件分割完毕!", vbDefaultButton1, "提示"
  41.     End If
  42.     Application.ScreenUpdating = True
  43. End Sub
复制代码





TA的精华主题

TA的得分主题

发表于 2024-1-28 22:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ai代码吧?就step 2000,直接复制到新excel,另存

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-28 23:24 | 显示全部楼层
shiruiqiang 发表于 2024-1-28 22:24
ai代码吧?就step 2000,直接复制到新excel,另存

我只是贴出来一部分,我还有十几万条的,复制死人的要

TA的精华主题

TA的得分主题

发表于 2024-1-29 08:29 | 显示全部楼层
Sub copybat()
Application.ScreenUpdating = False
lj = ThisWorkbook.path & "\"
Set sht = ActiveSheet
With sht
    r = 65536
    ar = .Range("a2:i" & r)
End With
On Error Resume Next
For i = 2 To UBound(ar) Step 2000
    m = m + 1
    Set wb = Workbooks.Add
    With wb.Worksheets(1)
        .Name = "分割文件" & "_" & m
        sht.Range("a1:i1").Copy .[a1]
        If i + 1999 <= 65536 Then
            sht.Range("a" & i & ":i" & i + 1999).Copy .[a2]
        Else
            sht.Range("a" & i & ":i65536").Copy .[a2]
        End If
    End With
    wb.SaveAs Filename:=lj & "分割文件_" & m
    wb.Close
Next i
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-1-29 08:30 | 显示全部楼层
2520V-BOM模板.rar (533.82 KB, 下载次数: 9)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-29 14:26 | 显示全部楼层
本帖最后由 准提部林 于 2024-1-30 14:39 编辑

Rx=65536
for k=1 to Rx step 2000
    R=2000: if R > Rx then R=Rx
   cells(k,1).resize(R ,10).copy "指定位置"
    Rx = Rx -2000
next k

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-30 07:45 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 23:35 , Processed in 0.042808 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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