ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 单元格条件拆分求教

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-4 22:20 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sheet2是希望结果例示。
Sheet1运行VBA后,将C列的商品按数量不超过2个拆分成几列,相应的A列B列保持原样。结果输出在sheet1就可以,数量列只做条件参照。
1712239942328.png 表格1.rar (7.41 KB, 下载次数: 9)

TA的精华主题

TA的得分主题

发表于 2024-4-5 06:27 | 显示全部楼层
image.png
出现这样的情况要怎么分呢

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-5 06:42 | 显示全部楼层
Sub 按钮1_Click()
    arr = [a1].CurrentRegion
    brr = [a1].Resize(UBound(arr) * 5, 3)
    r = 1
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = "(\d+)×.+?/"
        For j = 2 To UBound(arr)
            If .test(arr(j, 3)) Then
                str1 = ""
                sm = 0
                For Each m In .Execute(arr(j, 3))
                    If sm + Val(m.submatches(0)) > 2 Then
                        If Len(str1) > 0 Then
                            r = r + 1
                            brr(r, 1) = arr(j, 1)
                            brr(r, 2) = arr(j, 2)
                            brr(r, 3) = str1
                        End If
                        str1 = m.Value
                        sm = Val(m.submatches(0))
                        For i = 2 To sm Step 2
                            r = r + 1
                            brr(r, 1) = arr(j, 1)
                            brr(r, 2) = arr(j, 2)
                            brr(r, 3) = 2 & Replace(str1, sm, "")
                        Next i
                        If sm Mod 2 <> 0 Then
                            str1 = 1 & Replace(str1, sm, "")
                            sm = 1
                        Else
                            str1 = ""
                            sm = 0
                        End If
                    Else
                        sm = sm + Val(m.submatches(0))
                        str1 = str1 & m.Value
                    End If
                Next m
                If Len(str1) > 0 Then
                    r = r + 1
                    brr(r, 1) = arr(j, 1)
                    brr(r, 2) = arr(j, 2)
                    brr(r, 3) = str1
                End If
            End If
        Next j
    End With
    [k1].Resize(r, 3) = brr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-5 06:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件内容供参考

数据拆分.zip

20.85 KB, 下载次数: 5

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-5 09:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 maxmin168 于 2024-4-5 14:13 编辑
liulang0808 发表于 2024-4-5 06:27
出现这样的情况要怎么分呢

谢谢提示,确实提问局限了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-5 10:30 | 显示全部楼层
本帖最后由 maxmin168 于 2024-4-5 14:44 编辑

老师,拆分很完美,数量直接定义,数量列好像都无需参考了,但发现一个问题,有时候商品名称还会带有一些编号,或者是后缀纯数字的表示数量,比如1×苹果-6/2×橘子-K2/,是6个苹果和2个橘子总数为8。试了一下M2单元格可能需要计算,M3单元格拆分后成了2×橘子-K/ ,原来是2×橘子-K2/  似乎跟数量门限的2有关,但就这第二个的2被删了。
d3caefc705f0351520141db74a2bacc1.png 数据拆分.rar (20.43 KB, 下载次数: 1)





TA的精华主题

TA的得分主题

发表于 2024-4-5 16:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 按钮1_Click()
    arr = [a1].CurrentRegion
    brr = [a1].Resize(UBound(arr) * 5, 3)
    r = 1
    With CreateObject("vbscript.regexp")
        .Global = True
        .Pattern = "(\d+)×.+?/"
        For j = 2 To UBound(arr)
            If .test(arr(j, 3)) Then
                str1 = ""
                sm = 0
                For Each m In .Execute(arr(j, 3))
                    If sm + Val(m.submatches(0)) > 2 Then
                        If Len(str1) > 0 Then
                            r = r + 1
                            brr(r, 1) = arr(j, 1)
                            brr(r, 2) = arr(j, 2)
                            brr(r, 3) = str1
                        End If
                        str1 = m.Value
                        sm = Val(m.submatches(0))
                        For i = 2 To sm Step 2
                            r = r + 1
                            brr(r, 1) = arr(j, 1)
                            brr(r, 2) = arr(j, 2)
                            brr(r, 3) = 2 & Mid(str1, Len(sm) + 1)
                        Next i
                        If sm Mod 2 <> 0 Then
                            str1 = 1 & Mid(str1, Len(sm) + 1)
                            sm = 1
                        Else
                            str1 = ""
                            sm = 0
                        End If
                    Else
                        sm = sm + Val(m.submatches(0))
                        str1 = str1 & m.Value
                    End If
                Next m
                If Len(str1) > 0 Then
                    r = r + 1
                    brr(r, 1) = arr(j, 1)
                    brr(r, 2) = arr(j, 2)
                    brr(r, 3) = str1
                End If
            End If
        Next j
    End With
    [p1].Resize(r, 3) = brr
End Sub

TA的精华主题

TA的得分主题

发表于 2024-4-5 16:44 | 显示全部楼层
附件内容供参考

数据拆分-new.zip

20.67 KB, 下载次数: 8

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-11 11:54 | 显示全部楼层

老师,实际使用发现一个问题,就是按数量不超过2个拆分成几列,最好优先满足2个,如果最后剩下1个,那就只有这1个(M列标黄对比R列标黄部分),不然会产生可以拆成2个但成了1个的情况(M列标红对比R列标红部分)。
1712807616538.png 数据拆分-new.rar (18.59 KB, 下载次数: 1)






TA的精华主题

TA的得分主题

发表于 2024-4-11 16:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
。。。。。。。。。。。。。

数据拆分-new.zip

17.88 KB, 下载次数: 5

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 18:41 , Processed in 0.043516 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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