ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA中字典数据的排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-13 11:53 | 显示全部楼层 |阅读模式
附件是有用到VBA字典的计算数据,把结果写到对应的单元格上。
但结果出来之后,没有排序,想增加一个排序的功能,按升序排。
请大神们指点。
出货检查表_20140313111125.rar (145.32 KB, 下载次数: 159)

TA的精华主题

TA的得分主题

发表于 2014-3-13 12:03 | 显示全部楼层
数据生成后,对这些数据按照要求排序,不用字典排序吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-13 13:16 | 显示全部楼层
不可以数据出来之后再排序。
因为会有多条数据。如果这时候一排序,位置就不对了。。。
QQ图片20140313131557.jpg

TA的精华主题

TA的得分主题

发表于 2014-3-13 14:21 | 显示全部楼层
可以在一个临时表中排序,再将排序结果读入数据源中

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-13 14:37 | 显示全部楼层
doitbest 发表于 2014-3-13 14:21
可以在一个临时表中排序,再将排序结果读入数据源中

不解。。。该如何操作?

TA的精华主题

TA的得分主题

发表于 2014-3-13 14:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
排序不难,给你一个例子
  1. Sub t()
  2. Set ojs = CreateObject("scriptcontrol"): ojs.Language = "jscript"
  3. arr1 = ojs.eval("[1,5,3,2,1].sort()")
  4. Stop
  5. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-3-13 15:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用原程序修改
Private Sub workbook_open()
'计算每天一天的最大,最小的LOTNO
Dim arr, brr, crr, d, d2, i&, j&

crr = [m2:p100]   '指定范围
ReDim arr(1 To UBound(crr), 1 To 1)
For i = 1 To UBound(crr)
    If crr(i, 4) = 1 Then   '当P列为1时,继续计算,否则退出
    Set d = CreateObject("scripting.dictionary")    ' 创建字典,用于日期变量的值
Set d2 = CreateObject("scripting.dictionary")       ' 创建字典,用于流水号变量的值
    s = s + 1: arr(s, 1) = crr(i, 1)

'For h = 1 To s
    x = Split(crr(i, 1), ";")                'F列为1时,对D列的值以";"为界进行分割
    For j = 1 To UBound(x)                  'j设为1开始,去掉第一个;的值,如果LOTNO串联中,第一个没有";",j应改为0开始
        m = Left(x(j), 6): n = Val(Right(x(j), 5))              '分别取出日期及流水号
        If Not d.exists(m) Then                           '写日期变量写入字典
            d(m) = n
        Else
            If n < d(m) Then d(m) = n
        End If
        If Not d2.exists(m) Then
            d2(m) = n                               '写流水号变量写入字典
        Else
            If n > d2(m) Then d2(m) = n
        End If
    Next

ReDim brr(1 To d.Count, 1 To 2)
a = d.keys: b = d.items
For k = 0 To d.Count - 1
    brr(k + 1, 1) = a(k) & Format(b(k), "00000")
    brr(k + 1, 2) = a(k) & Format(d2(a(k)), "00000")
Next
[it1].Resize(d.Count, 1) = Application.Transpose(a)
[iu1].Resize(UBound(brr), 2) = brr
[iu:iv].Replace "0", "", 1
[it:iv].Sort Key1:=[it1], Order1:=xlAscending, Header:=xlNo
[it1].Resize(d.Count, 1).Copy Cells(i + 1, 2)
[iu1].Resize(UBound(brr), 2).Copy Cells(i + 1, "j")
[it:iv] = ""
End If                   '如果F列不等于1,退出进行下一循环
Set d = Nothing         '清空字典
Set d2 = Nothing
Next                '进行下一循环
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-14 13:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-18 17:23 | 显示全部楼层
目前最小LOGNO,最大LOTNO是取当P列为1时,对应的M列的值中,按日期分类,第一天的最小,最大的值。
需要修正为:在前面的基础上,同一天里面连续的值。当其不连续时,需另起一行。
            J7  ,K7为原程序运行之后的值。J17-K18为希望达到的值。
            即在同一天里面,需要区分连续的最小,最大值。如果中间的断号,需再起一行。
出货检查表_2014031816442.rar (195.87 KB, 下载次数: 89)

TA的精华主题

TA的得分主题

发表于 2016-11-10 10:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 09:33 , Processed in 0.044528 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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