ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于VBA拆分代码的疑问

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-14 18:29 | 显示全部楼层 |阅读模式
本帖最后由 wangxuchun 于 2015-4-14 21:34 编辑

代码地址:http://club.excelhome.net/thread-398041-2-1.html(代码发布者:FDD)我用FDD发布的代码拆分了一个1-3行是表头的表格,输出的结果缺少内容。
Copy tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)
我把+1改为+3,输出内容完整,但每行之间又多加了2个空行,我不太了解VBA,请大家帮忙指点一下如何修改,谢谢!


Excel 数据列 为A-M,关键字在C列,表头为A1-M3区域。数据行起始行:4
根据关键字拆分工作簿(同时保留其他工作表、公式等).rar (12.79 KB, 下载次数: 2)
完整代码:
  1. Option Explicit
  2. Sub addWK2()
  3. Dim dic, temp, arr, tempWK, temp2
  4. Dim rng As Range
  5. Const BYSHNAME As String = "数据表" '可以修改根据哪一个工作表拆分工作簿
  6. Application.ScreenUpdating = False
  7. Set dic = CreateObject("scripting.dictionary") '字典
  8. '下面一句代码:设置上面设置的工作表中的哪一列的内容拆分工作簿
  9. Set rng = ThisWorkbook.Sheets(BYSHNAME).Range("c4:c" & ThisWorkbook.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row)
  10. For Each temp In rng.Cells '这个for循环实现该列的不重复值的筛选
  11.     If Not dic.exists(temp.Value) Then
  12.         dic.Add temp.Value, ""
  13.     End If
  14. Next
  15. arr = dic.keys '返回此列不重复值的数组

  16. For Each temp In arr '这个For循环实现按照不重复数组的内容新建工作簿,并复制应有的内容
  17.     ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "" & temp & ".xls" '以当前temp的值为新工作簿的名称,备份当前工作簿
  18.    
  19.    
  20.    
  21.     Set tempWK = Workbooks.Open(ThisWorkbook.Path & "" & temp & ".xls") '打开以temp的值为名称的工作簿
  22.    
  23.    
  24.         
  25.         tempWK.Sheets(BYSHNAME).Cells.Clear '清除该工作簿以BYSHNAME为名称的工作表的所有内容
  26.    
  27.     For Each temp2 In rng '这个for循环是比较源工作簿中拆分依据的工作表中,拆分依据的那一列与当前temp值是否相同,相同即复制相关内容
  28.         If temp2 = temp Then
  29.         '下面代码:temp2.Offset(0, 1 - rng.Column).Resize(1, 4).Copy是复制源工作表的从A-D列的内容
  30.         '代码tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)是获取tempWK工作簿以BYSHNAME为名称的工作表的最后列的下一行第一列的位置
  31.             temp2.Offset(0, 1 - rng.Column).Resize(1, 13).Copy tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)
  32.             
  33.         End If
  34.     Next
  35.     ThisWorkbook.Sheets(BYSHNAME).Range("1:3").Copy tempWK.Sheets(BYSHNAME).Range("1:3") '复制标题栏
  36.     tempWK.Save
  37.     tempWK.Close
  38. Next
  39. Application.ScreenUpdating = True
  40. Set dic = Nothing
  41. Set rng = Nothing
  42. ThisWorkbook.Sheets(1).Select

  43.    
  44.    
  45. End Sub
