2013-04-18 347 views
0

在下面的代码中,我在DepName列上对名为DepList的表进行排序。Excel VBA使用表名的定义名称

Sub SortDepNameAZ() 
    On Error Resume Next 
     ActiveWorkbook.Worksheets("Department List").ListObjects("DepList").Sort. _ 
      SortFields.Clear 
     ActiveWorkbook.Worksheets("Department List").ListObjects("DepList").Sort. _ 
      SortFields.Add Key:=Range("DepList[[#All],[DepName]]"), SortOn:= _ 
      xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     With ActiveWorkbook.Worksheets("Department List").ListObjects("DepList").Sort 
      .Header = xlYes 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 
     End With 
    End Sub 

我想使这个更一般的,所以我可以用它作为一个功能,使用已定义的范围和名称,而不是具体的名字。

我曾尝试使用下面的尝试,但我不能让语法工作:

Sub SortDepNamesAZ(lo1 As ListObject, dn1 as Variant) 
On Error Resume Next 
    Set lo1 = Application.ActiveWorkbook.ActiveSheet.ListObject(1) 
    Dim tabstr As String 
    tabstr = Application.ActiveWorkbook.ActiveSheet.ListObject(1).Name 
    lo1.Sort.SortFields.Clear 
    lo1.Sort.SortFields.Add Key:=Range(tabstr[[#All],[dn1]]), SortOn:= _ 
     xlSortOnValues, Order:=xlAscending 'I think this line is probably wrong?? 
    With lo1.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 

赞赏任何帮助,哪怕只有几个指针,因为我知道代码也许可以在许多层面上的改善。

感谢

+0

两件事情...'1'摆脱对错误的继续下一步。做适当的错误处理'''你的范围'范围(tabstr [[#全部],[dn1]])'不完全合格。函数如何知道它引用了哪个表单? |一旦你已经注意到上述情况,再次进行测试,并告诉哪条线路给你错误,它是什么错误? –

+0

为了澄清,你想传递一个表引用/名称和列名称的功能,并让函数按列排序表? –

+0

@DougGlancy是的,虽然这是我第一次写一个函数,所以我不知道如何去做。我已经写了这样,它似乎工作: –

回答

0

功能:

Sub SortTableByHeader(ShtN As String, tabN As String, hed1 As Variant) 
Dim hed2 As Range, hed3 As Integer 

Set hed2 = Range(tabN).Rows(0) 
    hed3 = Application.Match(hed1, hed2, 0) 

Range(tabN).Sort Key1:=Range(tabN).Cells(1, hed3), Header:=xlYes 

End Sub 

调用函数:

Sub SortDepartmentName() 
Dim ShtN As String, objName As String, myColHead As Variant 

ShtN = Sheets("Department List").Name 
objName = Sheets("Department List").ListObjects(1).Name 
myColHead = "DepName" 

SortTableByHeader ShtN, objName, myColHead 

End Sub