ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 这类拆分数据需要怎么处理比较快,请各位老师进来看一下

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-12-14 10:42 | 显示全部楼层
henry6 发表于 2021-12-13 16:05
楼主是不是要的这种结果,VBA+正则表达式

大哥,你是不是忘了上传附件啊?
否则岂不有卖弄之嫌?

TA的精华主题

TA的得分主题

发表于 2021-12-14 13:04 | 显示全部楼层
试试PQ?
image.png

数据整理实例.7z

13.07 KB, 下载次数: 1

TA的精华主题

TA的得分主题

发表于 2021-12-16 18:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
借你的案例,硬逼着自己去学习了一下正则,
实在是能力有限,只能解决4个,有一个解决不了。
代码如下:
  1. Sub Test() '号字的UNICODE:\u53f7
  2.   With ActiveSheet
  3.     R = .Cells(10000, 2).End(xlUp).Row
  4.     Dim Target_Data()
  5.     Target_Data = .[B3].Resize(R - 2).Value
  6.   End With
  7.   
  8.   Dim MyReg As Object
  9.   Set MyReg = CreateObject("VBScript.Regexp")
  10.   Dim My_Matches As Object, My_Match As Object
  11.   Dim Temp_Str As String
  12.   For I = 1 To UBound(Target_Data)
  13.     With MyReg
  14.      .Global = True
  15.      .Pattern = "[\u4e00-\u9fa5]*\d*\u53f7+[\u4e00-\u9fa5]*\d*-*\d*"
  16.       Set My_Matches = .Execute(Target_Data(I, 1))
  17.     End With
  18.     For Each My_Match In My_Matches
  19.       Temp_Str = Temp_Str & My_Match & ";"
  20.     Next
  21.     If Right(Temp_Str, 1) = ";" Then Temp_Str = Left(Temp_Str, Len(Temp_Str) - 1)
  22.     ActiveSheet.Cells(I + 2, 3).Value = Temp_Str
  23.     Temp_Str = ""
  24.   Next
  25.   MsgBox "执行完毕!", vbOKOnly + vbInformation, "乐天工作室:温馨提示!"
  26.   
  27. End Sub
复制代码
运行效果如图,只能解决4个,第5个有冲突,想破脑袋也想不出排除规则:
02.jpg
因为自己是一边摸索,一边测试,
不太会正则的窍门,只能遵从正则的基本语法,
所以规则的表述自己都觉得像懒婆娘的裹脚布——又臭又长:"[\u4e00-\u9fa5]*\d*\u53f7+[\u4e00-\u9fa5]*\d*-*\d*"
顺便跟你解释一下吧:
[\u4e00-\u9fa5]代表所有的中文
后面跟一个星号,表述中文出现的次数是0至无限个,如果是+号表示至少出现1次以上
\u53f7是号字对应的UNICODE,这个网上可以查。
\d表示数字
其他没什么。
附上网上找的正则语法基础
03.jpg
04.jpg
兄弟不妨自己学习一下吧。

你的这个案例是我第一次使用正则,
虽然不太会,
但感觉正则在数据加工领域功能相当强大。
速度快!多样性组合的妙用。

楼下似乎有人解决了,
可惜没上传附件。
期待高人的指点,
我也同样需要提高。

其他不说了,见附件。






地址处理的正则方法.rar

19.75 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2022-1-20 16:13 | 显示全部楼层
以下代码可以解决你的问题,请参考!

Dim i As Integer
Set reg = CreateObject("VBScript.Regexp")
rownumber = Cells(Rows.Count, "G").End(xlUp).Row
Sheets("sheet1").Range("H:H").Clear

With reg
    .Global = True
    .Pattern = "[一-龢]+\d*-?\d+[号|\d+]"
   
    For i = 2 To rownumber
        结果 = ""
        Set rst = .Execute(Sheets("sheet1").Range("G" & i))
        For Each s In rst
            结果 = 结果 & ";" & s
        Next s
        结果 = Mid(结果, 2, Len(结果) - 1)
        If 结果 <> "" Then
            Range("G" & i).Offset(0, 1) = 结果
        Else
           Range("G" & i).Offset(0, 1) = "未匹配到"
        End If
    Next i
End With

End Sub

数据整理实例.rar

13.37 KB, 下载次数: 0

代码文件

TA的精华主题

TA的得分主题

发表于 2022-1-20 16:23 | 显示全部楼层
以下代码可以解决你的问题,请参考!

Sub 数据处理()
Dim i As Integer
Set reg = CreateObject("VBScript.Regexp")
rownumber = Cells(Rows.Count, "G").End(xlUp).Row
Sheets("sheet1").Range("H:H").Clear
With reg
    .Global = True
    .Pattern = "[一-龢]+\d*-?\d+[号|\d+]"
   
    For i = 2 To rownumber
        结果 = ""
        Set rst = .Execute(Sheets("sheet1").Range("G" & i))
        For Each s In rst
            结果 = 结果 & ";" & s
        Next s
        If 结果 <> "" Then
            结果 = Mid(结果, 2, Len(结果) - 1)
            Range("G" & i).Offset(0, 1) = 结果
        Else
           Range("G" & i).Offset(0, 1) = "未匹配到"
        End If
    Next i
End With
End Sub

数据整理实例.rar

14.61 KB, 下载次数: 2

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

本版积分规则

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

GMT+8, 2025-1-13 05:59 , Processed in 0.020952 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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