Добрый вечер всем. У меня снова появилась проблема с моей таблицей. Мне нужна автоматическая сортировка данных и как я понял, она делается с помощью макроса. От A:CF в листе 'Январь 2015' начиная с A3, по первому столбику. Если по другому, в первом столбике вписываем фамилию и все строки сортируются по нему, от А до Я. Перелазил много страничек в поиске решения, нашел различные кода, но они не применяются, возможно что-то делаю не так. Возможно из-за того что у меня таблица и диапазоны. Но у меня даже не загорается простая кнопка сортировки при выделении всех строк. Прилагаю полную версию таблицы, так как пример думаю будет не актуален, что бы выявить ошибку. [p.s.]извиняюсь за нарушение правил за ранее и спасибо всем, кто поможет.
Добрый вечер всем. У меня снова появилась проблема с моей таблицей. Мне нужна автоматическая сортировка данных и как я понял, она делается с помощью макроса. От A:CF в листе 'Январь 2015' начиная с A3, по первому столбику. Если по другому, в первом столбике вписываем фамилию и все строки сортируются по нему, от А до Я. Перелазил много страничек в поиске решения, нашел различные кода, но они не применяются, возможно что-то делаю не так. Возможно из-за того что у меня таблица и диапазоны. Но у меня даже не загорается простая кнопка сортировки при выделении всех строк. Прилагаю полную версию таблицы, так как пример думаю будет не актуален, что бы выявить ошибку. [p.s.]извиняюсь за нарушение правил за ранее и спасибо всем, кто поможет.Kenbroladeb
Если очень хочется поставить защиту листа, то разрешайте при этом сортировку и фильтр. И не будет вопросов, почему не работает. В макрос добавить [vba]
Код
AllowSorting:=True, AllowFiltering:=True
[/vba]
Если очень хочется поставить защиту листа, то разрешайте при этом сортировку и фильтр. И не будет вопросов, почему не работает. В макрос добавить [vba]
Действительно, убрал таблицы и заработало, но теперь автофильтр на нужные столбики поставить нужно, эх емае. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("A3:CF400").Sort Key1:=[a3] End If End Sub
[/vba] А можно как-то допилить макрос, что бы выделение оставалось на нем? Приведу пример. На A100 я написал фамилию Азаров, отсортировало его в A4 и теперь мне надо искать глазами куда его закинуло...
Действительно, убрал таблицы и заработало, но теперь автофильтр на нужные столбики поставить нужно, эх емае. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("A3:CF400").Sort Key1:=[a3] End If End Sub
[/vba] А можно как-то допилить макрос, что бы выделение оставалось на нем? Приведу пример. На A100 я написал фамилию Азаров, отсортировало его в A4 и теперь мне надо искать глазами куда его закинуло...Kenbroladeb
Сообщение отредактировал Kenbroladeb - Пятница, 09.01.2015, 01:17
но теперь автофильтр на нужные столбики поставить нужно, эх емае.
Что такое нужные столбики?
Поиск можно так: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim s As String, c As Long s = Target.Value c = Target.Column If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("A3:CF400").Sort Key1:=[a3] End If 'ПОИСК: Range(Cells(1, c), Cells(1000, c)).Find(What:=s, After:=Cells(1, c), LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub
но теперь автофильтр на нужные столбики поставить нужно, эх емае.
Что такое нужные столбики?
Поиск можно так: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim s As String, c As Long s = Target.Value c = Target.Column If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("A3:CF400").Sort Key1:=[a3] End If 'ПОИСК: Range(Cells(1, c), Cells(1000, c)).Find(What:=s, After:=Cells(1, c), LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub
Мне фильтр нужен только на определенные столбики, т.е. поставил столбик не диапазоном, а таблицей и там можно фильтр поставить, а стандартным не выберешь отдельно, либо все, либо по 2 столба и не более... За поиск огромное спасибо, намного удобней. Ошибку выдает в [vba]
Мне фильтр нужен только на определенные столбики, т.е. поставил столбик не диапазоном, а таблицей и там можно фильтр поставить, а стандартным не выберешь отдельно, либо все, либо по 2 столба и не более... За поиск огромное спасибо, намного удобней. Ошибку выдает в [vba]
[/vba] object variable or with block variable not set В изменении 1 колонке сортирует, но если редактировать остальные, вылазит такая ошибкаKenbroladeb
Сообщение отредактировал Kenbroladeb - Среда, 14.01.2015, 00:54
т.е. поставил столбик не диапазоном, а таблицей и там можно фильтр поставить, а стандартным не выберешь отдельно, либо все, либо по 2 столба и не более...
я ничего не понял Опишите конкретнее. Например: Меняю ячейку С5 - нужно отсортировать диапазон А3:С1000 по столбцу С
Опишите несколько ситуаций, чтобы было понятно
Если нужно сортировать именно в отдельной таблице - попробуйте:
[vba]
Код
Activesheet.ListObjects("Таблица1").Sort.SortFields.Clear ' "Таблица1" - название таблицы Activesheet.ListObjects("Таблица1").Sort. _ SortFields.Add Key:=Range("Таблица1[[#All],[Дата]]"), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers ' [Дата] - название поля в шапке таблицы
With Activesheet.ListObjects("Таблица1").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
[/vba]
Можно отдельные диапазоны сортировать и без таблиц(даже при активном общем автофильтре):
[vba]
Код
Range("P5:S16").Select '"P5:S16") Диапазон, который будем сортировать Activesheet.Sort.SortFields.Clear Activesheet.Sort.SortFields.Add Key:=Range( _ "P5:P16"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ' Диапазон по которому нужно остсортировать With Activesheet.Sort .SetRange Range("P5:S16") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
т.е. поставил столбик не диапазоном, а таблицей и там можно фильтр поставить, а стандартным не выберешь отдельно, либо все, либо по 2 столба и не более...
я ничего не понял Опишите конкретнее. Например: Меняю ячейку С5 - нужно отсортировать диапазон А3:С1000 по столбцу С
Опишите несколько ситуаций, чтобы было понятно
Если нужно сортировать именно в отдельной таблице - попробуйте:
[vba]
Код
Activesheet.ListObjects("Таблица1").Sort.SortFields.Clear ' "Таблица1" - название таблицы Activesheet.ListObjects("Таблица1").Sort. _ SortFields.Add Key:=Range("Таблица1[[#All],[Дата]]"), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers ' [Дата] - название поля в шапке таблицы
With Activesheet.ListObjects("Таблица1").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
[/vba]
Можно отдельные диапазоны сортировать и без таблиц(даже при активном общем автофильтре):
[vba]
Код
Range("P5:S16").Select '"P5:S16") Диапазон, который будем сортировать Activesheet.Sort.SortFields.Clear Activesheet.Sort.SortFields.Add Key:=Range( _ "P5:P16"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ' Диапазон по которому нужно остсортировать With Activesheet.Sort .SetRange Range("P5:S16") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
Помогло, надеюсь не надоедаю вам, но есть еще 1 нюанс, если в любом столбике текст повторяется на каких-то строчках, тогда курсор (выделение) переносится на самую первую строчку с этим значением. т.е. Допустим, столбик F, в нем 500 строк, на первой строчке в F1 текст = "пилатес" и когда мы вводим такой же текст "пилатес" на любую другую строку (F499), тогда выделение прыгает аж на F1. Так же с удалением, если на F499 очищаем ячейку, тогда выделение прыгает тоже вверх, ища самую первую пустую ячейку, надо как-то подшаманить поиск, увы я не понимаю. А про фильтр пока мне не особо нужен, потом разберусь, но тоже спс -)
Помогло, надеюсь не надоедаю вам, но есть еще 1 нюанс, если в любом столбике текст повторяется на каких-то строчках, тогда курсор (выделение) переносится на самую первую строчку с этим значением. т.е. Допустим, столбик F, в нем 500 строк, на первой строчке в F1 текст = "пилатес" и когда мы вводим такой же текст "пилатес" на любую другую строку (F499), тогда выделение прыгает аж на F1. Так же с удалением, если на F499 очищаем ячейку, тогда выделение прыгает тоже вверх, ища самую первую пустую ячейку, надо как-то подшаманить поиск, увы я не понимаю. А про фильтр пока мне не особо нужен, потом разберусь, но тоже спс -)Kenbroladeb
If Target.Value <> "" Then ' запуск поиска если не удаление
[/vba] А вот с дублями - сложнее - поскольку оно находит первое совпадение. Можно искать и сортировать только по первому столбцу... там не должно быть повторений... для этого измените:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim s As String, c As Long c = 1 '1 = нужный столбец c = Target.Column ' - для текущего столбца s = Cells(Target.Row, c).Text
If c = Target.Column Then 'Если изменение в нужном столбце If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("a3:CF400").Sort Key1:=Cells(3, c) ' сортировка по столбцу изменения, чтобы сортировать по нужному столбцу вместо с - написать номер столбца. End If
If Target.Value <> "" Then ' запуск поиска если не удаление Range(Cells(1, c), Cells(1000, c)).Find(What:=s, After:=Cells(1, c), LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End If End If End Sub
[/vba]
с пустой ячейкой все просто: [vba]
Код
If Target.Value <> "" Then ' запуск поиска если не удаление
[/vba] А вот с дублями - сложнее - поскольку оно находит первое совпадение. Можно искать и сортировать только по первому столбцу... там не должно быть повторений... для этого измените:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim s As String, c As Long c = 1 '1 = нужный столбец c = Target.Column ' - для текущего столбца s = Cells(Target.Row, c).Text
If c = Target.Column Then 'Если изменение в нужном столбце If Not Intersect(Target, Range("A:CF")) Is Nothing Then Range("a3:CF400").Sort Key1:=Cells(3, c) ' сортировка по столбцу изменения, чтобы сортировать по нужному столбцу вместо с - написать номер столбца. End If
If Target.Value <> "" Then ' запуск поиска если не удаление Range(Cells(1, c), Cells(1000, c)).Find(What:=s, After:=Cells(1, c), LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End If End If End Sub