2015-05-26 4 views
0

Попытка создать цикл, который проходит через несколько рабочих листов, выбирает таблицу и сортирует ее на основе нескольких критериев. На каждом листе только одна таблица, и это то, к чему я пришел.Цитирование через несколько рабочих листов и таблиц для сортировки нескольких критериев

Sub sorter() 
' 
' sorter Macro 
' 
' Keyboard Shortcut: Ctrl+Shift+F 
' 

Dim varTblSortName As Variant 
varTblSortName = ActiveSheet.Name 
Dim Client As Worksheet 
Dim rng As Range 



For Each Client In ActiveWorkbook.Worksheets 
'This tests to make sure the code is only run on Client_ sheets 
    If InStr(1, Client.Name, "Client_", vbTextCompare) Then 
    Set rng = ActiveSheet.ListObjects(1) 


    Worksheets(Client.Name).Activate 
     'ActiveSheet.ListObjects(1).Range.Select 

      'Range(, Selection.End(xlDown)).Select 
      'Range(Selection, Selection.End(xlToRight)).Select 
      'ActiveWorkbook.Worksheets("Client_Jamie").ListObjects("Client_Jamie").Sort. _ 

       ActiveSheet.ListObjects(1).Sort.SortFields.Clear 
      ActiveWorkbook.ActiveSheet.ListObjects(1).Sort. _ 
       SortFields.Add Key:=Range("varTblSortName[Asset Class]"), SortOn:= _ 
       xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
      ActiveWorkbook.ActiveSheet.ListObjects(1).Sort. _ 
       SortFields.Add Key:=Range("varTblSortName[Sector]"), SortOn:=xlSortOnValues, _ 
       Order:=xlAscending, DataOption:=xlSortNormal 
      ActiveWorkbook.ActiveSheet.ListObjects("varTblSortName").Sort. _ 
       SortFields.Add Key:=Range("varTblSortName[Ticker]"), SortOn:=xlSortOnValues, _ 
       Order:=xlAscending, DataOption:=xlSortNormal 
      With ActiveWorkbook.ActiveSheet.ListObjects("varTblSortName").Sort 
       .Header = xlYes 
       .MatchCase = False 
       .Orientation = xlTopToBottom 
       .SortMethod = xlPinYin 
       .Apply 
      End With 
      End If 
     Next Client 
End Sub 
+0

Есть ли что-нибудь, что не работает должным образом? Если нет, тогда я рекомендую CodeReview. – user3819867

+0

Я хотел упомянуть об этом в сообщении, но я думаю, что проблема, с которой я столкнулась, - это не признание varTblSortName как диапазона в части Range. Каждая таблица имеет то же имя, что и активный лист. На листе, озаглавленном «Страны», есть таблица внутри нее «Страны». – chs

ответ

0

Я расширил использование With/End With и сломал ваши строковые переменные из строк с кавычками.

Sub sorter() 
' Keyboard Shortcut: Ctrl+Shift+F 
    Dim varTblSortName As Variant 
    Dim Client As Worksheet 

    For Each Client In ActiveWorkbook.Worksheets 
     With Client 
      If CBool(InStr(1, .Name, "Client_", vbTextCompare)) Then 
       varTblSortName = .Name 
       With .ListObjects(varTblSortName) 
        .Sort.SortFields.Clear 
        .Sort.SortFields.Add Key:=Range(varTblSortName & "[Asset Class]"), SortOn:= _ 
         xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
        .Sort.SortFields.Add Key:=Range(varTblSortName & "[Sector]"), SortOn:=xlSortOnValues, _ 
         Order:=xlAscending, DataOption:=xlSortNormal 
        .Sort.SortFields.Add Key:=Range(varTblSortName & "[Ticker]"), SortOn:=xlSortOnValues, _ 
         Order:=xlAscending, DataOption:=xlSortNormal 
        With .Sort 
         .Header = xlYes 
         .MatchCase = False 
         .Orientation = xlTopToBottom 
         .SortMethod = xlPinYin 
         .Apply 
        End With 
       End With 
      End If 
     End With 
    Next Client 
End Sub 
+0

спасибо, что работает отлично! все еще изучая vba, так какова цель линии Cbool/вы можете это объяснить? – chs

+0

Это вообще не нужно, так как * False * считается * 0 * и ничего, что не является * False * is * True *. Использование 'CBool' - это действительно мой стиль кодирования и говорит мне, что' InStr' оценивается как логическое. – Jeeped

Смежные вопросы