ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按需求将数据进行拆分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-3 17:11 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-3 18:14 | 显示全部楼层

自己鼓捣出来了··思路跟您差不多··我用的split

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-3 18:14 | 显示全部楼层
Sub ss()
Dim ar, i&, d As Object, x, xx, pj&, n&, a, b, c, an&, bn&, cn&
Set d = CreateObject("scripting.dictionary")
'取数
With Sheets("数据源")
    ar = .Range("A1:D" & .Cells(.Rows.Count, 1).End(3).Row)
End With
ReDim a(1 To UBound(ar), 1 To 4)
b = a
c = a
'数据置入字典
For i = 2 To UBound(ar)
    x = ar(i, 1)
    If Not d.exists(x) Then Set d(x) = CreateObject("scripting.dictionary")
    d(x)(ar(i, 2)) = ar(i, 3) & "-" & ar(i, 4)
Next
'分配至数组
For Each x In d.keys
    pj = Int(d(x).Count / 3) '平均数
    n = 0
    For Each xx In d(x).keys
        n = n + 1
        Select Case n
        Case Is <= pj
            an = an + 1
            a(an, 1) = x
            a(an, 2) = xx
            a(an, 3) = Split(d(x)(xx), "-")(0)
            a(an, 4) = Split(d(x)(xx), "-")(1)
        Case Is <= pj * 2
            bn = bn + 1
            b(bn, 1) = x
            b(bn, 2) = xx
            b(bn, 3) = Split(d(x)(xx), "-")(0)
            b(bn, 4) = Split(d(x)(xx), "-")(1)
           
        Case Else
            cn = cn + 1
            c(cn, 1) = x
            c(cn, 2) = xx
            c(cn, 3) = Split(d(x)(xx), "-")(0)
            c(cn, 4) = Split(d(x)(xx), "-")(1)
        End Select
    Next
Next
'写入分表
Sheet2.Range("A2:d" & Rows.Count).ClearContents
Sheet3.Range("A2:d" & Rows.Count).ClearContents
Sheet4.Range("A2:d" & Rows.Count).ClearContents
Sheet2.[A2].Resize(UBound(a), 4) = a
Sheet3.[A2].Resize(UBound(b), 4) = b
Sheet4.[A2].Resize(UBound(c), 4) = c
MsgBox "完成"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-3 18:15 | 显示全部楼层
  1. Sub ss()
  2. Dim ar, i&, d As Object, x, xx, pj&, n&, a, b, c, an&, bn&, cn&
  3. Set d = CreateObject("scripting.dictionary")
  4. '取数
  5. With Sheets("数据源")
  6.     ar = .Range("A1:D" & .Cells(.Rows.Count, 1).End(3).Row)
  7. End With
  8. ReDim a(1 To UBound(ar), 1 To 4)
  9. b = a
  10. c = a
  11. '数据置入字典
  12. For i = 2 To UBound(ar)
  13.     x = ar(i, 1)
  14.     If Not d.exists(x) Then Set d(x) = CreateObject("scripting.dictionary")
  15.     d(x)(ar(i, 2)) = ar(i, 3) & "-" & ar(i, 4)
  16. Next
  17. '分配至数组
  18. For Each x In d.keys
  19.     pj = Int(d(x).Count / 3) '平均数
  20.     n = 0
  21.     For Each xx In d(x).keys
  22.         n = n + 1
  23.         Select Case n
  24.         Case Is <= pj
  25.             an = an + 1
  26.             a(an, 1) = x
  27.             a(an, 2) = xx
  28.             a(an, 3) = Split(d(x)(xx), "-")(0)
  29.             a(an, 4) = Split(d(x)(xx), "-")(1)
  30.         Case Is <= pj * 2
  31.             bn = bn + 1
  32.             b(bn, 1) = x
  33.             b(bn, 2) = xx
  34.             b(bn, 3) = Split(d(x)(xx), "-")(0)
  35.             b(bn, 4) = Split(d(x)(xx), "-")(1)
  36.            
  37.         Case Else
  38.             cn = cn + 1
  39.             c(cn, 1) = x
  40.             c(cn, 2) = xx
  41.             c(cn, 3) = Split(d(x)(xx), "-")(0)
  42.             c(cn, 4) = Split(d(x)(xx), "-")(1)
  43.         End Select
  44.     Next
  45. Next
  46. '写入分表
  47. Sheet2.Range("A2:d" & Rows.Count).ClearContents
  48. Sheet3.Range("A2:d" & Rows.Count).ClearContents
  49. Sheet4.Range("A2:d" & Rows.Count).ClearContents
  50. Sheet2.[A2].Resize(UBound(a), 4) = a
  51. Sheet3.[A2].Resize(UBound(b), 4) = b
  52. Sheet4.[A2].Resize(UBound(c), 4) = c
  53. MsgBox "完成"
  54. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-1-3 18:25 | 显示全部楼层
