打开APP
userphoto
未登录

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

开通VIP
《神奇的VBA》编程:根据次数重复排列数据

------ 需求案例------ 

要求根据公司部门的出现次数,重新排列部门。用Excel VBA编程应该如何写呢? 

本篇,神奇的VBA依旧介绍3种思路:

-----思路1------ 

全部使用For..Next循环语句遍历A列和相应B列的数据, 并在C列中再次使用循环存入数据。 

Sub 重复排序_思路1()Dim n As Integer Dim x As String Dim y As Integer Dim t As Integer
For n = 2 To GetLastRowNumber("A") x = Range("A" & n) '获取要重复的数据 y = Range("B" & n) '获取要重复的数量 r = GetLastRowNumber("C") + 1 '获取C列追加数据的最新行号 '存放结果For t = 1 To y '根据出现次数重复执行        Range("C" & r) = x                       r = r + 1 Sleep (200) NextNextEnd Sub
'通用函数:获取某列数据区域中最后一行的行号Function GetLastRowNumber(col As String) As LongGetLastRowNumber = ActiveSheet.Cells(1048576, col).End(xlUp).RowEnd Function

注:本例中编写了GetLastRowNumber()通用函数用于获取某数据区域列中的最后一个单元格行号。

-----思路1------ 

综合运用For..Next循环语句和字典。

Sub 重复排序_思路2()Dim n As IntegerDim r As IntegerDim t As IntegerDim dic As ObjectSet dic = CreateObject("Scripting.Dictionary")
For n = 2 To GetLastRowNumber("A") dic.Add Range("A" & n).Value, Range("B" & n).ValueNext
For Each k In dic.keys r = GetLastRowNumber("C") + 1 '获取C列追加数据的最新行号 '存放结果For n = 1 To dic(k) '根据y变量值重复运行 Range("C" & r) = k r = r + 1 NextNextEnd Sub
'通用函数:获取某列数据区域中最后一行的行号Function GetLastRowNumber(col As String) As LongGetLastRowNumber = ActiveSheet.Cells(1048576, col).End(xlUp).RowEnd Function

如果您觉得代码中的这段比较啰嗦

For Each k In dic.keys r = GetLastRowNumber("C") + 1 '获取C列追加数据的最新行号 '存放结果For n = 1 To dic(k) '根据y变量值重复运行 Range("C" & r) = k r = r + 1 NextNext

你也可以简写为

For Each k In dic.keys r = GetLastRowNumber("C") + 1 '获取C列追加数据的最新行号 Range("C" & r).Resize(dic(k), 1) = k '存放结果Next

-----思路3------ 

运用数组,将A列数据以B列对应记载的重复数量存放入数组,最终将数组一次性导入C列区域中。

Sub 重复排序_思路3()Dim n As Integer Dim x As Integer Dim p As Integer Dim arr() '创建动态数组
p = 0 '初始化变量pFor n = 2 To GetLastRowNumber("A") '遍历A列数据x = Range("B" & n) '获取B列对应重复数量p = p + x '重新设置P值ReDim Preserve arr(1 To p) '根据P值重新定义动态数组arr的容量For i = p To p - x + 1 Step -1arr(i) = Range("A" & n) '向新添加的容量中载入数据NextNextr = GetLastRowNumber("C") + 1 '获取C列追加数据的最新行号Range("C" & r).Resize(UBound(arr), 1) = Application.Transpose(arr) '存放结果End Sub

思路3中采用动态数组并通过反序遍历的方式向数组写入数据,有点绕脑。阅读理解时需要有点耐心。另外务必不要忘记“Step -1”。

思路3中的方法需要一定的数组知识,并在对动态数组要求一定的了解。务必要搞清楚ReDim和ReDim Preserve关键字的作用。ReDim在重新定义数组容量时会清除数组,而ReDim Preserve将会保留数组的元素。ReDim关键字的作用是重新分配数组空间。默认情况下重新分配空间后数组内容都会清空,但是如果加上Preserve后可以保留原来的数据再进行分配空间,另外需要注意的是Redim只能对数组的最后一维进行扩充。

------   结语   ------
本篇的分享就到这里!如果你阅读了以往的文章,会发现神奇的VBA中经常用到循环遍历,逻辑判断,数组和字典。实际上职场上的数据编程,大多数就是重复运用这些基础的功能。有关Excel VBA编程你可以使用《神奇的VBA》插件学习编程知识。最后如果觉得本篇主题对您的工作有帮助,还请
关注
点赞收藏
转发至朋友圈
点击“在看”
分享给更多的人

 ------   更多文章   ------
《神奇的VBA》编程:禁止修改Excel工作表名称
《神奇的VBA》编程:监控表格单元格值的变化
《神奇的VBA》编程:提取身份证号码中的性别信息
《神奇的VBA》编程:随机生成彩票数据
《神奇的VBA》编程:报表插入空白行
《神奇的VBA》编程:工作表数据的拆分-001
《神奇的VBA》编程:工作表数据的拆分-002
Power Click插件发布-开放下载!
 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Excel 合并单元格的数据表进行排序
VBA系列讲座(4):理解变量
第8章 数组
VB6.0与VB.NET的不同之处(转)
VB 变量的基础知识
【VBA 实例030】彩票幸运号码 (动态数组和随机函数)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服