Excel精英培训网

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

[已解决]怎样根据某字段创建工作簿、工作表

[复制链接]
发表于 2012-5-4 10:06 | 显示全部楼层 |阅读模式
我想根据小渔镇工作簿中“农户基础信息明细表”的H列中的村名作为新工作簿名并在此工作簿根据组别分组建工作表,再把“农户基础信息表”中的内容分村分组复制到这些村组工作簿、工作表,请教各位高手我用代码怎样实现?还有工作簿有没有name属性?怎样根据需要动态获取工作簿名?
最佳答案
2012-5-4 22:27
终于搞定了,运行时间有点长

  1. Sub 分解()
  2. Dim crr(1 To 1500, 1 To 8)
  3. Set yyy = CreateObject("Scripting.FileSystemObject")
  4.    
  5. If yyy.FolderExists(ThisWorkbook.Path & "\各村") = False Then
  6.     Set aaa = CreateObject("Scripting.FileSystemObject")
  7.     aaa.CreateFolder ThisWorkbook.Path & "\各村"
  8.     End If
  9. Set d = CreateObject("scripting.dictionary")




  10. arr = ThisWorkbook.Sheets("农户基础信息明细表").Range("a2:h" & ThisWorkbook.Sheets("农户基础信息明细表").[h65536].End(3).Row)

  11. For i = 1 To UBound(arr)
  12. d(Left(arr(i, 8), Len(arr(i, 8)) - 2)) = ""
  13. Next
  14. arrcm = d.keys
  15. d.RemoveAll

  16. For i = 0 To UBound(arrcm)
  17. Set wb = Workbooks.Add
  18. wb.SaveAs Filename:=ThisWorkbook.Path & "\各村" & Right(arrcm(i), Len(arrcm(i)) - 2), FileFormat:=xlExcel8
  19. 50:
  20. j = j + 1

  21. If j = UBound(arr) Then
  22. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  23. c = c + 1
  24. For k = 1 To 8
  25. crr(c, k) = arr(j, k)
  26. Next
  27. End If

  28. Sheets.Add after:=Sheets(Sheets.Count)
  29. ActiveSheet.Name = Right(arr(j, 8), 2)
  30. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  31. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  32. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  33. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  34. c = 0
  35. Erase crr

  36. GoTo 100
  37. End If



  38. If (j <> 1 And Right(arr(j, 8), 2) <> Right(arr(j + 1, 8), 2)) Then

  39. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  40. c = c + 1
  41. For k = 1 To 8
  42. crr(c, k) = arr(j, k)
  43. Next
  44. End If

  45. Sheets.Add after:=Sheets(Sheets.Count)
  46. ActiveSheet.Name = Right(arr(j, 8), 2)
  47. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  48. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  49. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  50. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  51. c = 0
  52. Erase crr

  53. If Left(arr(j + 1, 8), Len(arr(j + 1, 8)) - 2) <> arrcm(i) Then GoTo 100

  54. Else

  55. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then


  56. c = c + 1
  57. For k = 1 To 8
  58. crr(c, k) = arr(j, k)
  59. Next


  60. End If
  61. End If

  62. If j = UBound(arr) Then
  63. wb.Close True
  64. Else
  65. GoTo 50
  66. End If
  67. 100:
  68. wb.Close True
  69. Next
  70. End Sub



复制代码
小渔镇.rar (247.67 KB, 下载次数: 72)

小渔镇.rar

237.19 KB, 下载次数: 31

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-5-4 10:12 | 显示全部楼层
哎,公司里面屏蔽了RAR文件,真烦...
思路是 ,先循环遍历H列取单元格值,然后将取到的值赋值给新建的工作表,然后查找对应村组的所有信息,然后看你安排的格式,放入对应村组的工作表中...
回复

使用道具 举报

 楼主| 发表于 2012-5-4 10:16 | 显示全部楼层
HowyHuang 发表于 2012-5-4 10:12
哎,公司里面屏蔽了RAR文件,真烦...
思路是 ,先循环遍历H列取单元格值,然后将取到的值赋值给新建的工作 ...

并且要把内容复制到按村名命名的工作簿的不同组里面
回复

使用道具 举报

发表于 2012-5-4 15:35 | 显示全部楼层
写了半天,还没写完,晚上再想下
回复

使用道具 举报

