Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2013, 06:31   #11
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Как вариант, можно для сортировки нажимать на правую кнопку мыши. Тогда код от IgorGO нужно запускать по событию
Код:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
А в самом конце кода добавить строку
Код:
 Cancel = True
В этом случае можно многократно производить сортировку не деактивируя выбранную ячейку.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 21.04.2013, 13:54   #12
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Прошу прощения за назойливость.
я бы назвал это целеустремленность. Вы высказываете просьбы, личное дело каждого из тех, кому совершенно очевидно как это сделать, сделать это или нет. У меня было время и настроение...
Цитата:
Вы все сделали, почти как мне хотелось.
я сам понимаю что там хорошо, а что сделано кривовато. Это заготовка - тщательно обрабатываете напильником.
Цитата:
чтобы мой файл мог сортироваться по столбцам на любом компе у любого пользователя.
рассылайте пользователям - этот вариант уже довольно плотно приблизился к окончательному продукту.
одна уловка первая счейка таблицы должна обязательно называться "ФИО (начало таблицы)" (фио десять пробелов (начало таблицы)).
Вложения
Тип файла: rar Сортировка.rar (23.5 Кб, 24 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 22.04.2013, 14:27   #13
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

а по-моему былобы достаточно только одну строчку к первоначальному добавить:

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Cells.Count > 1 Then Exit Sub
  If Application.Intersect(Target, Range("B8:E8")) Is Nothing Then Exit Sub
  With Sort
    .SortFields.Clear
    .SortFields.Add Key:=Target.Resize(Target.End(xlDown).Row - Target.Row + 1, 1), SortOn:=xlSortOnValues, _
    Order:=IIf(Right(Target, 1) = " ", xlAscending, xlDescending), DataOption:=xlSortNormal
    If Right(Target, 1) = " " Then Target = Trim(Target) Else Target = Target & " "
    .SetRange Target.Offset(0, 2 - Target.Column).Resize(Target.End(xlDown).Row - Target.Row + 1, 4)
    .Header = xlYes
    .Apply
  End With
  Target.Offset(1).Select
End Sub

Последний раз редактировалось slan; 22.04.2013 в 14:38.
slan вне форума Ответить с цитированием
Старый 23.04.2013, 09:31   #14
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от slan Посмотреть сообщение
а по-моему былобы достаточно только одну строчку к первоначальному добавить:
тогда правильнее совместно с еще двумя строчками:
Код:
Application.EnableEvents = False
...
Application.EnableEvents = True
зачем еще раз вызывать это же событие?)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 23.04.2013, 10:27   #15
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

slan,
попадание 100%. минимум усилий, решение нескольких проблем.

DiemonStar,
это задумка такая автора: раз кликнул - посортировалось в одну сторону, второй - в другую... ляпота!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 23.04.2013, 11:32   #16
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
DiemonStar,
это задумка такая автора: раз кликнул - посортировалось в одну сторону, второй - в другую... ляпота!
Игорь, здесь даже вопрос не стоит. я про другое:

Цитата:
Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Cells.Count > 1 Then Exit Sub
  If Application.Intersect(Target, Range("B8:E8")) Is Nothing Then Exit Sub
  With Sort
    .SortFields.Clear
    .SortFields.Add Key:=Target.Resize(Target.End(xlDown).Row - Target.Row + 1, 1), SortOn:=xlSortOnValues, _
    Order:=IIf(Right(Target, 1) = " ", xlAscending, xlDescending), DataOption:=xlSortNormal
    If Right(Target, 1) = " " Then Target = Trim(Target) Else Target = Target & " "
    .SetRange Target.Offset(0, 2 - Target.Column).Resize(Target.End(xlDown).Row - Target.Row + 1, 4)
    .Header = xlYes
    .Apply
  End With
  Target.Offset(1).Select
End Sub
вот этот код чуть подправить:

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Cells.Count > 1 Then Exit Sub
  If Application.Intersect(Target, Range("B8:E8")) Is Nothing Then Exit Sub
  Application.EnableEvents = False
  With Sort
    .SortFields.Clear
    .SortFields.Add Key:=Target.Resize(Target.End(xlDown).Row - Target.Row + 1, 1), SortOn:=xlSortOnValues, _
    Order:=IIf(Right(Target, 1) = " ", xlAscending, xlDescending), DataOption:=xlSortNormal
    If Right(Target, 1) = " " Then Target = Trim(Target) Else Target = Target & " "
    .SetRange Target.Offset(0, 2 - Target.Column).Resize(Target.End(xlDown).Row - Target.Row + 1, 4)
    .Header = xlYes
    .Apply
  End With
  Target.Offset(1).Select
  Application.EnableEvents = True
End Sub
потому как Select в последней строке сформирует рекуррентное событие.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 23.04.2013, 12:54   #17
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

да, без Application.EnableEvents = False
Target.Offset(1).Select вызовет
Worksheet_SelectionChange 1 раз, но процедура завершит работу по
If Application.Intersect(Target, Range("B8:E8")) Is Nothing Then Exit Sub
лишний вызов есть, зацикливания нет, потому что отмеченная ячейка теперь под шапкой таблицы, а не в шапке.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 23.04.2013, 15:09   #18
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
тогда правильнее совместно с еще двумя строчками:
Код:
Application.EnableEvents = False
...
Application.EnableEvents = True
зачем еще раз вызывать это же событие?)
в принципе да, но в данном случае и так будет нормально ибо к зацикливанию не приведет
slan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать чтоб по клику в TreeView в DBGrid yaskin БД в Delphi 8 13.05.2012 10:42
Как сделать сортировку списка Я тут новенький Общие вопросы Delphi 16 23.04.2012 01:43
Как сделать пошаговую сортировку Шелла? Delphi Reydan-46 Помощь студентам 2 23.03.2012 08:38
[Вопрос]Как найти процесс приложения зная его заголовок? saylar_06 Общие вопросы Delphi 9 10.07.2011 21:17
Смена текста по клику на заголовок Иванна JavaScript, Ajax 4 09.02.2011 07:54