我有一个无效且冗长的代码需要优化或修剪

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

这显然是代码的一部分,但这部分我不断收到很多不同的错误,作为初学者,我真的不明白如何解决它们。

我在我的工作簿和工作表中,所以这些是我想在此处排除的第一个参数,但我发现我自己生成的错误而不是更短的代码,所以我寻求一些帮助/指南。

Sub SortHeaderSVA()

    Worksheets("PR11_P3").ListObjects("PR11_P3_Tabell").ListColumns("SVA").Range.Cells(1).Select
        'cant do anything of the soriting or so if I dont do above which is, well has to be a simpler way to select a header in a table that is in the current sheet and active workbook..?

    ActiveWorkbook.Worksheets("PR11_P3").ListObjects("PR11_P3_Tabell").Sort. _
        SortFields.Clear
        'also wierd, why dose the sort needs to be cleard first if there is no value earlier?

    ActiveWorkbook.Worksheets("PR11_P3").ListObjects("PR11_P3_Tabell").Sort. _
        SortFields.Add Key:=Range("PR11_P3_Tabell[[#All],[SVA]]"), SortOn:= _
        xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

     With ActiveWorkbook.Worksheets("PR11_P3").ListObjects("PR11_P3_Tabell").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
End Sub

有很多不同的选择方式,但我可能不知道仅在 VBA 中输入的正确命令,所以我记录宏并做不同的实验。

excel vba sorting excel-tables listobject
2个回答
1
投票

除非绝对必要,否则不要选择对象。删除这一行:

工作表(“PR11_P3”).ListObjects(“PR11_P3_Tabell”).ListColumns(“SVA”).Range.Cells(1).Select

SortFields.Clear
用于确保清除之前的设置。毕竟我们正在向集合添加排序。您可以通过注释掉
SortFields.Clear
行并运行几次来测试这一点。接下来从功能区打开“数据”选项卡并选择“排序”。您将看到,每当您调用
.Sort
方法时,都会运行多种排序。

Sort Dialog

Public Sub SortHeaderSVA()

    With PR11_P3_Tabell.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=PR11_P3_Tabell.ListColumns("SVA").Range, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Public Function wsPR11_P3() As Worksheet
    Set wsPR11_P3 = ThisWorkbook.Worksheets("PR11_P3")
End Function

Public Property Get PR11_P3_Tabell() As ListObject
    Set PR11_P3_Tabell = wsPR11_P3.ListObjects("PR11_P3_Tabell")
End Property

附录

我的原始代码将 ListObject 声明为模块的属性。该代码是根据我拥有的代码片段自动生成的。我通常将我的帖子的方法签名从属性更改为函数。像这样:

Public Function  PR11_P3_Tabell() As ListObject
    Set PR11_P3_Tabell = wsPR11_P3.ListObjects("PR11_P3_Tabell")
End Function 

1
投票

对 Excel 表格进行排序

Option Explicit

Sub SortHeaderSVA()
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("PR11_P3")
    Dim tbl As ListObject: Set tbl = ws.ListObjects("PR11_P3_Tabell")
    Dim tlc As ListColumn: Set tlc = tbl.ListColumns("SVA")
    
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add _
            Key:=tlc.Range, _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending, _
            DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
End Sub

Sub SortHeaderSVANoVariables()
    
    With ThisWorkbook.Worksheets("PR11_P3").ListObjects("PR11_P3_Tabell").Sort
        .SortFields.Clear
        .SortFields.Add _
            Key:=.Parent.ListColumns("SVA").Range, _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending, _
            DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.