ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 大神帮忙看下代码错误

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-12 14:54 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 sunny568914 于 2024-3-12 14:56 编辑
  1. Sub 提取姓名种类唯一值到订单金额2()
  2.     Dim arr, d As Object, i As Long, brr(), keys()
  3.    
  4.     Sheets("产量表").Activate
  5.     arr = Sheets("产量表").Range("c2:D" & Cells(Rows.Count, 1).End(xlUp).Row)   '将数据放进数组arr
  6.     ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2)) '定义数组brr大小
  7.     Set d = CreateObject("scripting.dictionary")
  8.    
  9.     For i = 1 To UBound(arr)
  10.         s = arr(i, 1) & arr(i, 2) '如果是3列的要求就继续使用 & 链接....
  11.         If Not d.Exists(s) Then '如果字典不存在s这个key
  12.             k = k + 1 '计数
  13.             d(s) = k '不存在s这个key就让它存在
  14.             For j = 1 To UBound(arr, 2) '将数组arr的值通过遍历放到数组brr
  15.                 brr(k, j) = arr(i, j)
  16.             Next
  17.         End If
  18.     Next
  19.    
  20.     ' 将字典的key存入keys数组
  21.     ReDim keys(1 To d.Count)
  22.     i = 1
  23.     For Each Key In d.keys
  24.         keys(i) = Key
  25.         i = i + 1
  26.     Next
  27.    
  28.     ' 对keys数组进行排序
  29.     Call QuickSort(keys, LBound(keys), UBound(keys))
  30.    
  31.     ' 按照排序后的key输出数据到"订单金额"表
  32.     Sheets("订单金额").Range("A3").Resize(d.Count, UBound(brr, 2)) = Empty ' 清空"订单金额"表的内容
  33.     For i = 1 To d.Count
  34.         For j = 1 To UBound(brr, 2)
  35.             Sheets("订单金额").Cells(i + 2, j).Value = brr(d(keys(i)), j)
  36.         Next j
  37.     Next i
  38.    
  39.     Sheets("订单金额").Activate
  40. End Sub

  41. ' 快速排序算法
  42. Sub QuickSort(keys As Variant, L As Long, R As Long)
  43.     Dim i As Long, j As Long
  44.     Dim pivot As Variant, temp As Variant
  45.     Dim production As Variant
  46.    
  47.     ' 保存产量表中A2:A30的内容到production数组
  48.     production = Sheets("总金额").Range("A2:A30").Value
  49.    
  50.     i = L
  51.     j = R
  52.     pivot = production((L + R) \ 2, 1)
  53.    
  54.     Do While i <= j
  55.         Do While Sheets("订单金额").Cells(i, 1).Value < pivot
  56.             i = i + 1
  57.         Loop
  58.         Do While Sheets("订单金额").Cells(j, 1).Value > pivot
  59.             j = j - 1
  60.         Loop
  61.         
  62.         If i <= j Then
  63.             temp = Sheets("订单金额").Cells(i, 1).Value
  64.             Sheets("订单金额").Cells(i, 1).Value = Sheets("订单金额").Cells(j, 1).Value
  65.             Sheets("订单金额").Cells(j, 1).Value = temp
  66.             i = i + 1
  67.             j = j - 1
  68.         End If
  69.     Loop
  70.    
  71.     If L < j Then QuickSort keys, L, j
  72.     If i < R Then QuickSort keys, i, R
  73. End Sub
复制代码
排序代码是AI生成的,但是运行会显示错误,If L < j Then QuickSort keys, L, j 溢出堆债空间

测试.zip

17.61 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2024-3-12 18:32 | 显示全部楼层
Sub QuickSort(keys As Variant, L As Long, R As Long)
    Dim i As Long, j As Long
    Dim pivot As Variant, temp As Variant

    i = L
    j = R
    pivot = keys((L + R) \ 2)

    Do While i <= j
        Do While keys(i) < pivot
            i = i + 1
        Loop
        Do While keys(j) > pivot
            j = j - 1
        Loop
        
        If i <= j Then
            temp = keys(i)
            keys(i) = keys(j)
            keys(j) = temp
            i = i + 1
            j = j - 1
        End If
    Loop

    If L < j Then QuickSort keys, L, j
    If i < R Then QuickSort keys, i, R
End Sub  
第二段换成这样,前面你的那个就是死循环来的

TA的精华主题

TA的得分主题

发表于 2024-3-12 18:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
运行之后就能找你的要求排序并筛选了
图片1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-12 19:39 | 显示全部楼层
风雨声点滴 发表于 2024-3-12 18:32
Sub QuickSort(keys As Variant, L As Long, R As Long)
    Dim i As Long, j As Long
    Dim pivot As ...

