打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA教程:如何将二维表转为一维表?

哈喽,大家好。

我称之为一劳永逸的办法——VBA!

这个问题,也是来自于一位学员的求助:他的数据表如下图所示:

他的需求是将这样的一组数据,转化成下面的格式:

源数据中存在合并单元格,如果使用函数的话,会相当的困难。即便没有合并单元格,使用函数操作二维表转一维表也不容易。

总之就是难难难,难于上青天。

不过,好在我们会VBA啊

打开工作表后,按ALT+F11组合键,打开VBE界面,在工程窗口单击鼠标右键,按下图插入一个模块。

选中模块,在属性窗口(如果你没有属性窗口,可以按F4弹出),在名称处直接改成你要的字即可。

双击刚才添加的模块,使得代码区是模块的代码输入区域。将下面的代码复制到你的代码区:

千万别小瞧下面这串VBA代码,如果请专人来写,那可是要付费的呀!今天就当做福利免费分享给大家吧!

向上滑动阅览

Sub 二转一()

With Sheets("转化前") '''使用工作表《转化前》

arr = .UsedRange '''利用UsedRange属性,将使用的单元格区域放入数组arr中,形成二维数组

End With '''with结束语句

'''在数组中将合并单元格造成的空值填充上值

  For i = 2 To UBound(arr) '''循环变量i,在第2行开始,循环到最后一行数据,循环第一维度

    If arr(i, 1) = "" Then '''判断语句,如果数组第一列的值为空,则

      arr(i, 1) = arr(i - 1, 1) '''此数组元素值等于上一行的数组元素值

    End If '''判断语句结束

  Next i '''循环语句结束

  Set d = CreateObject("scripting.dictionary") '''定义d为字典脚本

  For i = 2 To UBound(arr) '''再次逐行遍历数组arr

    For j = 3 To UBound(arr, 2) - 1 '''循环变量j,从第3列开始,逐列循环数组arr的第二维度,不包含最后一列

      If arr(i, j) > 0 Then '''如果行列交叉点上的数组元素值大于0,则说明此值我们应该罗列

        s = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(1, j) '''将型号、颜色、规格,合并为一个字符串s,用|间隔

        d(s) = arr(i, j) '''将s字符串装入字典d的key中,并且赋值对应item值为对应的数值

      End If '''判断语句结束

    Next j '''j循环语句结束

  Next i '''i循环语句结束

  With Sheets("转化后") '''使用工作表《转化后》

    .UsedRange.ClearContents '''使用ClearContents方法,将被使用单元格区域清空

    .[A1] = "型号" '''A1单元格赋值字符串“型号”

    .[B1] = "颜色" '''同上,赋值B1单元格

    .[C1] = "规格" '''同上,赋值C1单元格

    .[D1] = "数值" '''同上,赋值D1单元格

    k = 1 '''设置一个变量k,初始值为1

    For Each dic In d.keys '''在字典d中循环每一个字典元素dic

      k = k + 1 '''计数器,每循环一次,累加1。作为单元格行号使用

'''Split函数:按指定字符,拆分字符串,成为一个一维数组,数组编号从0开始

      .Cells(k, 1) = Split(dic, "|")(0) '''对应行号k的A列单元格,赋值拆分后的一个值

      .Cells(k, 2) = Split(dic, "|")(1) '''同上理,赋值第二个值

      .Cells(k, 3) = Split(dic, "|")(2) '''同上理,赋值第三个值

      .Cells(k, 4) = d.Item(dic) '''对应的item值,赋值给D列单元格

    Next '''结束for each循环

  End With '''with结束语句

  Erase arr '''释放arr数组

  Set d = Nothing '''释放字典d

End Sub '''工程结束

点击运行按钮,就可以完成操作。
如果你想学习代码原理,代码里给大家也附上了注释,这将是一个很好的过程。
最后需要注意1点:工作表需另存为.XLSM格式,否则代码会保存不上哟。
好啦,以上就是今天的所有内容,感谢你的观看,觉得基础还不好的同学,欢迎学习下面这套工作用得上的Excel训练营!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
完全手册Excel VBA典型实例大全:通过368个例子掌握
Excel VBA 单元格区域转置
“VBA”学习笔记
数组应用:如何优雅的调换两列内容
Excel VBA 9.1 什么是数组?数组的维度又是什么?
VBA编程时常用的提速方法 >> VBA基础 >> Excel吧
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服