ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用宏给不同行表格降序排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-10-11 15:51 | 显示全部楼层 |阅读模式
麻烦专家一个问题,想给rank表格中名为需排序表中B-F列根据学科(语文、数学等)以平均分为主要关键字进行降序排序,但由于各学科的行数不一样,仅录制宏来排序无法完全解决问题(有些科目是两行,有的是三行,还有的是四行),能否麻烦专家指点一下,如何用宏来给各学科排序,以简化工作。多谢指点。排序完成表中是排好序的表格。


rank.rar (22.42 KB, 下载次数: 22)




TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-11 21:25 来自手机 | 显示全部楼层
本帖最后由 tfei 于 2018-10-11 21:38 编辑

最理想的是运行宏,就出现一个信息框询问要排序的区域,用鼠标选定区域并确定后,就能把该区域降序排好序。还望高手相助,多谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-12 09:07 | 显示全部楼层
以下是给汉字加空格的宏,希望专家能给帮助,多谢。
Sub Add_space_to_string()
Dim rngTemp As Range, k As Range
Set rngTemp = Application.InputBox("Please choose the area:", "Choose cells", Type:=8)
Application.ScreenUpdating = False
For Each k In rngTemp
    k = Delete_st(k.Value)
    If Len(k) = 2 Then 'two spaces added to the names with two characters
        k = Left(k, 1) & "  " & Right(k, 1)
    End If
Next k
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2018-10-12 10:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Option Explicit

Sub test()
  Dim arr, i, j, k, a, b
  With Sheets("需排序表")
    arr = .Range("a2:f" & .Cells(Rows.Count, "f").End(xlUp).Row + 1)
    arr(UBound(arr, 1), 1) = "?": arr(UBound(arr, 1), 2) = "辅导员"
    For i = 2 To UBound(arr, 1) - 1
      For j = i To UBound(arr, 1) - 1
        If arr(j + 1, 2) = "辅导员" Then
          For k = j To i Step -1
            If Len(arr(k, 2)) Then Exit For
          Next
          For a = i To k
            For b = a To k
              If Len(arr(b + 1, 1)) > 0 Or Len(arr(b + 1, 2)) = 0 Then
                If b > a Then Call dsort(arr, a, b, 2, UBound(arr, 2), 6)
                a = b: Exit For
              End If
          Next b, a
          i = j + 1: Exit For
        End If
    Next j, i
  End With
  Sheets("排序完成表").[a2].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr
End Sub

Function dsort(arr, first, last, left, right, key)
  Dim i, j, k, t, a, b
  For i = first To last - 1
    For j = i + 1 To last
      a = arr(i, key): b = arr(j, key)
      If Not IsNumeric(a) Then
        For k = 1 To Len(a)
          If IsNumeric(Mid(a, k, 1)) Then
            a = Mid(a, k): b = Mid(b, k): Exit For
          End If
        Next
      End If
      If Val(a) > Val(b) Then
        For k = left To right
          t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
        Next
      End If
  Next j, i
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-12 10:40 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 tfei 于 2018-10-12 11:04 编辑

谢谢专家,代码里有数组,我在电脑上试运行这段代码,也许是我用的电脑太老了,32位win7,office2010,运行后,没有看到希望出现的结果,看来我没有说清楚,只是对需要排序表的数据排序就行了。谢谢专家的热心指点。

TA的精华主题

TA的得分主题

发表于 2018-10-12 11:40 | 显示全部楼层
tfei 发表于 2018-10-12 10:40
谢谢专家,代码里有数组,我在电脑上试运行这段代码,也许是我用的电脑太老了,32位win7,office2010,运行 ...

Sheets("排序完成表").[a2].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr 改成:
------------
Sheets("需排序表").[a2].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-12 12:18 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 tfei 于 2018-10-12 12:43 编辑

好的,我再试试,多谢大师指点。再请问一下,如何将求助帖标为已解决,谢谢。

TA的精华主题

TA的得分主题

发表于 2018-10-12 12:49 | 显示全部楼层
tfei 发表于 2018-10-12 12:18
好的,我再试试,多谢大师指点。再请问一下,如何将求助帖标为已解决,谢谢。

不会,帮顶

满意来朵小花,你这题目还是要花点时间的,,,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-12 16:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢专家的指点,我以为是先出现一个input box让我选哪些列需要排序,用鼠标选中这些列后,点确定就能排好序,最后一个问题如果是在平均排名后加了一列的话,如何修改代码?我试着修改
arr = .Range("a2:g" & .Cells(Rows.Count, "g").End(xlUp).Row + 1)
If b > a Then Call dsort(arr, a, b, 2, UBound(arr, 2), 7)
但不成功,不好意思,再麻烦专家一下。

TA的精华主题

TA的得分主题

发表于 2018-10-13 15:55 | 显示全部楼层
tfei 发表于 2018-10-12 16:59
谢谢专家的指点,我以为是先出现一个input box让我选哪些列需要排序,用鼠标选中这些列后,点确定就能排好 ...

'修改了一下,按平均分e列排序,第5列(这列位置不能改变)

'如有问题再上附件

Option Explicit

Sub test()
  Dim arr, i, j, k, a, b
  With Sheets("需排序表")
    arr = .Range("a2:g" & .Cells(Rows.Count, "e").End(xlUp).Row + 1) '到g列,就是增加了1列
    arr(UBound(arr, 1), 1) = "?": arr(UBound(arr, 1), 2) = "辅导员"
    For i = 2 To UBound(arr, 1) - 1
      For j = i To UBound(arr, 1) - 1
        If arr(j + 1, 2) = "辅导员" Then
          For k = j To i Step -1
            If Len(arr(k, 2)) Then Exit For
          Next
          For a = i To k
            For b = a To k
              If Len(arr(b + 1, 1)) > 0 Or Len(arr(b + 1, 2)) = 0 Then
                If b > a Then Call dsort(arr, a, b, 2, UBound(arr, 2), 5)
                a = b: Exit For
              End If
          Next b, a
          i = j + 1: Exit For
        End If
    Next j, i
    .[a2].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr
  End With
End Sub

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

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-17 00:11 , Processed in 0.028286 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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