ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] excel 列转行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-27 19:20 | 显示全部楼层 |阅读模式
在列中有物料的变换的方式,希望转变成行,看看有多少成套的方式
捕获.PNG

新建 Microsoft Excel 工作表.zip

7.86 KB, 下载次数: 26

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-27 19:21 | 显示全部楼层
请各位老师帮忙看看怎么做,谢谢!

TA的精华主题

TA的得分主题

发表于 2020-2-27 19:37 | 显示全部楼层
好像是递归吧,数据不复杂到是数组循环一下就行,层级和数据多了还是得用合理的算法求解

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-27 19:48 | 显示全部楼层
micch 发表于 2020-2-27 19:37
好像是递归吧,数据不复杂到是数组循环一下就行,层级和数据多了还是得用合理的算法求解

看来要学习一下递归算法了,现在刚开始学习正则表达式,接下来有新的目标了

TA的精华主题

TA的得分主题

发表于 2020-2-27 20:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 micch 于 2020-2-27 20:57 编辑
pattonzhai 发表于 2020-2-27 19:48
看来要学习一下递归算法了,现在刚开始学习正则表达式,接下来有新的目标了

如果你好好模拟一份数据,老师们给你写个代码对你学习会很有帮助,就这个简单的数据,数组循环就可以了

  1. Sub test()
  2.     arr = [b3].CurrentRegion.Offset(1)
  3.     ReDim brr(1 To UBound(arr))
  4.     Set d = CreateObject("scripting.dictionary")
  5.     For i = 1 To UBound(arr) - 1
  6.             x = arr(i, 1)
  7.             n = 0
  8.             k = 0
  9.             Do
  10.                 If Left(arr(i + n, 1), 1) = "H" Then
  11.                         m = m + 1
  12.                         k = k + 1
  13.                         brr(m) = x & k & d(arr(i + n, 2)) & " " & arr(i + n, 1)
  14.                 Else
  15.                         d(arr(i + n, 1)) = d(arr(i + n, 2)) & " " & arr(i + n, 1)
  16.                 End If
  17.                         n = n + 1
  18.                         If arr(i + n, 2) = "物料" Or i + n >= UBound(arr) Then Exit Do
  19.             Loop
  20.             i = i + n - 1
  21.     Next
  22.     For i = 1 To m
  23.             Cells(i + 9, 6).Resize(, UBound(Split(brr(i))) + 1) = Split(brr(i))
  24.     Next
  25. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-27 21:12 | 显示全部楼层
'F列路线没看懂,另外第7行示例可能有问题,C2并不是区间顶级物料,,,

Option Explicit

Sub test()
  Dim arr, i, j, k, p, s, cnt, m, n
  arr = Range("b5:c" & [b5].End(xlDown).Row + 1)
  ReDim brr(1 To 10 ^ 4) As String, crr(1 To UBound(arr, 1), 20) As String
  For i = 1 To UBound(arr, 1) - 1
    If arr(i + 1, 2) = "物料" Or i = UBound(arr, 1) - 1 Then
      For j = p + 1 To i
        For k = p + 1 To i
          If arr(j, 2) = arr(k, 1) Then Exit For
        Next
        If k = i + 1 Then
          s = arr(j, 1): m = m + 1
          n = n + 1: crr(m, 0) = arr(j, 2): crr(m, 1) = s
          Do
            For k = p + 1 To i
              If s = arr(k, 2) Then
                cnt = cnt + 1: brr(cnt) = arr(k, 1)
                n = n + 1: crr(m, n) = arr(k, 1)
              End If
            Next
            If cnt = 0 Then n = 0: Exit Do
            s = brr(cnt): cnt = cnt - 1
          Loop
        End If
      Next
      i = i + 1: p = i
    End If
  Next
  If m > 0 Then [g4].Resize(UBound(crr, 1), UBound(crr, 2) + 1) = crr
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-27 21:16 | 显示全部楼层
层级深度最多支持20级,自己可以修改

如果区间数据量很大可以加2个字典提高效率,,,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-27 22:05 | 显示全部楼层
一把小刀闯天下 发表于 2020-2-27 21:16
层级深度最多支持20级,自己可以修改

如果区间数据量很大可以加2个字典提高效率,,,

谢谢,我好好学习研究一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-27 22:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-27 22:53 | 显示全部楼层
Power Query解法,仅供参考...
  1. let
  2.     源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],

  3.     rcur = List.Combine(
  4.             Table.Group( 源,
  5.                         "原料",
  6.                         {"a",each let ar=Table.ToRows(Table.SelectRows(_,(x)=>x[原料]=_{[原料="物料"]}[状态])),

  7.                                       fx=(list)=>if _{[原料=List.Last(list{0})]}?=null then list else
  8.                                                  @fx(List.TransformMany(list,
  9.                                                                      (v)=>{_{[原料=List.Last(v)]}[状态]},
  10.                                                                      (x,y)=>x&{y})),

  11.                                       rl=List.Accumulate( ar,
  12.                                                           {{},1},
  13.                                                           (s,c)=>{s{0}&fx({{c{1}&Text.From(-s{1}),c{1},c{0}}}),s{1}+1} )

  14.                                    in rl{0} },

  15.                         0,(x,y)=>Byte.From(y="物料"))[a]
  16.                         ),


  17.     rslt = Table.FromList( rcur,
  18.                            each _,
  19.                           {"路线"} &
  20.                           List.Transform({1..List.Max(List.Transform(rcur,List.Count))-1},each "步骤"&Text.From(_)) )
  21. in
  22.     rslt
复制代码
2020-02-27_225230.jpg

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 14:28 , Processed in 0.042265 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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