复制代码
另,FDD发表的最后一个代码运行提示:应用程序定义或对象定义的错误。请大家帮忙查看一下是否有错误?
  1. Option Explicit
  2. Sub addWK2()
  3.     Dim dic, temp, arr, tempWK, temp2
  4.     Dim rng As Range
  5.     Dim strArea As String
  6.     Const BYSHNAME As String = "数据表" '可以修改根据哪一个工作表拆分工作簿
  7.    
  8.     Set dic = CreateObject("scripting.dictionary") '字典
  9.     '下面一句代码:设置上面设置的工作表中的哪一列的内容拆分工作簿
  10.     Set rng = ThisWorkbook.Sheets(BYSHNAME).Range("c4:c" & ThisWorkbook.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row)
  11.     For Each temp In rng.Cells '这个for循环实现该列的不重复值的筛选
  12.         If Not dic.exists(temp.Value) Then
  13.             dic.Add temp.Value, ""
  14.         End If
  15.     Next
  16.    
  17.     arr = dic.keys '返回此列不重复值的数组
  18.    
  19.    
  20.     For Each temp In arr '这个For循环实现按照不重复数组的内容新建工作簿,并删除不应有的内容
  21.         ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "" & temp & ".xls" '以当前temp的值为新工作簿的名称,备份当前工作簿
  22.         Set tempWK = Workbooks.Open(ThisWorkbook.Path & "" & temp & ".xls") '打开以temp的值为名称的工作簿
  23.         strArea = "" '用于储存所有需要删除的行的地址字符串
  24.         For Each temp2 In rng.Cells '这个for循环是比较源工作簿中拆分依据的工作表中,拆分依据的那一列与当前temp值是否相同,删除不相关内容
  25.             If temp2 <> temp Then
  26.                 If strArea <> "" Then
  27.                     strArea = strArea & ","
  28.                 End If
  29.                 strArea = strArea & tempWK.Sheets(BYSHNAME).Cells(temp2.Row, temp2.Column).EntireRow.Address
  30.             End If
  31.         Next
  32.         tempWK.Sheets(BYSHNAME).Range(strArea).Delete
  33.         tempWK.Save
  34.         tempWK.Close
  35.     Next
  36.    
  37.     Set dic = Nothing
  38.     Set rng = Nothing
  39.     ThisWorkbook.Sheets(1).Select
  40. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2015-4-14 19:21 | 显示全部楼层
代码好长,建议你上传附件。

TA的精华主题

TA的得分主题

发表于 2015-4-15 09:04 | 显示全部楼层
略为修改
Sub addWK2()
Dim dic, temp, arr, tempWK, temp2
Dim rng As Range
Const BYSHNAME As String = "基本情况统计表" '可以修改根据哪一个工作表拆分工作簿
Application.ScreenUpdating = False
Set dic = CreateObject("scripting.dictionary") '字典
'下面一句代码:设置上面设置的工作表中的哪一列的内容拆分工作簿
Set rng = ThisWorkbook.Sheets(BYSHNAME).Range("c4:c" & ThisWorkbook.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row)
For Each temp In rng.Cells '这个for循环实现该列的不重复值的筛选
    If Not dic.exists(temp.Value) Then
        dic.Add temp.Value, ""
    End If
Next
arr = dic.keys '返回此列不重复值的数组
For Each temp In arr '这个For循环实现按照不重复数组的内容新建工作簿,并复制应有的内容
    ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & temp & ".xls" '以当前temp的值为新工作簿的名称,备份当前工作簿
    Set tempWK = Workbooks.Open(ThisWorkbook.Path & "\" & temp & ".xls") '打开以temp的值为名称的工作簿
        tempWK.Sheets(BYSHNAME).[4:10000].Clear '清除该工作簿以BYSHNAME为名称的工作表的所有内容
    For Each temp2 In rng '这个for循环是比较源工作簿中拆分依据的工作表中,拆分依据的那一列与当前temp值是否相同,相同即复制相关内容
        If temp2 = temp Then
        '下面代码:temp2.Offset(0, 1 - rng.Column).Resize(1, 4).Copy是复制源工作表的从A-D列的内容
        '代码tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)是获取tempWK工作簿以BYSHNAME为名称的工作表的最后列的下一行第一列的位置
            temp2.Offset(0, 1 - rng.Column).Resize(1, 13).Copy tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)
        End If
    Next
'    ThisWorkbook.Sheets(BYSHNAME).Range("1:3").Copy tempWK.Sheets(BYSHNAME).Range("1:1") '复制标题栏
    tempWK.Save
    tempWK.Close
Next
Application.ScreenUpdating = True
Set dic = Nothing
Set rng = Nothing
ThisWorkbook.Sheets(1).Select
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-28 16:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
doitbest 发表于 2015-4-15 09:04
略为修改
Sub addWK2()
Dim dic, temp, arr, tempWK, temp2

感谢大侠回复!谢谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 11:01 , Processed in 0.028753 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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