ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 根据关键字拆分工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-6-26 16:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test()
  2.   Dim reg As New RegExp
  3.   Dim r%, i%
  4.   Dim arr
  5.   Dim d As New Dictionary
  6.   Application.ScreenUpdating = False
  7.   Application.DisplayAlerts = False
  8.   Application.SheetsInNewWorkbook = 1
  9.   With reg
  10.     .Global = True
  11.     .Pattern = "外税|鼓楼|闽侯|福清|保税|音西|祥廉|融城|晋安|仓山|连江|台江"
  12.   End With
  13.   With Worksheets("sheet1")
  14.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  15.     arr = .Range("a2:c" & r)
  16.   End With
  17.   For i = 1 To UBound(arr)
  18.     If reg.test(arr(i, 3)) Then
  19.       Set mh = reg.Execute(arr(i, 3))
  20.       d(mh(0).Value) = d(mh(0).Value) & "+" & i
  21.     End If
  22.   Next
  23.   For Each ws In Worksheets
  24.     If ws.Name <> "Sheet1" Then
  25.       ws.Delete
  26.     End If
  27.   Next
  28.   For Each aa In d.Keys
  29.     brr = Split(Mid(d(aa), 2), "+")
  30.     ReDim crr(1 To UBound(brr) + 1, 1 To 3)
  31.     For i = 0 To UBound(brr)
  32.       For j = 1 To 3
  33.         crr(i + 1, j) = arr(brr(i), j)
  34.       Next
  35.     Next
  36.     Set wb = Workbooks.Add
  37.     With wb
  38.       With .Worksheets(1)
  39.         .Range("a1:c1") = Array("序号", "名称", "管征单位")
  40.         .Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  41.       End With
  42.       .SaveAs Filename:=ThisWorkbook.Path & "" & aa & ".xls"
  43.       .Close
  44.     End With
  45.   Next
  46. '    Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  47. '    With ws
  48. '      .Name = aa
  49. '      .Range("a1:c1") = Array("序号", "名称", "管征单位")
  50. '      .Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  51. '    End With
  52. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-6-26 16:26 | 显示全部楼层
生成的新工作薄与本工作薄在一个文件夹下。

根据关键字拆分表格(关键字位置不固定).rar

12.35 KB, 下载次数: 120

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-26 16:48 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-26 17:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你好!chxw68 老师,感谢您的代码,基本符合我的要求。几个疑问,麻烦您帮忙一下:
1、复制您的代码时,为什么会提示“用户定义类型未定义”
2、.Pattern = "外税|鼓楼|闽侯|福清|保税|音西|祥廉|融城|晋安|仓山|连江|台江",执行时,为什么比如音西、融城这样关键字的记录无法分拆?
还有一个问题,就是每个工作表列字段数不固定,有点不止3列,能否在拆分时做到:直接根据表头生成新的工作簿,而不是把每个列字段写入新的工作簿


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-26 17:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还有一个请求,能否稍微解释一下代码?

TA的精华主题

TA的得分主题

发表于 2014-6-26 17:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub test()
  2.   Dim reg As Object
  3.   Dim r%, i%
  4.   Dim arr
  5.   Dim d As Object
  6.   Set d = CreateObject("scripting.dictionary")
  7.   Set reg = CreateObject("vbscript.regexp")
  8.   Application.ScreenUpdating = False
  9.   Application.DisplayAlerts = False
  10.   Application.SheetsInNewWorkbook = 1
  11.   With reg
  12.     .Global = True
  13.     .Pattern = "外税|鼓楼|闽侯|保税|音西|祥廉|融城|晋安|仓山|连江|台江"
  14.   End With
  15.   With Worksheets("sheet1")
  16.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  17.     arr = .Range("a2:c" & r)
  18.   End With
  19.   For i = 1 To UBound(arr)
  20.     If reg.test(arr(i, 3)) Then
  21.       Set mh = reg.Execute(arr(i, 3))
  22.       d(mh(0).Value) = d(mh(0).Value) & "+" & i
  23.     End If
  24.   Next
  25.   For Each ws In Worksheets
  26.     If ws.Name <> "Sheet1" Then
  27.       ws.Delete
  28.     End If
  29.   Next
  30.   For Each aa In d.Keys
  31.     brr = Split(Mid(d(aa), 2), "+")
  32.     ReDim crr(1 To UBound(brr) + 1, 1 To 3)
  33.     For i = 0 To UBound(brr)
  34.       For j = 1 To 3
  35.         crr(i + 1, j) = arr(brr(i), j)
  36.       Next
  37.     Next
  38.     Set wb = Workbooks.Add
  39.     With wb
  40.       With .Worksheets(1)
  41.         .Range("a1:c1") = Array("序号", "名称", "管征单位")
  42.         .Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  43.       End With
  44.       .SaveAs Filename:=ThisWorkbook.Path & "" & aa & ".xls"
  45.       .Close
  46.     End With
  47. '    Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  48. '    With ws
  49. '      .Name = aa
  50. '      .Range("a1:c1") = Array("序号", "名称", "管征单位")
  51. '      .Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr
  52. '    End With
  53.   Next
  54. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-6-26 17:29 | 显示全部楼层
第1个问题:通过后期绑定控件的方式已解决。
第2个问题:音西和融城都在福清局下面,所以这两个都分离到福清这个工作薄里了,把.Pattern中的“福清”删掉就好了。
第3个问题:这段代码是针对你这个问题量身定做的,不是通用程序。

根据关键字拆分表格(关键字位置不固定).rar

15.83 KB, 下载次数: 97

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-26 17:35 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-26 17:42 | 显示全部楼层
如果有不同结构的工作表,拆分时是不是只要改这几个地方?
.Pattern = "外税|鼓楼|闽侯|保税|音西|祥廉|融城|晋安|仓山|连江|台江"

Set mh = reg.Execute(arr(i, 3))(3是不是指关键字所在的第三列?)



.Range("a1:c1") = Array("序号", "名称", "管征单位")

        .Range("a2").Resize(UBound(crr), UBound(crr, 2)) = crr

TA的精华主题

TA的得分主题

发表于 2014-6-26 17:51 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chqf 发表于 2014-6-26 17:42
如果有不同结构的工作表,拆分时是不是只要改这几个地方?
.Pattern = "外税|鼓楼|闽侯|保税|音西|祥廉|融 ...

是这样的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 14:36 , Processed in 0.044990 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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