Excel公式/VBA对表格进行排序

问题描述 投票:0回答:2

如何对表格进行排序?我有一个数据集(A - G 列),我想对其进行排序以仅按上述顺序显示 A、C、E、B 列。是否有 Excel 公式/VBA 公式可供我研究以实现自动化?

excel vba excel-formula
2个回答
1
投票

选择列

Excel 公式

Microsoft 365 2022

=CHOOSECOLS(A1:G11,1,3,5,2)

或者使用带有行分隔符的数组

=CHOOSECOLS(A1:G11,{1;3;5;2})

或使用具有正确列分隔符的数组 或前两者的组合。

Microsoft 365 2021

=LET(d,A1:G11,c,{1,3,5,2},
    r,SEQUENCE(ROWS(d)),
INDEX(d,r,c))
  • 根据您的小数点分隔符,数组列分隔符(数组中的逗号

    {1,3,5,2}
    )可能会有所不同。
    到目前为止,我遇到过
    {1.3.5.2}
    {1\3\5\2}
    {1@3@5@2}

  • 要使其在任何区域设置下工作,您可以使用

    TRANSPOSE
    (还没有
    TOROW
    )和行分隔符:

=LET(d,A1:G11,rc,{1;3;5;2},
    r,SEQUENCE(ROWS(d)),c,TRANSPOSE(rc),
INDEX(d,r,c))

旧版本

=INDEX(A1:G11,ROW(A1:G11)-ROW(A1)+1,{1,3,5,2}) 

如果您的数据从第 1 行开始,您可以使用以下方法进行简化:

=INDEX(A1:G11,ROW(A1:G11),{1,3,5,2})
  • 2021
    中相同,您可以使用
    TRANSPOSE({1;3;5;2})
    使两者适用于任何区域设置。

VBA

复制包括公式和格式

Sub CopyColumns()

    Dim Cols(): Cols = Array(1, 3, 5, 2)

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    
    Dim srg As Range: Set srg = ws.Range("A1").CurrentRegion
    
    Dim dfCell As Range: Set dfCell = ws.Range("I1")
    
    Dim Col
    
    For Each Col In Cols
        Debug.Print "Copying """ & srg.Columns(Col).Address(0, 0) _
            & """ to """ & dfCell.Address(0, 0) & """..."
        srg.Columns(Col).Copy dfCell
        Set dfCell = dfCell.Offset(, 1)
    Next Col
 
    MsgBox "Columns copied.", vbInformation

End Sub

仅复制值(使用函数)

功能

Function ChooseColumns( _
    ByVal SourceRange As Range, _
    ByVal ChosenColumns As Variant) _
As Variant
    
    Dim rCount As Long: rCount = SourceRange.Rows.Count
    Dim scCount As Long: scCount = SourceRange.Columns.Count
    
    Dim sData()
    
    If rCount * scCount = 1 Then
        ReDim sData(1 To 1, 1 To 1): sData(1, 1) = SourceRange.Value
    Else
        sData = SourceRange.Value
    End If
        
    Dim dcCount As Long:
    dcCount = UBound(ChosenColumns) - LBound(ChosenColumns) + 1
    
    Dim dData(): ReDim dData(1 To rCount, 1 To dcCount)
        
    Dim sCol, r As Long, dc As Long
    
    For Each sCol In ChosenColumns
        dc = dc + 1
        For r = 1 To rCount
            dData(r, dc) = sData(r, sCol)
        Next r
    Next sCol

    ChooseColumns = dData

End Function

Sub(使用功能)

Sub CopyColumnsUsingFunction()

    Dim Cols(): Cols = Array(1, 3, 5, 2)

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
    
    Dim srg As Range: Set srg = ws.Range("A1").CurrentRegion
    
    Dim Data(): Data = ChooseColumns(srg, Cols)
    
    Dim dfCell As Range: Set dfCell = ws.Range("I1")
    
    dfCell.Resize(UBound(Data, 1), UBound(Data, 2)).Value = Data
    
    MsgBox "Columns copied.", vbInformation

End Sub

列表分隔符

Sub ShowMySeparators()
    With Application
        Debug.Print "Alternate: " & .International(xlAlternateArraySeparator)
        Debug.Print "Column: " & .International(xlColumnSeparator)
        Debug.Print "Decimal: " & .International(xlDecimalSeparator)
        Debug.Print "List: " & .International(xlListSeparator)
        Debug.Print "Row: " & .International(xlRowSeparator)
        Debug.Print "Thousands: " & .International(xlThousandsSeparator)
    End With
End Sub

我的系统上的结果

Alternate: @
Column: ,
Decimal: .
List: ;
Row: ;
Thousands: ,

0
投票

Excelde satırseç satıra sütunseç sütuna formüllerinin eski versiyonlara göre kullanmak için makro kodlarını yapabilirmisiniz iyi akşamlar [电子邮件受保护]gönderebilirmisiniz

© www.soinside.com 2019 - 2024. All rights reserved.