ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-31 17:38 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
bom在整理过程中,有一些不标准的,希望整理成标准模式
如C1-C5,应该整理成C1,C2,C3,C4,C5
详细见附件。


位置拆分.zip (6.58 KB, 下载次数: 39)

TA的精华主题

TA的得分主题

发表于 2018-8-31 18:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你这问题只有你自己明白,谁也不懂C10-C101,怎么来的C10,C11,C12                                      

TA的精华主题

TA的得分主题

发表于 2018-8-31 18:19 | 显示全部楼层
本帖最后由 zhjlgaojuan 于 2018-8-31 18:22 编辑

Sub test()
Dim SourceArr As Variant
Dim MyReg As Object, MyMatches As Object
Dim St&, Co&, strTmp1$, strTmp2$
Set MyReg = CreateObject("vbscript.regexp")
MyReg.Pattern = "[a-z|A-Z]+(\d+)\-[a-z|A-Z]*(\d+)"
MyReg.Global = True
SourceArr = Range("a2:a" & UsedRange.Rows.Count)
For i = 1 To UBound(SourceArr)
    If MyReg.test(SourceArr(i, 1)) Then
        Set MyMatches = MyReg.Execute(SourceArr(i, 1))
        For Each tmpmatch In MyMatches
            St = tmpmatch.submatches(0)
            Co = tmpmatch.submatches(1)
            strTmp1 = Replace(Left(tmpmatch, InStr(tmpmatch, "-") - 1), tmpmatch.submatches(0), "")
            strTmp2 = ""
            For j = St To Co
               strTmp2 = strTmp2 & strTmp1 & j & ","
            Next
            strTmp2 = Left(strTmp2, Len(strTmp2) - 1)
            SourceArr(i, 1) = Replace(SourceArr(i, 1), tmpmatch, strTmp2)
        Next
    End If
Next
[c2].Resize(UBound(SourceArr), 1) = SourceArr
End Sub

TA的精华主题

TA的得分主题

发表于 2018-8-31 18:38 | 显示全部楼层
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 s1 <> s2 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 s1 <> s2 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

TA的精华主题

TA的得分主题

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

SourceArr = Range("a2:a" & UsedRange.Rows.Count)  这一句居然报错,运行时错误424,要求对象
不过我直接强制A2:A6,测试拆分数据完美

TA的精华主题

TA的得分主题

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

"error!行"  执行到A4的时候就报错退出来了。不知道这一个强制退出的理由是什么?不理解,请解释一下吧,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 14:14 | 显示全部楼层
zhjlgaojuan 发表于 2018-8-31 18:19
Sub test()
Dim SourceArr As Variant
Dim MyReg As Object, MyMatches As Object

TDD_1-TDD_8
这样的可否拆分呢,有下划线,可以认为是字母考虑
当前的代码没有针对以上内容做动作。

TA的精华主题

TA的得分主题

发表于 2018-9-3 14:34 | 显示全部楼层
nzkboy 发表于 2018-9-3 11:44
"error!行"  执行到A4的时候就报错退出来了。不知道这一个强制退出的理由是什么?不理解,请解释一下吧, ...

规则问题,你如果觉得这行的规则是合理的,那就修改一下条件(共2处)
If s1 <> s2 Then 改成

If Len(s1) = 0 Then

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 15:34 | 显示全部楼层
一把小刀闯天下 发表于 2018-9-3 14:34
规则问题,你如果觉得这行的规则是合理的,那就修改一下条件(共2处)
If s1  s2 Then 改成

我知道为什么你的代码提示错误了,是因为  L2-L6,我写成L2-6了。后来改成L2-L6后,就可以支持执行了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-3 15:45 | 显示全部楼层
一把小刀闯天下 发表于 2018-9-3 14:34
规则问题,你如果觉得这行的规则是合理的,那就修改一下条件(共2处)
If s1  s2 Then 改成

我把   If s1 <> s2 Then MsgBox "error:" & i:  Exit Sub
直接改为
If s1 <> s2 Then 改成

If Len(s1) = 0 Then

提示next没有for

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

本版积分规则

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

GMT+8, 2025-1-13 15:56 , Processed in 0.027378 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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