排序是根据总金额表中的A2:A30中的数据排序,这个代码的排序不是按总金额表的数据排序

TA的精华主题

TA的得分主题

发表于 2024-3-12 21:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 提取姓名种类唯一值到订单金额2()
    Dim arr, d As Object, i As Long, brr(), s As String, x As Range
    Sheets("产量表").Activate
    'Application.AddCustomList Worksheets("产量表").Range("A2:a" & Rows.Count.End(xlUp).Row) -此句有误
    Application.AddCustomList Worksheets("总金额").Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    h = Application.CustomListCount
    arr = Sheets("产量表").Range("c2:D" & Cells(Rows.Count, 1).End(xlUp).Row)   '将数据放进数组arr
    ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2)) '定义数组brr大小
    Set d = CreateObject("scripting.dictionary")
    For i = 1 To UBound(arr)
        s = arr(i, 1) & arr(i, 2) '如果是3列的要求就继续使用 & 链接....
        If Not d.Exists(s) Then '如果字典不存在s这个key就创建
            d.Add Key:=s, Item:=Empty
            For j = 1 To UBound(arr, 2) '将数组arr的值通过遍历放到数组brr
                brr(d.Count, j) = arr(i, j)
            Next j
        End If
    Next i
    Sheets("订单金额").UsedRange.Offset(1) = Empty ' 清空"订单金额"表除第一行的内容
    Sheets("订单金额").Cells(2, 1).Resize(UBound(brr, 1), UBound(brr, 2)) = brr
    Set x = Sheets("订单金额").Cells(2, 1).Resize(UBound(brr, 1), UBound(brr, 2))
    ' 按照排序后的key输出数据到"订单金额"表
    x.Sort key1:=Range("b2"), order1:=xlAscending, Header:=xlNo, ordercustom:=h + 1
    Sheets("订单金额").Activate
End Sub

可以了

测试.rar

17.3 KB, 下载次数: 3

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-13 09:04 | 显示全部楼层
风雨声点滴 发表于 2024-3-12 21:50
Sub 提取姓名种类唯一值到订单金额2()
    Dim arr, d As Object, i As Long, brr(), s As String, x As R ...

感谢可以用,学习了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-16 11:14 | 显示全部楼层
风雨声点滴 发表于 2024-3-12 21:50
Sub 提取姓名种类唯一值到订单金额2()
    Dim arr, d As Object, i As Long, brr(), s As String, x As R ...

老师,咨询下为什么有的时候会按指定的排序,有的时候未按指定排序

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-16 11:38 | 显示全部楼层
Sub 提取姓名种类唯一值到订单金额2()
    Dim arr, d As Object, i As Long, brr(), s As String, x As Range
    Sheets("产量表").Activate
    'Application.AddCustomList Worksheets("产量表").Range("A2:a" & Rows.Count.End(xlUp).Row) -此句有误
    Application.AddCustomList Worksheets("总金额").Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    h = Application.CustomListCount
    arr = Sheets("产量表").Range("c2:D" & Cells(Rows.Count, 1).End(xlUp).Row)   '将数据放进数组arr
    ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2)) '定义数组brr大小
    Set d = CreateObject("scripting.dictionary")
    For i = 1 To UBound(arr)
        s = arr(i, 1) & arr(i, 2) '如果是3列的要求就继续使用 & 链接....
        If Not d.Exists(s) Then '如果字典不存在s这个key就创建
            d.Add Key:=s, Item:=Empty
            For j = 1 To UBound(arr, 2) '将数组arr的值通过遍历放到数组brr
                brr(d.Count, j) = arr(i, j)
            Next j
        End If
    Next i
    Sheets("订单金额").UsedRange.Offset(1) = Empty ' 清空"订单金额"表除第一行的内容
    Sheets("订单金额").Cells(2, 1).Resize(UBound(brr, 1), UBound(brr, 2)) = brr
    Set x = Sheets("订单金额").Cells(2, 1).Resize(UBound(brr, 1), UBound(brr, 2))
    ' 按照排序后的key输出数据到"订单金额"表
    x.Sort key1:=Range("b2"), order1:=xlAscending, Header:=xlNo, ordercustom:=h + 1
    Application.DeleteCustomList h
    Sheets("订单金额").Activate
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-16 11:43 | 显示全部楼层
Application.DeleteCustomList h  添加了一句 删除自定义排序正常了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 16:20 , Processed in 0.043231 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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