ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 不同条目的一维转二维

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-18 10:46 | 显示全部楼层
参与一下。。。。。。

  1. Sub test()
  2.     Dim Arr, Brr(), Trr, x&, y&, i&, j&, N&, m&, H&, k, d As Object
  3.     Arr = Range("a1").CurrentRegion
  4.     ReDim Brr(1 To UBound(Arr), 1 To 9)
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     For x = 2 To UBound(Arr)
  7.         k = Arr(x, 1) & Arr(x, 2) & Arr(x, 3) & Arr(x, 4) & Arr(x, 5)
  8.         d(k) = d(k) & x & ","
  9.     Next
  10.     For Each k In d.keys
  11.         Trr = Split(d(k), ",")
  12.         j = N: i = N
  13.         For x = 0 To UBound(Trr) - 1
  14.             H = Val(Trr(x))
  15.             If Arr(H, 8) Like "仓库1" Then
  16.                 i = i + 1
  17.                 For y = 1 To 7
  18.                     Brr(i, y) = Arr(H, y)
  19.                 Next y
  20.             Else
  21.                 j = j + 1
  22.                 For y = 1 To 7
  23.                     If y > 5 Then m = y + 2 Else m = y
  24.                     Brr(j, m) = Arr(H, y)
  25.                 Next y
  26.             End If
  27.         Next
  28.         If i > j Then N = N + i Else N = N + j
  29.     Next
  30.     Range("j3").Resize(N, 9) = Brr
  31. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-18 12:25 | 显示全部楼层
参与一下。。。

777.zip

16.31 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2024-6-18 12:25 | 显示全部楼层
参与一下。。。

  1. Sub ykcbf()  '//2024.6.18
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     With Sheets("一维转二维")
  6.         r = .Cells(Rows.Count, 1).End(3).Row
  7.         arr = .[a1].Resize(r, 8)
  8.     End With
  9.     ReDim brr(1 To r, 1 To 100)
  10.     For i = 2 To UBound(arr)
  11.         s = arr(i, 1)
  12.         If Not d.exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  13.         d(s)(i) = i
  14.     Next
  15.     For Each k In d.keys
  16.         m = t: n = t
  17.         For Each kk In d(k).keys
  18.             If arr(kk, 8) = "仓库1" Then
  19.                 m = m + 1
  20.                 For j = 1 To 5
  21.                     brr(m, j) = arr(kk, j)
  22.                 Next
  23.                 brr(m, 6) = arr(kk, 6)
  24.                 brr(m, 7) = arr(kk, 7)
  25.             End If
  26.             If arr(kk, 8) = "仓库2" Then
  27.                 n = n + 1
  28.                 For j = 1 To 5
  29.                     brr(n, j) = arr(kk, j)
  30.                 Next
  31.                 brr(n, 8) = arr(kk, 6)
  32.                 brr(n, 9) = arr(kk, 7)
  33.             End If
  34.         Next
  35.         If m > n Then t = t + m Else t = t + n
  36.     Next
  37.     With Sheets("结果")
  38.         .[a1].Resize(2, 9).Interior.Color = 49407
  39.         With .[a3].Resize(t, 9)
  40.             .Value = brr
  41.             .Borders.LineStyle = 1
  42.             .HorizontalAlignment = xlCenter
  43.             .VerticalAlignment = xlCenter
  44.         End With
  45.         r = Cells(Rows.Count, 1).End(3).Row
  46.         .UsedRange.Offset(r).Clear
  47.     End With
  48.     Application.ScreenUpdating = True
  49.     MsgBox "OK!"
  50. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-18 13:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-18 16:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-18 16:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wang-way 发表于 2024-6-18 13:38
如果仓库数量不止2个呢?

那就再改了。暂时没想到更好的办法。

TA的精华主题

TA的得分主题

发表于 2024-6-19 09:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 sdytsxd991122 于 2024-6-19 09:44 编辑

image.png

TA的精华主题

TA的得分主题

发表于 2024-6-22 09:49 | 显示全部楼层
再写一个,可以自动适配不同个数的仓库

  1. Sub test()
  2.    
  3.     Dim Arr, Brr(), Trr, Drr, Nrr() As Long
  4.     Dim x&, y&, i&, j&, N&
  5.     Dim k, d As Object
  6.    
  7.     With ThisWorkbook
  8.         With .Sheets(1)
  9.             x = .Cells(Rows.Count, 1).End(xlUp).Row
  10.             Arr = .Range("a1").Resize(x, 8)
  11.         End With
  12.         Set d = CreateObject("Scripting.Dictionary")
  13.         For i = 2 To UBound(Arr)
  14.             d(Arr(i, 8)) = ""
  15.         Next i
  16.         Drr = d.keys
  17.         Set d = Nothing
  18.         ReDim Brr(0 To UBound(Arr) + 1, 1 To UBound(Drr) * 2 + 7)
  19.         ReDim Nrr(0 To UBound(Drr))
  20.    
  21.         Set d = CreateObject("Scripting.Dictionary")
  22.         For x = 2 To UBound(Arr)
  23.             k = Arr(x, 1) & Arr(x, 2) & Arr(x, 3) & Arr(x, 4) & Arr(x, 5)
  24.             d(k) = d(k) & x & ","
  25.         Next
  26.    
  27.         For x = 1 To 5
  28.             Brr(1, x) = Arr(1, x)
  29.         Next
  30.         For x = 0 To UBound(Drr)
  31.             Brr(0, x * 2 + 6) = Drr(x)
  32.             Brr(1, x * 2 + 6) = "单价"
  33.             Brr(1, x * 2 + 7) = "数量"
  34.         Next
  35.    
  36.         N = 1
  37.         For Each k In d.keys
  38.             Trr = Split(d(k), ",")
  39.             For x = 0 To UBound(Nrr)
  40.                 Nrr(x) = N
  41.             Next x
  42.             For x = 0 To UBound(Trr) - 1
  43.                 i = Val(Trr(x))
  44.                 For y = 0 To UBound(Drr)
  45.                     If Arr(i, 8) Like Drr(y) Then
  46.                         Nrr(y) = Nrr(y) + 1
  47.                         If Nrr(y) > N Then N = Nrr(y)
  48.                         For j = 1 To 5
  49.                             Brr(Nrr(y), j) = Arr(i, j)
  50.                         Next j
  51.                         Brr(Nrr(y), y * 2 + 6) = Arr(i, 6)
  52.                         Brr(Nrr(y), y * 2 + 7) = Arr(i, 7)
  53.                         Exit For
  54.                     End If
  55.                 Next y
  56.             Next x
  57.             Erase Trr
  58.         Next k
  59.    
  60.         With .Sheets(2)
  61.             .Cells.Clear
  62.             With .Range("a1").Resize(N + 1, UBound(Brr, 2))
  63.                 .Value = Brr
  64.                 .Borders.LineStyle = 1
  65.                 .HorizontalAlignment = xlCenter
  66.                 .VerticalAlignment = xlCenter
  67.                 .Font.Size = 12
  68.             End With
  69.             For x = 0 To UBound(Drr)
  70.                 .Cells(1, x * 2 + 6).Resize(1, 2).Merge
  71.             Next x
  72.         End With
  73.         
  74.     End With
  75.     Set d = Nothing
  76.     Erase Arr
  77.     Erase Brr
  78.     Erase Drr
  79.     Erase Nrr
  80.    
  81. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-24 15:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-27 17:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-28 05:49 , Processed in 0.035403 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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