首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel:对多个列进行单独排序

Excel:对多个列进行单独排序
EN

Stack Overflow用户
提问于 2021-04-18 12:03:10
回答 1查看 51关注 0票数 1

我有一张excel表,看起来像这样

  • 所有的数据都是数值数据。实际工作表实际上有更多的行和列。

https://i.imgur.com/E2HEdXF.png

我想从这些数据中得到的东西是这样的--对于每一年,我都想根据今年的数值数据对A&F进行排序。所以不是一种,而是每年一种。

我不认为有一种简单的方法可以做到这一点,所以我想到了两种可能的方法

  1. I将数据导出到某个数据库中&然后使用SQL查询获得我想要的输出--我假设一定有一些数据库允许您导入

数据。

  1. 编写一个VBA程序,该程序根据E列将列D&E复制到另一个位置和排序,然后将列D&F复制到另一个位置&基于列F等。

我从来没有做过VBA,但我是程序员,所以我认为这样做不会有什么麻烦。

然而,我想知道是否还有其他更简单的方法来做这件事,如果没有,这两种方法中哪一种会更好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 13:54:26

复制和排序

下面的

  • 将将数据从列D:G复制为列对,列对由第一列和下一列组成,然后将数据复制到包含此代码的新创建的工作表的A:B列中,并最终按列B对其进行后代排序。要创建的现有工作表以前将是常量部分中的值deleted.
  • Adjust。

代码语言:javascript
复制
Option Explicit

Sub copyAndSort()
    
    Const sName As String = "Sheet1"
    Const sFirst As String = "D1"
    Const yCols As String = "E:G"
    
    Const dFirst As String = "A1"
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim sws As Worksheet: Set sws = wb.Worksheets(sName)
    
    Dim srg As Range
    Dim yrg As Range
    Dim rCount As Long
    Dim cCount As Long
    
    With sws.Range(sFirst)
        Dim rOff As Long: rOff = .Row - 1
        Dim sCell As Range
        Set sCell = .Resize(.Worksheet.Rows.Count - rOff) _
            .Find("*", , xlFormulas, , , xlPrevious)
        If sCell Is Nothing Then Exit Sub
        rCount = sCell.Row - rOff
        Set srg = .Resize(rCount)
        Set yrg = .Worksheet.Columns(yCols).Rows(.Row).Resize(rCount)
        cCount = yrg.Columns.Count
    End With
    
    Dim sData As Variant: sData = srg.Value
    ReDim Preserve sData(1 To rCount, 1 To 2)
    Dim yData As Variant: yData = yrg.Value
    
    Dim Result As Variant: ReDim Result(1 To cCount)
    
    Dim c As Long, r As Long
    
    For c = 1 To cCount
        Result(c) = sData
        For r = 1 To rCount
            Result(c)(r, 2) = yData(r, c)
        Next r
    Next c
    Erase yData
    Erase sData
    
    Dim dws As Worksheet
    Dim drg As Range
    Dim dName As String
    
    Application.ScreenUpdating = False
    
    For c = 1 To cCount
        dName = Result(c)(1, 2)
        On Error Resume Next
        Set dws = Nothing
        Set dws = wb.Worksheets(dName)
        On Error GoTo 0
        If Not dws Is Nothing Then
            Application.DisplayAlerts = False
            dws.Delete
            Application.DisplayAlerts = True
        End If
        Set dws = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
        dws.Name = dName
        Set drg = dws.Range(dFirst).Resize(rCount, 2)
        drg.Value = Result(c)
        drg.Sort Key1:=drg.Cells(2), Order1:=xlDescending, Header:=xlYes
    Next c

    wb.Save
        
    Application.ScreenUpdating = True
        
End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67148296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档