Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5109|回复: 16

[已解决]根据数据内容批量生成新工作簿

[复制链接]
发表于 2014-2-25 17:10 | 显示全部楼层 |阅读模式
话不多说,详见附件说明。
最佳答案
2014-2-26 12:32
本帖最后由 xdragon 于 2014-2-26 12:36 编辑
  1. Sub splitdata()
  2.   Dim arr(), i&, j%, re(), cnt&
  3.   With ThisWorkbook.Sheets("明细")
  4.      i = .Cells(Rows.Count, 1).End(xlUp).Row
  5.      j = .Cells(1, Columns.Count).End(xlToLeft).Column
  6.      arr = .Range(.Cells(1, 1), .Cells(i, j)).Value
  7.   End With
  8.   
  9.   ReDim re(1 To 10000, 1 To UBound(arr, 2))
  10.   
  11.   Application.ScreenUpdating = False
  12.   Application.DisplayAlerts = False
  13.   For i = 2 To UBound(arr)
  14.     If arr(i, 1) = 1 Then
  15.        Do
  16.           cnt = cnt + 1
  17.           For j = 1 To UBound(arr, 2)
  18.             re(cnt, j) = arr(i, j)
  19.           Next
  20.           i = i + 1
  21.           If i > UBound(arr) Then Exit Do
  22.        Loop Until arr(i, 1) = 1
  23.        Workbooks.Add (1)
  24.        Range("A1").Resize(cnt, j - 1) = re
  25.        ActiveWorkbook.SaveAs ThisWorkbook.Path & "" & re(1, 2), 51
  26.        ActiveWorkbook.Close
  27.        cnt = 0: i = i - 1
  28.     End If
  29.   Next
  30.   Application.DisplayAlerts = True
  31.   Application.ScreenUpdating = True
  32. End Sub
复制代码
我也参与下,哈哈

需求.rar

19.84 KB, 下载次数: 44

发表于 2014-2-25 17:33 | 显示全部楼层
本帖最后由 冥王 于 2014-2-25 18:01 编辑
  1. Sub AddBK()
  2. Application.ScreenUpdating = False
  3. Application.DisplayAlerts = False
  4.     Dim Newbook As Workbook
  5.     Dim ShName As Variant
  6.     Dim Arr(1 To 14) As Variant
  7.     Dim i As Integer
  8.     Dim myNewWorkbook As Integer
  9. For i = 1 To 14
  10. Arr(i) = ThisWorkbook.Sheets("明细").Cells(i + 12, 6)
  11. Next

  12. For i = LBound(Arr) To UBound(Arr)
  13.     Set Newbook = Workbooks.Add
  14.      With Newbook.Sheets(1)
  15.          ThisWorkbook.Sheets("明细").Rows("1:1").Copy .Cells(1, 1)
  16.        Set c = ThisWorkbook.Sheets("明细").Range("B:B").Find(Arr(i))
  17.             If Not c Is Nothing Then
  18.                 firstAddress = c.Address
  19.                 Do
  20.                  m = c.Row
  21.                  n = .[A65536].End(xlUp).Row
  22.                  ThisWorkbook.Sheets("明细").Rows(m).Copy .Cells(n + 1, 1)
  23.                   Set c = ThisWorkbook.Sheets("明细").Range("B:B").FindNext(c)
  24.          
  25.                 Loop While Not c Is Nothing And c.Address <> firstAddress
  26.             Else
  27.             MsgBox ("无数据")
  28.             End If
  29.          n = .[A65536].End(xlUp).Row
  30.          Newbook.SaveAs Filename:=ThisWorkbook.Path & "" & Arr(i)
  31.          Newbook.Close Savechanges:=True
  32.         Set Newbook = Nothing
  33.       End With
  34. Next

  35. Application.DisplayAlerts = True
  36. Application.ScreenUpdating = True
  37. End Sub
复制代码

点评

要生成的工作簿不一定是14个。For i = 1 To 14 这是个BUG。  发表于 2014-2-25 22:52
本机测试耗时71.8秒。  发表于 2014-2-25 22:22

评分

参与人数 1 +20 收起 理由
as0810114 + 20 多谢帮忙

查看全部评分

回复

使用道具 举报

