ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将指定数据区域某列数据前30输入数组后排序输出

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-2 12:14 | 显示全部楼层 |阅读模式
要求:将指定数据区域某列数据前30输入数组后,然后再用提供的自定义数组排序输出,代码如下:
Sub 将前30输入数组后排序输出()
Worksheets("前三十名").Range("A1").CurrentRegion.ClearContents
Dim arr, brr(), crr()
With Worksheets("期中考试")
r = .UsedRange.Rows.Count
c = .UsedRange.Columns.Count
c1 = .Range("a2").End(xlToRight).Column
arr = Array(Application.Transpose(.Range("A2:A" & r)), Application.Transpose(.Range("B2:B" & r)), Application.Transpose(.Range("F2:F" & r)), Application.Transpose(.Range("G2:G" & r)), _
             Application.Transpose(.Range("H2:H" & r)), Application.Transpose(.Range("I2:I" & r)))
arr = Application.Transpose(arr)
For i = 1 To UBound(arr)
    If arr(i, 4) <= 30 Then
        n = n + 1
        ReDim Preserve brr(1 To 6, 1 To n)
        For j = 1 To 6
            brr(j, n) = arr(i, j)
        Next
    End If
    If arr(i, 6) <= 30 Then
        m = m + 1
        ReDim Preserve crr(1 To 6, 1 To m)
        For k = 1 To 6
            crr(k, m) = arr(i, k)
        Next
    End If
Next
brr = Application.Transpose(brr)
crr = Application.Transpose(crr)
End With

brr = Array_Sort(brr, 4, 1) '这里出问题,不知怎样表达?

With Worksheets("前三十名")
     .Range("A1").Resize(n, 6) = brr
    ' .Range("G1").Resize(m, 6) = crr
End With
End Sub


Function Array_Sort(Array_&(), Key1&, Order&)    '(Array_[将要排序的数组], Key1[数组(y,x)中x,像表格中的哪一列作关键字], Order[=1,升序;<>1,降序])
    Dim t, x&, y&, i&, j&, k&, xx&, yy&, tt&, AD&
    For i = 1 To 60
        On Error Resume Next
        Err.Clear
        tt = UBound(Array_, i)
        If Err.Number = 9 Then AD = i - 1: Exit For    'AD,数组维数
    Next
    If AD = 2 Then
        If Not (Key1 >= LBound(Array_, 2) And Key1 <= UBound(Array_, 2)) Then Exit Function
    ElseIf AD = 1 Then
        Array_ = Application.Transpose(Array_)
        Key1 = 1
    Else
        Exit Function
    End If
    y = LBound(Array_, 1): x = LBound(Array_, 2)
    yy = UBound(Array_): xx = UBound(Array_, 2)
    If Order = 1 Then    '升序
        For i = y To yy - 1
            For j = i + 1 To yy
                If Array_(j, Key1) < Array_(i, Key1) Then    '冒泡排序法
                    For k = x To xx
                        t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
                    Next
                End If
            Next
        Next
    Else    '降序
        For i = y To yy - 1
            For j = i + 1 To yy
                If Array_(j, Key1) > Array_(i, Key1) Then
                    For k = x To xx
                        t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
                    Next
                End If
            Next
        Next
    End If
    If AD = 2 Then Array_Sort = Array_ Else Array_Sort = Application.Transpose(Array_)
End Function

在VBA内存数组中排序.rar

67.29 KB, 下载次数: 20

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-2 16:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在求大侠指点,在线等。先谢了

TA的精华主题

TA的得分主题

发表于 2018-12-2 19:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2018-12-2 16:30
在求大侠指点,在线等。先谢了

'冒个泡就可以了,数据量大改归并(你这对稳定性有要求)

Option Explicit

Sub test()
  Dim arr, i, j, pos
  arr = Sheets("期中考试").[a1].CurrentRegion.Offset(1).Value
  pos = Array(1, 2, 6, 7, 8, 9)
  Call bsort(arr, 1, UBound(arr, 1) - 1, 1, 9, 7, True)
  For i = 1 To 30
    For j = 0 To UBound(pos): arr(i, j + 1) = arr(i, pos(j)): Next
  Next
   Sheets("前三十名").[a1].Resize(30, UBound(pos) + 1) = arr
End Sub

Function bsort(arr, first, last, left, right, key, order)
  Dim i, j, k, t
  For i = first To last - 1
    For j = first To last + first - 1 - i
      If arr(j, key) <= arr(j + 1, key) Xor order Then
        For k = left To right
          t = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = t
        Next
      End If
  Next j, i
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-3 15:01 | 显示全部楼层
一把小刀闯天下 发表于 2018-12-2 19:17
'冒个泡就可以了,数据量大改归并(你这对稳定性有要求)

Option Explicit

谢谢你的答复。
谢谢!!
不过,我自己已经解决问题了。只在申明中动了一个小手术,便可以了。
Function Array_Sort(Array_&(), Key1&, Order&)   
……
End Function
把红色“&()”去掉就行了。
我不知道为什么要申明为“&()”这样的?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-3 16:03 | 显示全部楼层
一把小刀闯天下 发表于 2018-12-2 19:17
'冒个泡就可以了,数据量大改归并(你这对稳定性有要求)

Option Explicit

这个解决思路,很简洁,很清晰,很好!!以后若有问题,多向你请教!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 14:09 , Processed in 0.036624 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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