ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 3671|回复: 11

[分享] 另类排序去重复(简单易用)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-30 11:20 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:脚本语言应用
本帖最后由 HHAAMM 于 2014-3-31 17:30 编辑

前言:Windows系统里提供了一个叫ScriptControl的OCX组件,我们可以用这个组件来实现脚本故事世界的精彩。
显示声明该组件:vbe中引用 Microsoft Script Control 1.0
Dim oMsp As MSScriptControl.ScriptControl    ''''声明对象变量
Set oMsp = New MSScriptControl.ScriptControl    ''''实例化对象
对象中本帖用到的属性、方法
AddCode 方法 往脚本引擎中加入要执行的脚本
Eval 方法 表达式求值
CodeObject 属性 脚本暴露给宿主调用的对象。只读。(对象类型 )

Language
属性 设置或获取脚本引擎解释的语言,例如:VBScript、JavaScript。

JavaScript
JavaScript 是属于网络的脚本语言!
JavaScript 是因特网上最流行的脚本语言。
明确一个概念,JavaScript不是java,也可以说两者基本没什么关系
JavaScript语言中有数组对象的概念,这个数组对象提供了很多方便我们处理数据的方法
本帖正是因为这些方法的方便性而发的,目的是提供另一种解决问题的思路,仅供参考

本帖用到的方法

splice(start,n,item1,item2..) 从start开始删去n位,并在该位置插入后面的元素。后面的元素可选,返回值为被删掉的n位
sort() 进行升序排序。这个排序是基于Unicode的。sort(sortfunction) 使用数字排序的时候需要填入参数


另外:
JavaScript中toArray函数方法返回一个由 VBArray 转换而来的标准 JScript 数组。
本帖示例中用该方法的目的是将vba语音建立的数组转换成JavaScript的数组对象,这样才可以使用对象的方法
必须注意的是经toArray转换后的数组都是一维的,就是说一个二维数组经
toArray转换后返回的是个一维数组


其实vba中使用js还有很多意想不到之处,本人水平有限只能介绍这么多,不对的地方望大家斧正!!

  1. Sub 另类排序去重复()
  2.     Dim ojs As Object, m$
  3.     Set ojs = CreateObject("msscriptcontrol.scriptcontrol")
  4.     ojs.Language = "javascript"
  5.    ojs.AddCode "function y(z){x=z.split(',');x.sort(function(a,b){return a-b});for(i = 0; i<x.length;i++){if(x[i]==x[i+1]){x.splice(i, 1);i=i-1;}};return x;}"
  6.    
  7.     ''''生产测试用字符串
  8.     For i = 0 To 100
  9.         m = m & "," & Int(Rnd * 1000)
  10.     Next
  11.     MsgBox ojs.eval("y('" & Mid(m, 2) & "')")
  12. End Sub
复制代码
前三句可以拿来就用,其实很方便

4楼:对单元格区域的数据排序
另类排序去重复.rar (10.92 KB, 下载次数: 152)

评分

参与人数 1鲜花 +2 收起 理由
念一环 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-30 11:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-3-30 15:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-30 17:05 | 显示全部楼层
  1. Sub 对单元格区域排序()
  2.     Set ojs = CreateObject("msscriptcontrol.scriptcontrol")
  3.     ojs.Language = "javascript"
  4.     ojs.AddCode "function sortarr(arr){a=arr.toArray();a.sort(function(a,b){return a-b});return a;}"
  5.    
  6.     aa = Range("a1:b2").Value
  7.     MsgBox ojs.codeobject.sortarr(aa)
  8. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-30 17:11 | 显示全部楼层
本帖最后由 HHAAMM 于 2014-3-31 09:54 编辑

单元格区域排序_去重复
  1. Sub 对单元格区域排序_去重复()
  2.     Set ojs = CreateObject("msscriptcontrol.scriptcontrol")
  3.     ojs.Language = "javascript"
  4.    ojs.AddCode "function sortarr(arr){x=arr.toArray();x.sort(function(a,b){return a-b});for(i = x.length; i>0;i--){if(x[i]==x[i-1]){x.splice(i, 1);}};return x;}"
  5.    
  6.     aa = Range("a1:b2").Value
  7.     MsgBox ojs.codeobject.sortarr(aa)
  8. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-30 17:20 | 显示全部楼层
对某单元格区域 去重复排序
正常的做法是 字典+冒泡 有些麻烦

这个办法很简单

1、4、5楼的代码前三句不用动,可拿来就用

TA的精华主题

TA的得分主题

发表于 2014-3-30 19:46 | 显示全部楼层
HHAAMM 发表于 2014-3-30 17:20
对某单元格区域 去重复排序
正常的做法是 字典+冒泡 有些麻烦

您好,能做个案例出来研究下吗,谢谢

TA的精华主题

TA的得分主题

发表于 2014-3-30 21:27 | 显示全部楼层
只是比较遗憾,toArray 方法转换后的是一维数组。如果能将VBA的二维数组转换为JS的二维数组就好了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-31 17:35 | 显示全部楼层
一楼添加了测试附件有兴趣者可测试下字典+排序的常规方法与该方法的运行时间
test.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-31 17:37 | 显示全部楼层
bluexuemei 发表于 2014-3-30 21:27
只是比较遗憾,toArray 方法转换后的是一维数组。如果能将VBA的二维数组转换为JS的二维数组就好了。

可以的,分次获取,看一楼附件
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

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

GMT+8, 2019-8-20 04:18 , Processed in 0.123886 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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