ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-7-29 11:26 | 显示全部楼层
原帖由 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 ...
  1. 在JavaScript中没有二维数组的概念

  2. 在编写WebClinet端脚本时有时需要用到数组进行操作,javascript中声明数组的语法为

  3. Dim 变量 = new Array();

  4. 需要注意的是,在javascript中没有二维数组的概念,只有一维。

  5. 例:

  6. 一维数组生成、赋值、显示方法
  7. function GetArray()
  8. {
  9.     var arr = new Array();
  10.     arr[0] = "0";
  11.     arr[1] = "1";
  12.    
  13.     for(i=0;i<arr.length;i++)
  14.     {
  15.         alert(arr[i]);
  16.     }
  17. }

  18. // 二维数组生成、赋值、显示方法(此方法错误)
  19. function Get2DArray()
  20. {
  21.     alert('此种声明、赋值、显示二维数组方法不合法');
  22.     var arr = new Array();
  23.     //int[][] arr = new Array();这种写法根本不成立,不符合javascript语法,这样写会导致整个页面的javascript脚本都不能执行
  24.     arr[0][0] = 1;
  25.     arr[0][1] = 2;
  26.     arr[1][0] = 3;
  27.     arr[1][1] = 4;
  28.    
  29.     for(i=0; i<arr.length;i++)
  30.     {
  31.         for(j=0; j<arr[i].length;j++)
  32.         {
  33.             alert(arr[i][j]);
  34.         }
  35.     }
  36. }

  37. 这样的写法是声明数组的普遍方法(在其他语言中,尤其是被注释掉的那种写法),但事实证明这样的写法是不合法的,进一步说明javascript中没有对二维数组的定义。

  38. 想起一句老话“只有想不到,没有做不到,凡是都有解决方法”。

  39. 一个变通的方法,给一维数组的每个元素复制,其值也是一个一维数组。

  40. // 二维数组生成、赋值、显示方法(变通方法)
  41. function Get2DArray2()
  42. {
  43.     var arr = new Array();
  44.     arr[0] = new Array();
  45.     arr[1] = new Array();
  46.    
  47.     arr[0][0] = "00";
  48.     arr[0][1]="01";
  49.     arr[1][0]="10";
  50.     arr[1][1]="11";
  51.    
  52.     for(i=0; i<arr.length;i++)
  53.     {
  54.         for(j=0; j<arr[i].length;j++)
  55.         {
  56.             alert(arr[i][j]);
  57.         }
  58.     }
  59. }

复制代码
针对7楼的问题,不知道本楼参考有没有用,摆渡的。

[ 本帖最后由 jackyun 于 2010-7-29 11:27 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-7-29 11:46 | 显示全部楼层
  1. Sub bbb()
  2.     Dim x&, y&, str1$, ar1
  3.    
  4.     ar1 = [a2:d5] ' [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.     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]))});}"
  11.     js.AddCode str1
  12.     brr = Split(js.codeobject.aa(ar1), ",")
  13.     For i = 1 To x + 1
  14.         For j = 1 To y + 1
  15.             ar1(i, j) = brr(j + (i - 1) * (y + 1) - 1)
  16.         Next
  17.     Next
  18.    
  19.     [a10].Resize(x + 1, y + 1).Value = ar1
  20.    
  21. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2010-7-29 12:30 | 显示全部楼层
原帖由 lb_bn 于 2010-7-29 11:46 发表
Sub bbb()
    Dim x&, y&, str1$, ar1
   
    ar1 = [a2:d5] ' [a1].Resize([a65536].End(3).Row, 3).Value
   
    x = UBound(ar1) - 1
    y = UBound(ar1, 2) - 1
    Set js = CreateObject("script ...


呵呵,看样子JavaScript的sort不能直接得到二维数组了...
你的解题想法和我想的一块去了,用循环得到排序后的数组。
  1. Sub bbb()
  2.     Dim x&, y&, str1$, ar1, brr, crr, i%, j%
  3.    
  4.     ar1 = [a2:d5] ' [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.     brr = Split(js.codeobject.aa(ar1), ",")
  16.    
  17.     ReDim crr(1 To UBound(ar1), 1 To UBound(ar1, 2))
  18.    
  19.     For i = 0 To UBound(brr) Step 4
  20.        For j = 1 To 4
  21.         crr(i / 4 + 1, j) = brr(i + j - 1)
  22.        Next
  23.     Next
  24.     [g2].Resize(UBound(crr), UBound(crr, 2)) = crr

  25. End Sub
复制代码
另外再请教一下,如果以第4列为关键字排序,str1 该怎么该,JavaScript的语法有点看不懂,不知道该怎么改。
非常感谢

[ 本帖最后由 jackyun 于 2010-7-29 12:40 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-7-29 12:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 alzeng 于 2010-7-29 11:31 发表

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


RecordSet的容量应该是很大的。

getrows 取值的容量好像有限制,不能太大,网上查到的大致都是这个说法,如下面的
GetRows 方法通常比一次读一笔记录的回圈要来得快些,但使用这方法时,必须确定Recordset未包含太多记录;否则,会很容易以一个非常大的变数阵列来填满所有记忆体。基於相同的原因,得小心不要包括任何BLOB(Binary Large Object)或CLOB(Character Large Object)栏位;若如此做的化,应用程式一定会爆掉,特别是对於较大的Recordset而言。最后,记住此方法传回的变数阵列是以0为基底的;传回记录的笔数是UBound(values,2)+1,传回栏位数是UBound(value, 1)+1。


Application.Transpose的能力有限,但通过其他方法可以避免这个应用上的缺陷

怎么避免呢?用循环?这个一念兄能否指点一下吗? 有什么好方法共享一下,学习学习。

TA的精华主题

TA的得分主题

发表于 2010-7-29 12:44 | 显示全部楼层

回复 13楼 jackyun 的帖子

  1. Sub bbb()
  2.     Dim x&, y&, str1$, ar1
  3.    
  4.     ar1 = [a2:d5] ' [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.     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[3]);return (x[3]==y[3])?(a.localeCompare(y[0])):(b.localeCompare(y[3]))});}"
  11.     js.AddCode str1
  12.     brr = Split(js.codeobject.aa(ar1), ",")
  13.     For i = 1 To x + 1
  14.         For j = 1 To y + 1
  15.             ar1(i, j) = brr(j + (i - 1) * (y + 1) - 1)
  16.         Next
  17.     Next
  18.    
  19.     [a10].Resize(x + 1, y + 1).Value = ar1
  20.    
  21. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2010-7-29 13:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 lb_bn 于 2010-7-29 12:44 发表
Sub bbb()
    Dim x&, y&, str1$, ar1
   
    ar1 = [a2:d5] ' [a1].Resize([a65536].End(3).Row, 3).Value
   
    x = UBound(ar1) - 1
    y = UBound(ar1, 2) - 1
    Set js = CreateObject("script ...


多谢多谢,这下明白了,lb_bn兄牛人啊,呵呵,非常感谢lb_bn兄热心帮助,学习了。

TA的精华主题

TA的得分主题

发表于 2011-1-25 15:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-3-28 10:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
向大师们学习!

TA的精华主题

TA的得分主题

发表于 2017-6-12 11:30 | 显示全部楼层
lb_bn 发表于 2010-5-6 15:37
不可以但可以调用javascript的sort方法

可以告诉我sort方法排序时,参数是怎样工作的吗?

TA的精华主题

TA的得分主题

发表于 2024-9-23 09:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
留言收藏,向大佬学习!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 02:40 , Processed in 0.046190 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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