点击“预约”按钮,Excel曲播课免费进修
哈喽,各人好。
今天来给各人分享一个 高手版的二维表转一维表身手。
我称之为一劳永逸的办法——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("ing.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操练营!