如何在任何工作表上制作录制的宏?

时间:2018-04-18 21:15:18

标签: excel vba excel-vba

我录制了一个宏来按数字排序我的Excel工作表(这是A列),然后是ID(D列),然后是最新的日期(M列)

我希望能够将这个宏复制到任何工作表(它具有所有相同的列),但它告诉我“下标超出范围”,因为有不同的名称。

这是宏。工作表名称是“owssvr(1)”,但我希望它能够用于任何具有相同列的工作表等:

ActiveWorkbook.Worksheets("owssvr (1)").ListObjects("Table_owssvr__2").Sort. _
    SortFields.Clear
ActiveWorkbook.Worksheets("owssvr (1)").ListObjects("Table_owssvr__2").Sort. _
    SortFields.Add Key:=Range("Table_owssvr__2[Number]"), SortOn:=xlSortOnValues _
    , Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("owssvr (1)").ListObjects("Table_owssvr__2").Sort. _
    SortFields.Add Key:=Range("Table_owssvr__2[ID]"), SortOn:= _
    xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
ActiveWorkbook.Worksheets("owssvr (1)").ListObjects("Table_owssvr__2").Sort. _
    SortFields.Add Key:=Range("Table_owssvr__2[Date]"), SortOn:= _
    xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("owssvr (1)").ListObjects("Table_owssvr__2"). _
    Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

我正在考虑使用带有

的东西

3 个答案:

答案 0 :(得分:0)

按索引编号

引用您的工作表名称
Option Explicit
Public Sub Example()
    ActiveWorkbook.Worksheets(1)
End Sub

Referring to Sheets by Index Number [Excel 2003 VBA Language Reference]

  

索引号是基于其相同类型的纸张中的纸张标签(从左数起)的位置分配给纸张的顺序号。以下过程使用Worksheets属性激活活动工作簿中的工作表一。

答案 1 :(得分:0)

这里有两个的问题:

  1. 工作表名称
  2. 表名
  3. 让我们假设在要使用宏的所有工作表上,表的名称是相同的。首先激活工作表,然后运行:

    Sub Macro1()
    '
    ' Macro1 Macro
    '
    
    Dim ws As Worksheet
    Set ws = ActiveSheet
        ws.ListObjects("Table_owssvr__2").Sort. _
        SortFields.Clear
    ws.ListObjects("Table_owssvr__2").Sort. _
        SortFields.Add Key:=Range("Table_owssvr__2[Number]"), SortOn:=xlSortOnValues _
        , Order:=xlAscending, DataOption:=xlSortNormal
    ws.ListObjects("Table_owssvr__2").Sort. _
        SortFields.Add Key:=Range("Table_owssvr__2[ID]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    ws.ListObjects("Table_owssvr__2").Sort. _
        SortFields.Add Key:=Range("Table_owssvr__2[Date]"), SortOn:= _
        xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ws.ListObjects("Table_owssvr__2"). _
        Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    End Sub
    

答案 2 :(得分:0)

这适用于任何只有一个包含所需列名称的列表对象的工作表:

Sub Tester()
    Dim tName As String

    With ActiveSheet.ListObjects(1).Sort

        tName = .Parent.Name 'list name

        .SortFields.Clear
        .SortFields.Add Key:=Range(tName & "[Number]"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range(tName & "[ID]"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortTextAsNumbers
        .SortFields.Add Key:=Range(tName & "[Date]"), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal

        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

    End With
End Sub