2015-10-12 4 views
1

Я хочу сделать сортировку и суммирование очень легко для пользователя, создав макрос. Макрос должен найти окончательную строку, затем отсортировать, затем промежуточные и итоговые. Он также должен использовать текущий активный лист. Например, я должен включить первую таблицу во второй:Сортировка и суммирование таблиц разных размеров

Pre and Post Spreadsheet

Я могу это сделать для этого набора данных с простой записью макроса.

Sub Macro1() 
' 
' Macro1 Macro 
' 
' Keyboard Shortcut: Ctrl+Shift+B 
' 
    ActiveWorkbook.Worksheets("Oct 2015").Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Oct 2015").Sort.SortFields.Add Key:=Range("A2:A24" _ 
     ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("Oct 2015").Sort.SortFields.Add Key:=Range("B2:B24" _ 
     ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("Oct 2015").Sort 
     .SetRange Range("A1:C24") 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(3), _ 
     Replace:=True, PageBreaks:=False, SummaryBelowData:=True 
    Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(3), _ 
     Replace:=False, PageBreaks:=False, SummaryBelowData:=True 
    Range("A1:C45").Select 
End Sub 

У меня есть следующий фрагмент кода, чтобы найти последнюю строку, но не знаете, как интегрировать его в выше, чтобы заменить жесткий закодированное значение «Диапазон».

Sub GetLastRow(strSheet, strColum) 
Dim MyRange As Range 
Dim lngLastRow As Long 

    Set MyRange = Worksheets(strSheet).Range(strColum & "1") 

    lngLastRow = Cells(sheetvar.Rows.Count, MyRange.Column).End(xlUp).Row 
End Sub 

Я также необходимо изменить значение активного рабочего листа для текущего открытого листа, так как это значение будет меняться.

Имена столбцов и порядок столбцов должны быть согласованными. Мне также нужно будет поместить этот скрипт на компьютер удаленного пользователя и убедиться, что он был доступен, когда они открывали Excel.

Я также хотел бы, если это возможно, затенять промежуточные области, но это вторичный запрос.

ответ

-1

Вы были на полпути. Сначала вы объявляете свои переменные для текущего листа, вашего диапазона и последней строки и столбца. И затем вы реализуете все их в макрос, который вы только что записали.

Sub Macro1() 
    ' 
    ' Macro1 Macro 
    ' 
    ' Keyboard Shortcut: Ctrl+Shift+B 


    Dim sht As Worksheet 
     Dim lRow As Long, lCol As Long 
     Dim rng As Range 
Set sht = ActiveWorkbook.ActiveSheet 
    With sht 

      lRow = .Range("A" & .Rows.Count).End(xlUp).Row 
      lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 
     Set rng = .Range(.Cells(lRow, 1), .Cells(lRow, lCol)) 
    End With 

     sht.Sort.SortFields.Clear 
     sht.Sort.SortFields.Add Key:=rng, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     sht.Sort.SortFields.Add Key:=rng, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     With sht.Sort 
      .SetRange rng 
      .Header = xlYes 
      .MatchCase = False 
      .Orientation = xlTopToBottom 
      .SortMethod = xlPinYin 
      .Apply 
     End With 
     Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(3), _ 
      Replace:=True, PageBreaks:=False, SummaryBelowData:=True 
     Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(3), _ 
      Replace:=False, PageBreaks:=False, SummaryBelowData:=True 

    End Sub 
+1

Отличная работа с этим, ОП задал вопрос о том, что это будет для активного листа, а не только для одного листа, чтобы он мог использовать его больше, чем тот. Возможно, вместо этого измените ссылку sht на activesheet. –

+1

Спасибо, Скотт, отредактировал мой ответ. – Balinti

+0

Спасибо. Когда он был выполнен, я получил «Ошибка времени выполнения 1004»: ссылка недействительна ... – jabs

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