Excel精英培训网

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

[已解决]制作VBA将特定文字和数字拆分

[复制链接]
发表于 2017-3-11 10:31 | 显示全部楼层 |阅读模式
本帖最后由 清秋淡水 于 2017-3-12 19:53 编辑

如题,制作VBA将特定文字和数字拆分,具体要求见附件,请高手看看能否实现,谢谢。
最佳答案
2017-3-12 19:42
  1. Sub tt()
  2.     arr = Range("a2:f" & [a65536].End(3).Row)  '数据区域,根据实际情况自定
  3.     ReDim brr(1 To UBound(arr) * 10, 1 To UBound(arr, 2) + 1)
  4.     With CreateObject("vbscript.regexp")
  5.         .Global = True
  6.         .Pattern = "(-?\d*[\u4e00-\u9fa5]+?)(\d+)"
  7.         For i = 1 To UBound(arr)
  8.             x = arr(i, UBound(arr, 2))
  9.             Set ma = .Execute(x)
  10.             For Each m In ma
  11.                 n = n + 1
  12.                 For j = 1 To UBound(arr, 2) - 1
  13.                     brr(n, j) = arr(i, j)
  14.                 Next
  15.                 brr(n, j) = m.submatches(0)
  16.                 brr(n, j + 1) = m.submatches(1)
  17.             Next
  18.         Next
  19.     End With
  20.     With Sheet2
  21.         .Cells.ClearContents
  22.         .[a1].Resize(, 7) = Array("日期", "工单号", "产品编号", "良品数", "不良总数", "不良分类", "数量")
  23.         .[a2].Resize(n, UBound(brr, 2)) = brr        '显示位置自定。
  24.         .[a2].Resize(n).NumberFormatLocal = "m月dd日"      '显示位置自定。
  25.         .Activate
  26.     End With
  27. End Sub
复制代码

将数据拆分.rar

8.19 KB, 下载次数: 11

发表于 2017-3-11 15:16 | 显示全部楼层
终于做到一道正则了。
  1. Sub tt()
  2.     arr = Range("a2:f6")  '数据区域,根据实际情况自定
  3.     ReDim brr(1 To UBound(arr) * 10, 1 To UBound(arr, 2) + 1)
  4.     With CreateObject("vbscript.regexp")
  5.         .Global = True
  6.         .Pattern = "(-?\d?[\u4e00-\u9fa5]+?)(\d+)"
  7.         For i = 1 To UBound(arr)
  8.             x = arr(i, UBound(arr, 2))
  9.             Set ma = .Execute(x)
  10.             For Each m In ma
  11.                 n = n + 1
  12.                 For j = 1 To UBound(arr, 2) - 1
  13.                     brr(n, j) = arr(i, j)
  14.                 Next
  15.                 brr(n, j) = m.submatches(0)
  16.                 brr(n, j + 1) = m.submatches(1)
  17.             Next
  18.         Next
  19.     End With
  20.     [a10].Resize(n, UBound(brr, 2)) = brr        '显示位置自定。
  21. End Sub
复制代码

将数据拆分.rar

17.92 KB, 下载次数: 29

评分

参与人数 2 +15 收起 理由
laoau138 + 6 来学习
苏子龙 + 9 我和小伙伴都惊呆了,一个正则就处理好

查看全部评分

回复

使用道具 举报

发表于 2017-3-11 15:20 | 显示全部楼层
.Pattern = "(-?\d*?[\u4e00-\u9fa5]+?)(\d+)"  更为妥当一些。
回复

使用道具 举报

 楼主| 发表于 2017-3-11 20:03 | 显示全部楼层
grf1973 发表于 2017-3-11 15:16
终于做到一道正则了。

谢谢,刚试了下能解决我想要的结果,能帮我把实现后的效果放在第二个工作表中吗? 但因我的原始数据会有很多,达上千项或以上,当我把其它的原始数据粘到表中时,就无法使用了。谢谢。我在做样板时为了更直观直接把原始数据和实现后的效果直接放在一张工作表上了,
回复

使用道具 举报

发表于 2017-3-11 20:47 | 显示全部楼层
第2句,第20句自己改一下就OK了。
回复

使用道具 举报

 楼主| 发表于 2017-3-12 16:29 | 显示全部楼层
grf1973 发表于 2017-3-11 20:47
第2句,第20句自己改一下就OK了。

我对VBA一窍不通,不知道怎么改呢,还请大神抽时间帮帮忙,非常感谢
回复

使用道具 举报

发表于 2017-3-12 19:42 | 显示全部楼层    本楼为最佳答案   
  1. Sub tt()
  2.     arr = Range("a2:f" & [a65536].End(3).Row)  '数据区域,根据实际情况自定
  3.     ReDim brr(1 To UBound(arr) * 10, 1 To UBound(arr, 2) + 1)
  4.     With CreateObject("vbscript.regexp")
  5.         .Global = True
  6.         .Pattern = "(-?\d*[\u4e00-\u9fa5]+?)(\d+)"
  7.         For i = 1 To UBound(arr)
  8.             x = arr(i, UBound(arr, 2))
  9.             Set ma = .Execute(x)
  10.             For Each m In ma
  11.                 n = n + 1
  12.                 For j = 1 To UBound(arr, 2) - 1
  13.                     brr(n, j) = arr(i, j)
  14.                 Next
  15.                 brr(n, j) = m.submatches(0)
  16.                 brr(n, j + 1) = m.submatches(1)
  17.             Next
  18.         Next
  19.     End With
  20.     With Sheet2
  21.         .Cells.ClearContents
  22.         .[a1].Resize(, 7) = Array("日期", "工单号", "产品编号", "良品数", "不良总数", "不良分类", "数量")
  23.         .[a2].Resize(n, UBound(brr, 2)) = brr        '显示位置自定。
  24.         .[a2].Resize(n).NumberFormatLocal = "m月dd日"      '显示位置自定。
  25.         .Activate
  26.     End With
  27. End Sub
复制代码

将数据拆分.rar

19.02 KB, 下载次数: 17

回复

使用道具 举报

 楼主| 发表于 2017-3-12 19:52 | 显示全部楼层

每次的问题都是大神你帮我解决,扣谢了、
回复

使用道具 举报

发表于 2021-9-24 09:06 | 显示全部楼层
大神,你好!以下你的这句正则表达式如有字母的话提取不了

.Pattern = "(-?\d*?[\u4e00-\u9fa5]+?)(\d+)"

例子:成品工艺报废(高压不良31层间不良14DCR36电感低26错脚6)

这句子里的DCR36中的36提取不了,请帮忙修改一下,谢谢!

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 20:00 , Processed in 0.282526 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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