ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA 中可以使用Array.Sort()方法吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-6 15:21 | 显示全部楼层 |阅读模式
VBA 中可以使用Array.Sort()方法吗?

TA的精华主题

TA的得分主题

发表于 2010-5-6 15:37 | 显示全部楼层
不可以但可以调用javascript的sort方法
  1. Sub bbb()
  2.     Dim ar1()
  3.    
  4.     With Sheets("sheet1")
  5.         ar1 = .[a1].Resize(.[a65536].End(3).Row).Value
  6.     End With
  7.    
  8.     Set js = CreateObject("scriptcontrol")
  9.     js.Language = "javascript"
  10.     js.addcode "function aa(bb){aa=bb.toArray();return aa.sort();}"
  11.     MsgBox js.codeobject.aa(ar1)

  12. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-6 16:59 | 显示全部楼层

回复 2楼 lb_bn 的帖子

你好,我的目的就是从一个路径下面找到所有的xls 文件的名字,并且这些名字的顺序,要和windows 里面放置的顺序一致。这样要去怎样实现呢?

TA的精华主题

TA的得分主题

发表于 2010-7-29 11:31 | 显示全部楼层
原帖由 jackyun 于 2010-7-29 11:13 发表


Recordset还可以这样用,第一次见到,很新颖,学习了。

GetRows 方法通常比一次读一笔记录的回圈要来得快些,方法好是好, 但使用这方法时,必须确定Recordset未包含太多记录,这个总有点不爽,老是心惊胆战的 ...

RecordSet的容量有多大,不用多言;问题是Application.Transpose的能力有限,但通过其他方法可以避免这个应用上的缺陷。

TA的精华主题

TA的得分主题

发表于 2010-7-28 17:26 | 显示全部楼层
原帖由 lb_bn 于 2010-5-6 15:37 发表
不可以但可以调用javascript的sort方法Sub bbb()
    Dim ar1()
   
    With Sheets("sheet1")
        ar1 = .[a1].Resize(.[a65536].End(3).Row).Value
    End With
   
    Set js = CreateObject("sc ...


请问javascript 支持不支持二维的排序。
如:
ar1 = .[a1].Resize(.[a65536].End(3).Row, 2).Value

可不可以进行以第二列为关键字的排序呢?

非常感谢

TA的精华主题

TA的得分主题

发表于 2010-7-28 21:11 | 显示全部楼层

回复 4楼 jackyun 的帖子

可以的。。。。
楼主可以上传些数据供测试一下。

TA的精华主题

TA的得分主题

发表于 2010-7-29 01:05 | 显示全部楼层
睡不着,写个代码
  1. Sub bbb()
  2.     Dim x&, y&, str1$, ar1()
  3.    
  4.     ar1 = [a1].Resize([a65536].End(3).Row, 3).Value
  5.    
  6.     x = UBound(ar1) - 1
  7.     y = UBound(ar1, 2) - 1
  8.     Set js = CreateObject("scriptcontrol")
  9.     js.Language = "javascript"
  10.     '按数字排序
  11.     'str1 = "function aa(bb){var cc=new Array();aa=bb.toArray();for(i=0;i<=" & x & ";i++){cc[i]=new Array();for(j=0;j<=" & y & ";j++){cc[i][j]=aa[" & x + 1 & "*j+i];}}return cc.sort(function(x, y){return (x[1]==y[1])?(x[0]-y[0]):(x[1]-y[1])});}"
  12.     '按字符排序
  13.     str1 = "function aa(bb){var cc=new Array();aa=bb.toArray();for(i=0;i<=" & x & ";i++){cc[i]=new Array();for(j=0;j<=" & y & ";j++){cc[i][j]=aa[" & x + 1 & "*j+i];}}return cc.sort(function(x, y){a=new String(x[0]);b=new String(x[1]);return (x[1]==y[1])?(a.localeCompare(y[0])):(b.localeCompare(y[1]))});}"
  14.     js.AddCode str1
  15.     MsgBox js.codeobject.aa(ar1)

  16. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2010-7-29 10:17 | 显示全部楼层
原帖由 lb_bn 于 2010-7-29 01:05 发表
睡不着,写个代码Sub bbb()
    Dim x&, y&, str1$, ar1()
   
    ar1 = [a1].Resize([a65536].End(3).Row, 3).Value
   
    x = UBound(ar1) - 1
    y = UBound(ar1, 2) - 1
    Set js = CreateObj ...


非常厉害啊,非常佩服,运行代码确实得到以数组第二列为关键字的排序。

不过得出的结果只能是字符串吗,不能得到排序后的数组吗?

详见附件

Javascript Test.rar

155.62 KB, 下载次数: 111

TA的精华主题

TA的得分主题

发表于 2010-7-29 10:32 | 显示全部楼层
针对7楼的附件:

  1. Sub ArrSort()
  2.     Dim Arr, k%, icl%
  3.     Dim Rs As Object

  4.     Arr = [A1].CurrentRegion
  5.     Set Rs = CreateObject("Adodb.Recordset")
  6.     For icl = 1 To UBound(Arr, 2)
  7.         Rs.Fields.append Arr(1, icl), 200, 32
  8.     Next
  9.     Rs.Open
  10.     For k = 1 To UBound(Arr)
  11.         Rs.addnew
  12.         For icl = 1 To UBound(Arr, 2)
  13.             Rs.Fields(Arr(1, icl)) = Arr(k, icl)
  14.         Next
  15.     Next
  16.     Rs.Sort = "年龄 Desc"
  17.     Arr = Application.Transpose(Rs.getrows)
  18.     Rs.Close: Set Rs = Nothing
  19. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2010-7-29 11:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 alzeng 于 2010-7-29 10:32 发表
针对7楼的附件:
Sub ArrSort()
    Dim Arr, k%, icl%
    Dim Rs As Object

    Arr = [A1].CurrentRegion
    Set Rs = CreateObject("Adodb.Recordset")
    For icl = 1 To UBound(Arr, 2)
        Rs ...


Recordset还可以这样用,第一次见到,很新颖,学习了。

GetRows 方法通常比一次读一笔记录的回圈要来得快些,方法好是好, 但使用这方法时,必须确定Recordset未包含太多记录,这个总有点不爽,老是心惊胆战的,不知它什么时候会爆掉...

现在主要是想研究JavaScript的sort功能,看能不能通过JavaScript来实现内存排序。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 06:29 , Processed in 0.041225 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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