|
原帖由 Hoer 于 2009-2-17 06:40 发表
呵呵,差不多了,不过因为我对VBA的了解还比较肤浅,看了半天没看出个大概来,能不能再次麻烦fdd对上面这段代码做一个思路介绍及语句解释,帮助我理解上面这段代码,以便更好的利用代码。
在学习excel的路上有贵人 ...
下面的代码解决了复制的内容缺失的问题。至于速度问题,我到现在为止没有找到更好的办法。
- Option Explicit
- 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("b2:b" & 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).Cells.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, 4).Copy tempWK.Sheets(BYSHNAME).Cells(tempWK.Sheets(BYSHNAME).Cells(65536, 2).End(xlUp).Row + 1, 1)
-
- End If
- Next
- ThisWorkbook.Sheets(BYSHNAME).Range("1:1").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
复制代码
[ 本帖最后由 fdd 于 2009-2-17 10:06 编辑 ] |
|