2017-02-07 3 views
0

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

Я записал следующий простой макрос для сортировки и промежуточных данных, однако вы заметите, что он работает только для ячеек, которые были выбраны, когда я записал макрос. Кто-нибудь знает, как изменить макрос, чтобы пользователь мог сначала вручную выбрать диапазон ячеек с помощью мыши, а затем нажать кнопку, которая автоматически сортирует предварительно выбранные данные и промежуточные итоги? любая помощь очень ценится, спасибо.

Sub Sort_and_Subtotal_CheckBox() 

    ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort.SortFields.Add Key:=Range(_ 
     "B151:B159"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
     xlSortNormal 
    With ActiveWorkbook.Worksheets("dummy").AutoFilter.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
    Range("B151:K156").Select 
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(10), _ 
     Replace:=True, PageBreaks:=False, SummaryBelowData:=True 
End Sub 

ответ

0

Попробуйте этот код. Это позволит пользователю выбирать диапазон, используя поле ввода.

Dim SortRng As Range 

Set SortRng = Application.InputBox("Select the range to sort", "Select Range", 0, , , , , 8) 

SortRng.Select 
Selection.Sort Key1:=SortRng, Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
DataOption1:=xlSortNormal 
Range("A1").Select 
+0

Удалите свой код полностью, кроме 'Sub Sort_and_Subtotal_CheckBox()' и 'End Sub', и используйте мой код. Когда вы запустите макрос, вы увидите окно ввода. Когда вы увидите окно ввода, вы можете ввести диапазон в нем или вы также можете выбрать диапазон, щелкнув и перетащив. – sn152

+0

Можете ли вы показать образец своих данных и результат, которого вы пытаетесь достичь? – sn152

+0

Если бы мой ответ помог вам, не могли бы вы принять его? – sn152

0

Если вы хотите получить выбранный диапазон, вы можете просто запросить Selection.Address в VBA. Однако я считаю, что это предполагает, что выбор является блоком ячеек, поэтому это может не всегда давать желаемый результат (например, в случае нескольких выбранных диапазонов). Другим решением может быть преобразование списка затрат в таблицу. В вашем макросе вы можете просто ссылаться на именованный диапазон, а именно на столбец во вновь созданной таблице. Таблица будет работать как динамический именованный диапазон и всегда будет включать в себя весь диапазон значений. Если вы можете быть уверены, что не будет данных ниже списка затрат, вторым вариантом будет проверка последней строки, которая не является пустой в столбце, где хранится список затрат. Что-то вроде .Cells(.Rows.Count, "A").End(xlUp).Row, чтобы получить последнюю строку столбца, содержащего список.