发表于 2012-5-4 20:23 | 显示全部楼层
第一个村是正常了,第二个村出现错误,我再想下

  1. Sub 分解()
  2. Dim crr(1 To 1500, 1 To 8)
  3. Set yyy = CreateObject("Scripting.FileSystemObject")
  4.    
  5. If yyy.FolderExists(ThisWorkbook.Path & "\各村") = False Then
  6.     Set aaa = CreateObject("Scripting.FileSystemObject")
  7.     aaa.CreateFolder ThisWorkbook.Path & "\各村"
  8.     End If
  9. Set d = CreateObject("scripting.dictionary")




  10. arr = ThisWorkbook.Sheets("农户基础信息明细表").Range("a2:h" & ThisWorkbook.Sheets("农户基础信息明细表").[h65536].End(3).Row)

  11. For i = 1 To UBound(arr)
  12. d(Left(arr(i, 8), Len(arr(i, 8)) - 2)) = ""
  13. Next
  14. arrcm = d.keys
  15. d.RemoveAll

  16. For i = 0 To UBound(arrcm)
  17. Set wb = Workbooks.Add
  18. wb.SaveAs Filename:=ThisWorkbook.Path & "\各村" & Right(arrcm(i), Len(arrcm(i)) - 2), FileFormat:=xlExcel8

  19. For j = 1 To UBound(arr)
  20. If j <> 1 And Right(arr(j, 8), 2) <> Right(arr(j + 1, 8), 2) Then

  21. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  22. c = c + 1
  23. For k = 1 To 8
  24. crr(c, k) = arr(j, k)
  25. Next
  26. End If

  27. Sheets.Add after:=Sheets(Sheets.Count)
  28. ActiveSheet.Name = Right(arr(j, 8), 2)
  29. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  30. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  31. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  32. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  33. c = 0
  34. Erase crr

  35. If Left(arr(j + 1, 8), Len(arr(j + 1, 8)) - 2) <> arrcm(i) Then GoTo 100

  36. Else

  37. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then


  38. c = c + 1
  39. For k = 1 To 8
  40. crr(c, k) = arr(j, k)
  41. Next


  42. End If
  43. End If

  44. Next

  45. 100:
  46. wb.Close True
  47. Next
  48. End Sub



复制代码
回复

使用道具 举报

发表于 2012-5-4 22:01 | 显示全部楼层
最后一个村的最后一个组手动下,别的都可以了

  1. Sub 分解()
  2. Dim crr(1 To 1500, 1 To 8)
  3. Set yyy = CreateObject("Scripting.FileSystemObject")
  4.    
  5. If yyy.FolderExists(ThisWorkbook.Path & "\各村") = False Then
  6.     Set aaa = CreateObject("Scripting.FileSystemObject")
  7.     aaa.CreateFolder ThisWorkbook.Path & "\各村"
  8.     End If
  9. Set d = CreateObject("scripting.dictionary")




  10. arr = ThisWorkbook.Sheets("农户基础信息明细表").Range("a2:h" & ThisWorkbook.Sheets("农户基础信息明细表").[h65536].End(3).Row)

  11. For i = 1 To UBound(arr)
  12. d(Left(arr(i, 8), Len(arr(i, 8)) - 2)) = ""
  13. Next
  14. arrcm = d.keys
  15. d.RemoveAll

  16. For i = 0 To UBound(arrcm)
  17. Set wb = Workbooks.Add
  18. wb.SaveAs Filename:=ThisWorkbook.Path & "\各村" & Right(arrcm(i), Len(arrcm(i)) - 2), FileFormat:=xlExcel8
  19. 50:
  20. j = j + 1
  21. If j <> 1 And Right(arr(j, 8), 2) <> Right(arr(j + 1, 8), 2) Then

  22. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  23. c = c + 1
  24. For k = 1 To 8
  25. crr(c, k) = arr(j, k)
  26. Next
  27. End If

  28. Sheets.Add after:=Sheets(Sheets.Count)
  29. ActiveSheet.Name = Right(arr(j, 8), 2)
  30. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  31. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  32. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  33. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  34. c = 0
  35. Erase crr

  36. If Left(arr(j + 1, 8), Len(arr(j + 1, 8)) - 2) <> arrcm(i) Then GoTo 100

  37. Else

  38. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then


  39. c = c + 1
  40. For k = 1 To 8
  41. crr(c, k) = arr(j, k)
  42. Next


  43. End If
  44. End If

  45. If j = UBound(arr) Then
  46. wb.Close True
  47. Else
  48. GoTo 50
  49. End If
  50. 100:
  51. wb.Close True
  52. Next
  53. End Sub