抹不去の回忆 发表于 2024-1-3 18:14
自己鼓捣出来了··思路跟您差不多··我用的split

也可以实现。
先连接再split一般用在key上,item一般原型装数组里直接用就可以,不需要先连再分动作

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-3 18:30 | 显示全部楼层
修改后的分享出来,有需要拿去用,感谢cidanji原代码提供的思路

工作表数据拆分.rar

34.12 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-3 18:33 | 显示全部楼层
cidanji 发表于 2024-1-3 18:25
也可以实现。
先连接再split一般用在key上,item一般原型装数组里直接用就可以,不需要先连再分动作

我有多组数据需要放进字典的值中,原表是我虚拟的,所有才需要先链接起来再用split拆分出来使用

TA的精华主题

TA的得分主题

发表于 2024-1-4 10:00 | 显示全部楼层
参与一下。
这个做法可以折分成N个表,从1到单个门店的数据的最小值。修改里面的N就可以了。


  1. Sub text()

  2. Dim x&, y&, i&, j&, N&, M&, H&, R&
  3. Dim Arr, Drr, Brr(), Nrr() As Long, Mrr() As Long, d As Object

  4. N = 1  '// N 为须折分的工作表数量,可以修改。最小可为1,最大可以是单个门店的数据的最小值。
  5. Set d = CreateObject("scripting.dictionary")
  6. With Sheets("数据源")
  7.     Arr = .Range("a2:c" & .Cells(Rows.Count, 1).End(xlUp).Row)
  8. End With
  9. ReDim Mrr(1 To UBound(Arr))
  10. ReDim Nrr(1 To UBound(Arr), 1 To N + 1)

  11. For x = 1 To UBound(Arr)
  12.     d(Arr(x, 1)) = 1 + d(Arr(x, 1))
  13.     Mrr(x) = d(Arr(x, 1))
  14. Next x

  15. For x = 1 To UBound(Arr)
  16.     For y = 1 To N
  17.         Nrr(x, y + 1) = Int(d(Arr(x, 1)) / N) * y
  18.     Next y
  19.     Nrr(x, N + 1) = Nrr(x, N + 1) + (d(Arr(x, 1)) Mod N)
  20. Next x

  21. H = Int(UBound(Arr) / N) + d.Count * (N - 1)
  22. For i = 1 To N
  23.     ReDim Brr(1 To H, 1 To 3)
  24.     R = 0
  25.     For x = 1 To UBound(Arr)
  26.         If Mrr(x) > Nrr(x, i) And Mrr(x) <= Nrr(x, i + 1) Then
  27.             R = R + 1
  28.             For y = 1 To 3
  29.                 Brr(R, y) = Arr(x, y)
  30.             Next y
  31.         End If
  32.     Next x
  33.     With Sheets("分表" & i)
  34.         .Range("a2:c59999").ClearContents
  35.         .Range("a2").Resize(H, 3) = Brr
  36.     End With
  37. Next i

  38. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 13:36 , Processed in 0.045477 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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