ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码对合并单元格区域进行排序(数据位置重排)?

如何利用vba代码对合并单元格区域进行排序(数据位置重排)?

作者:绿色风 分类: 时间:2022-08-17 浏览:89
楼主
kevinchengcw
Q: 如何利用vba代码对合并单元格区域进行排序(数据位置重排)?
A:代码如下:
  1. Sub test()
  2. Dim Dic As Object, Ws As Worksheet, N%, Rng As Range
  3. Application.ScreenUpdating = False '因为涉及到很多单元格操作,所以关闭屏幕刷新以提高处理速度
  4. Set Dic = CreateObject("scripting.dictionary") '创建字典对象,用于处理中数据的存储及提取
  5. [b2].Select '选定起始单元格
  6. Do While ActiveCell <> "" '当单元格内容不为空时循环(即未超出数据区范围,本例适用)
  7.     With Selection
  8.         For N = .Row To .Row + .Rows.Count - 1 '循环单元格区域的起始行到终止行(如果为合并单元格的话,该范围为多行,非合并单元格为一行)
  9.             If Cells(N, .Column + 1) = "易贴" Then Dic.Add ActiveCell.Value, ActiveCell.Offset(, 3).Value '根据楼主要求,判断含有"易贴"的数据,并提取对应的公司名(活动单元格内容)及价税合计数存入字典中
  10.         Next N
  11.         .Offset(1).Select '利用偏移指令移到下一个单元格并选定(如此可选定一个完整的合并单元格区域)
  12.     End With
  13. Loop
  14. If Dic.Count > 0 Then '完成数据区数据采集后,判断字典中是否有数据,如果执行下面操作
  15.     Set Ws = Worksheets.Add '添加一个工作表
  16.     N = Dic.Count '把字典的项目数指定给变量N
  17.     With Ws '在新添加的表中
  18.         .[a1].Resize(N, 1) = Application.Transpose(Dic.items) 'A列存放字典的item项(即价税合计数值)
  19.         .[b1].Resize(N, 1) = Application.Transpose(Dic.keys) 'B列存放字典的key项(即公司名)
  20.         .[a1].Resize(N, 2).Sort key1:=.[a1], Order1:=xlDescending '依据A列数据(价税合计数值)对数据区进行降序排列
  21.         For Each Rng In .[b1].Resize(N, 1) '循环B列数据区
  22.             Dic(Rng.Value) = Rng.Row '将对应字典项中公司名的item项替换成单元格的行数值(即排序序号)
  23.         Next Rng
  24.         Application.DisplayAlerts = False '禁止警告信息显示
  25.         .Delete  '删除新添加的表
  26.         Application.DisplayAlerts = False '启用警告信息显示
  27.     End With
  28.     N = N + 1 '将字典项数值加1(目的:可能存在没有使用易贴的公司,我们将按照出现顺序为其排序,但就排在已排序的公司后面,所以从字典项数加1开始)
  29.     [b2].Select  '再次选择起始单元格
  30.     Do While ActiveCell <> "" '循环写入对应序号
  31.         If Dic.exists(ActiveCell.Value) Then
  32.             ActiveCell.Offset(, -1) = Dic(ActiveCell.Value)
  33.         Else
  34.             ActiveCell.Offset(, -1) = N  '如果当前公司未出现在字典中(即未使用易贴的公司),则其序号为N的值
  35.             N = N + 1 'N的值加1
  36.         End If
  37.         ActiveCell.Offset(1).Select '再下移一个单元格并选中
  38.     Loop
  39.     Dic.RemoveAll '清空字典项目,以方便后期用于存储单元格区域范围
  40.     [a2].Select  '再次选择起始单元格
  41.     Do While ActiveCell <> "" '循环将以序号为key,以单元格对就区域范围为item,存入字典
  42.         Dic.Add CStr(ActiveCell.Value), ActiveCell.Resize(Selection.Rows.Count, 5).Address
  43.         ActiveCell.Offset(1).Select
  44.     Loop
  45.     [h2].Select  '选择一个临时区域的起始地址,用于重级数据
  46.     For N = 1 To Dic.Count '利用序号循环,提取出对应的数据区数据
  47.         Range(Dic(CStr(N))).Copy ActiveCell '将对应的数据区复制到临时区域(注意:是以序号顺序)
  48.         ActiveCell.Offset(1).Select '粘贴后单元格下移,即新数据区下方第一个未使用单元格位置
  49.     Next N
  50.     [a2].Resize(Cells(Rows.Count, 5).End(3).Row - 1, 7).Delete 1 '删除旧数据区域,并全临时数据区位于旧数据区原位置
  51. End If
  52. Set Dic = Nothing '清空字典
  53. Application.ScreenUpdating = True '打开屏幕刷新
  54. MsgBox "排序完成!" '显示提示信息
  55. End Sub
以上除代码操作外,其余全部利用工作表即有功能实现。
2楼
xyf2210
谢谢分享

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap