ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[分享] VBA中使用工作表排序的方法

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-8-14 07:16 | 显示全部楼层
不错,学习了,谢谢!!

TA的精华主题

TA的得分主题

发表于 2017-8-14 08:45 | 显示全部楼层
香川群子 发表于 2014-3-21 14:47
如果排序key参数不止3个,那么在VBA中也可以如下处理:呵呵。

女神,关于使用ARRAY作为参数时,如果里面有很多列怎么办?比如我要删除前126列的重复值时,代码如下
  1. Sub test()
  2.     ActiveSheet.Range("$A$1:$dv$" & Cells(Rows.Count, 1).End(3).Row).RemoveDuplicates _
  3.                    Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, _
  4.                    17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, _
  5.                    35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, _
  6.                    53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, _
  7.                    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, _
  8.                    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, _
  9.                    106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, _
  10.                    121, 122, 123, 124, 125, 126), _
  11.                    Header:=xlNo
  12. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-14 10:57 | 显示全部楼层
autumnalRain 发表于 2017-8-14 08:45
女神,关于使用ARRAY作为参数时,如果里面有很多列怎么办?比如我要删除前126列的重复值时,代码如下

那你需要解决的问题在哪里?如果你的代码可行,你还想要什么结果?

TA的精华主题

TA的得分主题

发表于 2017-8-14 11:05 | 显示全部楼层
香川群子 发表于 2017-8-14 10:57
那你需要解决的问题在哪里?如果你的代码可行,你还想要什么结果?

列数太多时,都需要这样列出来确实不方便。因为我碰到的有更多列要求求不重复的值。比如Columns:=Array(1, 2, 3, ……126) 红色部分可否用什么短代码代替呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-14 13:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
autumnalRain 发表于 2017-8-14 11:05
列数太多时,都需要这样列出来确实不方便。因为我碰到的有更多列要求求不重复的值。比如Columns:=Array(1 ...

Array参数不能使用变量。

找个变通的办法吧。
根据A1所在区域的大小,自动编写对应的宏代码,然后执行。

  1. Sub test()
  2.     Dim ar, j&, m&, n&, s$, tmpMacro$, tmpModule
  3.    
  4. '    m = Cells(Rows.Count, 1).End(3).Row
  5. '    n = Cells(1, Columns.Count).End(1).Column
  6.    
  7.     ar = Range("A1").CurrentRegion '确定区域大小 这里是A1所在单元格区域
  8.     m = UBound(ar): n = UBound(ar, 2) '得到最大行和最大列
  9.    
  10.     tmpMacro = "myRemoveDuplicatesMacro" '随便定一个宏名称
  11.     s = s & "Sub " & tmpMacro & "()" & Chr(10) '宏起始行
  12.    
  13.     s = s & "ActiveSheet.Range(""" & Range("A1").CurrentRegion.Address & """).RemoveDuplicates Columns:=Array(1 _" & Chr(10)
  14.     For j = 2 To n
  15.         s = s & ", " & j
  16.         If j Mod 20 = 0 Then s = s & " _" & Chr(10)
  17.     Next
  18.     s = s & "), Header:=xlNo" & Chr(10)
  19.     s = s & "Msgbox ""OK""" & Chr(10)
  20.     s = s & "End Sub" '宏结束行

  21.     Msgbox s '确认代码

  22.     Set tmpModule = ThisWorkbook.VBProject.VBComponents.Add(1)
  23.         tmpModule.CodeModule.AddFromString s '在本文件中添加新的模块 并写入宏代码
  24.         Application.Run "" & tmpMacro '执行此宏代码
  25.         ThisWorkbook.VBProject.VBComponents.Remove tmpModule '删除此临时模块
  26. End Sub
复制代码


这样生成的模块代码例子如下:
  1. Sub myRemoveDuplicatesMacro()
  2. ActiveSheet.Range("$A$1:$IW$40").RemoveDuplicates Columns:=Array(1 _
  3. , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 _
  4. , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 _
  5. , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 _
  6. , 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 _
  7. , 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 _
  8. , 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120 _
  9. , 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140 _
  10. , 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160 _
  11. , 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 _
  12. , 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200 _
  13. , 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220 _
  14. , 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240 _
  15. , 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257), Header:=xlNo
  16. MsgBox "OK"
  17. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-8-16 07:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-11-24 22:27 | 显示全部楼层
香川群子 发表于 2017-8-14 13:16
Array参数不能使用变量。

找个变通的办法吧。

香川老师,能给我写一个多列排序(C-I)列排序的程序吗?多谢!

大乐透排序.rar

1.11 MB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2017-11-30 09:28 | 显示全部楼层
香川群子 发表于 2014-3-21 14:47
如果排序key参数不止3个,那么在VBA中也可以如下处理:呵呵。


好贴,学习了。谢谢!

TA的精华主题

TA的得分主题

发表于 2017-12-7 22:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-1-29 16:03 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-8 14:58 , Processed in 0.025540 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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