发表于 2014-2-25 18:25 | 显示全部楼层
  1. Sub 汇总()
  2.     Dim arr, brr(), k%, i%, m%, n%, tmp
  3.     Dim d As Object
  4.     arr = Range("a1").CurrentRegion
  5.     Set d = CreateObject("scripting.dictionary")
  6.     For k = 2 To UBound(arr)
  7.         If Not d.exists(arr(k, 2)) Then
  8.             d(arr(k, 2)) = ""
  9.         End If
  10.     Next k
  11.     Application.ScreenUpdating = False
  12.     tmp = d.keys
  13.     For i = 1 - 1 To d.Count - 1
  14.         For k = 2 To UBound(arr)
  15.             If arr(k, 2) = tmp(i) Then
  16.                 n = n + 1
  17.                 ReDim Preserve brr(1 To 3, 1 To n)
  18.                 For m = 1 To 3
  19.                     brr(1, n) = arr(k, 1)
  20.                     brr(2, n) = arr(k, 2)
  21.                     brr(3, n) = arr(k, 3)
  22.                 Next m
  23.             End If
  24.         Next k
  25.         Range("a1:c3").Copy
  26.         Workbooks.Add
  27.         Range("a1").PasteSpecial (xlPasteAll)
  28.         Range("a2").Resize(n, 3) = Application.Transpose(brr)
  29.         ActiveWorkbook.SaveAs tmp(i) & ".xlsx"
  30.         ActiveWorkbook.Close 0
  31.         Erase brr: n = 0
  32.     Next i
  33.     Application.ScreenUpdating = True
  34. End Sub
复制代码

点评

不是少了一句,是少加上一句。  发表于 2014-2-25 22:27
风林少了一句。我测试的时候,也是找了半天,才找到文件藏在那了。。  发表于 2014-2-25 22:27
找了半天才找到文件在哪儿。  发表于 2014-2-25 22:07

评分

参与人数 1 +20 收起 理由
as0810114 + 20 多谢帮忙。

查看全部评分

回复

使用道具 举报

发表于 2014-2-25 19:49 | 显示全部楼层
A董的提问。
绝对要参加哇。
  1. Sub A()
  2.     Application.ScreenUpdating = False
  3.     Dim ARR, BRR(1 To 100000, 1 To 3)
  4.     Dim M, N, I, K
  5.     Dim WO As Workbook
  6.     Dim SR
  7.     SR = ThisWorkbook.Path & Application.PathSeparator
  8.     ARR = Range("A2:C" & Cells(Rows.Count, 3).End(3).Row + 1)
  9.     BRR(1, 1) = "序号"
  10.     BRR(1, 2) = "营业部"
  11.     BRR(1, 3) = "数据"
  12.     N = 1
  13.     For M = 1 To UBound(ARR) - 1
  14.         N = N + 1
  15.         BRR(N, 1) = ARR(M, 1)
  16.         BRR(N, 2) = ARR(M, 2)
  17.         BRR(N, 3) = ARR(M, 3)
  18.         If ARR(M, 2) <> ARR(M + 1, 2) Then
  19.             Set WO = Workbooks.Add
  20.             ActiveSheet.Cells(1, 1).Resize(N, 3) = BRR
  21.             WO.SaveAs SR & ARR(M, 2) & ".xls"
  22.             WO.Close
  23.             N = 1
  24.             Erase BRR
  25.             BRR(1, 1) = "序号"
  26.             BRR(1, 2) = "营业部"
  27.             BRR(1, 3) = "数据"
  28.         End If
  29.     Next
  30.     Application.ScreenUpdating = True
  31.     MsgBox "ok"
  32. End Sub
复制代码

需求.rar

119.59 KB, 下载次数: 17

点评

不一定只有3列,需要扩展,  发表于 2014-2-25 22:52
本机测试耗时65.8秒  发表于 2014-2-25 22:22

评分

参与人数 1 +20 收起 理由
as0810114 + 20 多谢帮忙。

查看全部评分

回复

使用道具 举报

发表于 2014-2-25 22:25 | 显示全部楼层
你什么破机子啊。
火星版的吧。
赶紧让他该去那去那吧。
回复

使用道具 举报

发表于 2014-2-25 22:29 | 显示全部楼层
风林火山 发表于 2014-2-25 18:25

不是藏起来了,是你说的要和这个文件在一个文件夹,所以就没用thisworkbook.path
回复

使用道具 举报

 楼主| 发表于 2014-2-25 22:44 | 显示全部楼层
风林火山 发表于 2014-2-25 22:29
不是藏起来了,是你说的要和这个文件在一个文件夹,所以就没用thisworkbook.path

是同一个文件夹啊,所以肯定要用到path的。
回复

使用道具 举报

 楼主| 发表于 2014-2-25 22:45 | 显示全部楼层
冠军欧洲2010 发表于 2014-2-25 22:25
你什么破机子啊。
火星版的吧。
赶紧让他该去那去那吧。

能否优化一下,注意第一列只要数字等于1,就新增工作簿。
回复

使用道具 举报

发表于 2014-2-25 22:46 | 显示全部楼层
as0810114 发表于 2014-2-25 22:44
是同一个文件夹啊,所以肯定要用到path的。

同一个文件夹不需要路径的,直接就使用该文件的路径了。
回复

使用道具 举报

 楼主| 发表于 2014-2-25 22:47 | 显示全部楼层
风林火山 发表于 2014-2-25 22:46
同一个文件夹不需要路径的,直接就使用该文件的路径了。

生成的文件不在我发的需求文件夹中
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-23 18:56 , Processed in 1.198999 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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