ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于bom中不规则的位置信息拆分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-3 15:56 | 显示全部楼层
nzkboy 发表于 2018-9-3 15:34
我知道为什么你的代码提示错误了,是因为  L2-L6,我写成L2-6了。后来改成L2-L6后,就可以支持执行了

按8楼修改就是这个规则就是有效的,但左侧字符串左起至少要有一个字符,数字开头的作无效处理

TA的精华主题

TA的得分主题

发表于 2018-9-3 15:58 | 显示全部楼层
nzkboy 发表于 2018-9-3 15:45
我把   If s1  s2 Then MsgBox "error:" & i:  Exit Sub
直接改为
If s1  s2 Then 改成


Option Explicit

Sub test()
  Dim arr, i, j, k, t, tt, s, s1, s2, n1, n2
  arr = [a1].CurrentRegion
  For i = 2 To UBound(arr, 1)
    s = vbNullString:
    If InStr(arr(i, 1), ",") Then
      t = Split(arr(i, 1), ",")
      For j = 0 To UBound(t)
        If InStr(t(j), "-") Then
          tt = Split(t(j), "-")
          Call spltchr(tt(0), s1, n1): Call spltchr(tt(1), s2, n2)
          If Len(s1) = 0 Then MsgBox "error!行" & i: Exit Sub
          For k = Val(n1) To Val(n2): s = s & "," & s1 & k: Next
        Else
          s = s & "," & t(j)
        End If
      Next
      arr(i, 1) = Mid(s, 2)
    ElseIf InStr(arr(i, 1), "-") Then
      t = Split(arr(i, 1), "-")
      Call spltchr(t(0), s1, n1): Call spltchr(t(1), s2, n2)
      If Len(s1) = 0 Then MsgBox "error:" & i: Exit Sub
      For j = Val(n1) To Val(n2): s = s & "," & s1 & j: Next
      arr(i, 1) = Mid(s, 2)
    End If
  Next
  [b1].Resize(UBound(arr, 1)) = arr
End Sub

Function spltchr(s, a, b)
  Dim i
  For i = 1 To Len(s)
    If IsNumeric(Mid(s, i, 1)) Then
      b = Mid(s, i): a = Replace(s, b, vbNullString)
      Exit Function
    End If
  Next
  MsgBox "error!"
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 17:11 | 显示全部楼层

哎,好久不编码,居然没看明白你的意思,这回OK了,感谢!

TA的精华主题

TA的得分主题

发表于 2018-9-4 15:27 | 显示全部楼层
  1. Sub qq()
  2. Dim s1$, mh, i1%, i2%, x%, s$, s2$, reg, i%
  3. Set reg = CreateObject("Vbscript.Regexp")
  4. reg.Pattern = "([a-z A-Z _]+)(\d+)-([a-z A-Z _]+)(\d+)"
  5. reg.Global = False
  6. For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
  7. s1 = Cells(i, 1).Value
  8. Do While reg.test(s1)
  9. Set mh = reg.Execute(s1)
  10. s = mh(0).submatches(0)
  11. i1 = mh(0).submatches(1)
  12. i2 = mh(0).submatches(3)
  13. For x = i1 To i2
  14. s2 = s2 & s & x & "."
  15. Next
  16. s2 = Left(s2, Len(s2) - 1)
  17. s1 = reg.Replace(s1, s2)
  18. s2 = ""
  19. Loop
  20. Cells(i, 2) = s1
  21. Next
  22. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-4 15:29 | 显示全部楼层
用正则拆分 位置拆分.rar (16.04 KB, 下载次数: 17)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-5 13:42 | 显示全部楼层

朋友,你的代码有一点问题,就是L2-6这样的,不支持拆分
如果是L2-L6目前拆分是正常的。
可否稍加改进。

TA的精华主题

TA的得分主题

发表于 2018-9-5 15:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
nzkboy 发表于 2018-9-5 13:42
朋友,你的代码有一点问题,就是L2-6这样的,不支持拆分
如果是L2-L6目前拆分是正常的。
可否稍加改进 ...

reg.Pattern = "([a-z A-Z _]+)(\d+)-([a-z A-Z _]+)?(\d+)"

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 14:17 | 显示全部楼层
ykqrs 发表于 2018-9-5 15:18
reg.Pattern = "([a-z A-Z _]+)(\d+)-([a-z A-Z _]+)?(\d+)"

只是增加了一个问号,就解决了问题,简直厉害的不要不要的!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-6 14:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhjlgaojuan 发表于 2018-8-31 18:19
Sub test()
Dim SourceArr As Variant
Dim MyReg As Object, MyMatches As Object

MyReg.Pattern = "[a-z|A-Z]+(\d+)\-[a-z|A-Z]*(\d+)"
变成以下就可以支持下划线了
MyReg.Pattern = "[a-z|A-Z|_]+(\d+)\-[a-z|A-Z|_]*(\d+)"
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-13 15:32 , Processed in 0.024274 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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