复制代码
回复

使用道具 举报

发表于 2012-5-4 22:27 | 显示全部楼层    本楼为最佳答案   
终于搞定了,运行时间有点长

  1. Sub 分解()
  2. Dim crr(1 To 1500, 1 To 8)
  3. Set yyy = CreateObject("Scripting.FileSystemObject")
  4.    
  5. If yyy.FolderExists(ThisWorkbook.Path & "\各村") = False Then
  6.     Set aaa = CreateObject("Scripting.FileSystemObject")
  7.     aaa.CreateFolder ThisWorkbook.Path & "\各村"
  8.     End If
  9. Set d = CreateObject("scripting.dictionary")




  10. arr = ThisWorkbook.Sheets("农户基础信息明细表").Range("a2:h" & ThisWorkbook.Sheets("农户基础信息明细表").[h65536].End(3).Row)

  11. For i = 1 To UBound(arr)
  12. d(Left(arr(i, 8), Len(arr(i, 8)) - 2)) = ""
  13. Next
  14. arrcm = d.keys
  15. d.RemoveAll

  16. For i = 0 To UBound(arrcm)
  17. Set wb = Workbooks.Add
  18. wb.SaveAs Filename:=ThisWorkbook.Path & "\各村" & Right(arrcm(i), Len(arrcm(i)) - 2), FileFormat:=xlExcel8
  19. 50:
  20. j = j + 1

  21. If j = UBound(arr) Then
  22. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  23. c = c + 1
  24. For k = 1 To 8
  25. crr(c, k) = arr(j, k)
  26. Next
  27. End If

  28. Sheets.Add after:=Sheets(Sheets.Count)
  29. ActiveSheet.Name = Right(arr(j, 8), 2)
  30. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  31. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  32. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  33. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  34. c = 0
  35. Erase crr

  36. GoTo 100
  37. End If



  38. If (j <> 1 And Right(arr(j, 8), 2) <> Right(arr(j + 1, 8), 2)) Then

  39. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then
  40. c = c + 1
  41. For k = 1 To 8
  42. crr(c, k) = arr(j, k)
  43. Next
  44. End If

  45. Sheets.Add after:=Sheets(Sheets.Count)
  46. ActiveSheet.Name = Right(arr(j, 8), 2)
  47. ThisWorkbook.Sheets(1).Range("a1:h1").Copy
  48. wb.Sheets(Sheets.Count).Range("a1").PasteSpecial Paste:=xlPasteAll

  49. wb.Sheets(Sheets.Count).[a1].PasteSpecial Paste:=xlPasteColumnWidths

  50. wb.Sheets(Sheets.Count).[a2].Resize(c, 8) = crr

  51. c = 0
  52. Erase crr

  53. If Left(arr(j + 1, 8), Len(arr(j + 1, 8)) - 2) <> arrcm(i) Then GoTo 100

  54. Else

  55. If Left(arr(j, 8), Len(arr(j, 8)) - 2) = arrcm(i) Then


  56. c = c + 1
  57. For k = 1 To 8
  58. crr(c, k) = arr(j, k)
  59. Next


  60. End If
  61. End If

  62. If j = UBound(arr) Then
  63. wb.Close True
  64. Else
  65. GoTo 50
  66. End If
  67. 100:
  68. wb.Close True
  69. Next
  70. End Sub



复制代码
小渔镇.rar (247.67 KB, 下载次数: 72)

点评

已测试,10版运行正常  发表于 2012-5-6 10:24
回复

使用道具 举报

发表于 2012-5-5 12:39 | 显示全部楼层
运行错误1004,不知是怎么回事?谢谢
回复

使用道具 举报

发表于 2012-5-5 15:49 | 显示全部楼层
你的是03还是10,我在10下正常运行,未在03下测试
回复

使用道具 举报

 楼主| 发表于 2012-5-7 11:40 | 显示全部楼层
桀骜孤星 发表于 2012-5-4 22:27
终于搞定了,运行时间有点长

谢谢你!我的版本是EXCEL2003,我试一下。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 03:40 , Processed in 0.410874 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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