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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2011, 19:43   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию событие удаление листа

Необходимо отловить событие удаление листа в любой отрытой книге. Имеем класс описывающий объект Application With Events. Как всегда есть событие WorkbookNewSheet, а события удаления листа нет.
В инете удалось найти:
Код:
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    'MenuSheet - это лист у меня в книге, где хранится вся информация для меню и т.п.
        Sheets("MenuSheet").Range("H10") = Sh.Name
        prev_sheet = Sheets("MenuSheet").Range("I10")
        On Error GoTo er_str
        a = Sheets(prev_sheet).Range("A1")
    er_str:
        If Err.Number = 9 Then
            MsgBox ("Удален лист: " & Sheets("MenuSheet").Range("I10"))
                  
        End If
    End Sub
     
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        Sheets("MenuSheet").Range("I10") = Sh.Name
    End Sub
Здесь используют для хранения имени листа ячейку, что не сложно изменить...
Хотелось бы знать какой метод используют гуру.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 17.07.2011, 21:23   #2
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Необходимо отловить событие удаление листа в любой отрытой книге. Имеем класс описывающий объект Application With Events. Как всегда есть событие WorkbookNewSheet, а события удаления листа нет.
В инете удалось найти:
Код:
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    'MenuSheet - это лист у меня в книге, где хранится вся информация для меню и т.п.
        Sheets("MenuSheet").Range("H10") = Sh.Name
        prev_sheet = Sheets("MenuSheet").Range("I10")
        On Error GoTo er_str
        a = Sheets(prev_sheet).Range("A1")
    er_str:
        If Err.Number = 9 Then
            MsgBox ("Удален лист: " & Sheets("MenuSheet").Range("I10"))
                  
        End If
    End Sub
     
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        Sheets("MenuSheet").Range("I10") = Sh.Name
    End Sub
Здесь используют для хранения имени листа ячейку, что не сложно изменить...
Хотелось бы знать какой метод используют гуру.
Я бы наверное использовал глобальную коллекцию, или массив или еще чего нибудь, при открытии книги заполнял бы, при добавлении листа добавлял бы туда имя или еще чего . Затем при де активации сравнил бы коллекцию на наличие.

Ни разу не проверял, но сделал бы так.
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 17.07.2011, 22:06   #3
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Хотелось бы знать какой метод используют гуру.
Посмотреть бы на того невменяемого гуру, который удаляя лист не знал бы об этом. Жутко интересно - зачем? Легко проверить наличие листа. Листы удаляют обычно, по причине. Допустим, удалили случайно. И тут есть возможность при закрытии книги проверить наличие и закрыть не сохраняя. Другого способа восстановить лист нет. Разработчики тоже посчитали ввод такого события ненужным. И все же - зачем? Недавно обсуждали отлов события переименования листа(кстати, так же можно отследить и удаление). Я так и не понял зачем
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 17.07.2011, 22:21   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Посмотреть бы на того невменяемого гуру, который удаляя лист не знал бы об этом. Жутко интересно - зачем? Легко проверить наличие листа. Листы удаляют обычно, по причине. Допустим, удалили случайно. И тут есть возможность при закрытии книги проверить наличие и закрыть не сохраняя. Другого способа восстановить лист нет. Разработчики тоже посчитали ввод такого события ненужным. И все же - зачем? Недавно обсуждали отлов события переименования листа(кстати, так же можно отследить и удаление). Я так и не понял зачем
Отслеживать действия пользователя. Есть много путей сделать одно и то же действие, и гораздо проще отследить само действие, чем контролировать кучу мало понятны и могущих измениться мест.
Кроме того очень удобно делать через события "обязательные" действия. Например: у меня лист может быть создан разными макросами в разных условиях. Мне приходилось так или иначе прописывать обязательные действия во всех макросах. Так же были проблемы при изменении "обязательных" действий
При перехода на работу с классом описывающий объект Application With Events, появилась возможность всю работу переложить на событие создания книги. Теперь я во всех макросах убрал целые куски кода, и многие проблемы сразу пропали.
То же само я хотел проделать и с удалением листа. На текущий момент частично решило задачу использование метода SheetActivate, который так же срабатывает при удаление листа. Но далеко не во всех ситуациях его достаточно.
С уважением, Алексей.

Последний раз редактировалось tae1980; 17.07.2011 в 22:32.
tae1980 вне форума Ответить с цитированием
Старый 17.07.2011, 22:30   #5
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Алексей, думаете понятней стало? Ничуть. Отследили удаление и что? Какой нужен результат? Лист-то не восстановить. А если отслеживать ВСЕ действия пользователя? Это какая программа получится?
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 17.07.2011, 22:39   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
Я бы наверное использовал глобальную коллекцию, или массив или еще чего нибудь, при открытии книги заполнял бы, при добавлении листа добавлял бы туда имя или еще чего . Затем при де активации сравнил бы коллекцию на наличие.
Ни разу не проверял, но сделал бы так.
Я не думаю что стоит хранить названия листов, ведь в данном случае нужно отследить факт удаления листа, а не то какой лист был удален. Пока достаточно хранить для каждой книге количество листов. И если при событие SheetActivate оно больше, чем текущее кол-во листов, то значит один из листов был удален. А названия листов если нужно, я бы хранил в строковой переменной через разделитель. Очень простой и эффективный метод, работающий почти во всех языках программирования, то если когда нибудь придется переносить код - работы будет меньше.
С уважением, Алексей.

Последний раз редактировалось tae1980; 17.07.2011 в 22:48.
tae1980 вне форума Ответить с цитированием
Старый 17.07.2011, 22:44   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Алексей, думаете понятней стало? Ничуть. Отследили удаление и что? Какой нужен результат? Лист-то не восстановить.
А за чем его восстанавливать? Мне просто нужен сам факт удаления листа. На это у меня завязано значение нескольких переменных, которые нужно изменить, а так же нужно выполнить одно стандартное действие.
Цитата:
Сообщение от kuklp Посмотреть сообщение
А если отслеживать ВСЕ действия пользователя? Это какая программа получится?
Программист так или иначе остуживает ВСЕ действия пользователя, не нужно заблуждаться. Я писал на ассме для спекки, так вот там действительно отслеживал ВСЕ действия пользователя (в том числе несколько интерфейсов, один из них даже был объектно ориентирован :). Как видишь не умер. И программы весьма успешно ДО СИХ ПОР работают. Просто на современном уровне львиную долю работы на себя берет ОС. Мне же нужны не ВСЕ действия пользователя, а весьма ограниченный набор.
С уважением, Алексей.

Последний раз редактировалось tae1980; 17.07.2011 в 22:48.
tae1980 вне форума Ответить с цитированием
Старый 18.07.2011, 01:20   #8
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Я не думаю что стоит хранить названия листов, ведь в данном случае нужно отследить факт удаления листа, а не то какой лист был удален. .....................
можно добавить, а затем удалить и вы не узнаете что он был удален.
я не зря упомянул "или еще чего", под еще чего я подразумевал CodeName которое не доступно для обычного пользователя.
А как хранить информацию выбор за вами.
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 18.07.2011, 21:04   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
можно добавить, а затем удалить и вы не узнаете что он был удален.
я не зря упомянул "или еще чего", под еще чего я подразумевал CodeName которое не доступно для обычного пользователя.
А как хранить информацию выбор за вами.
CodeName имя у меня используется не по значению. )
Разумеется при добавления листа, необходим увеличивать счетчик листов и т.п. Но это уж чисто техническая задача и я не думаю что на ней стоит заострять внимание.
С уважением, Алексей.

Последний раз редактировалось tae1980; 18.07.2011 в 21:07.
tae1980 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отображение данных первого листа, при активации ячейки второго листа Akmal-Sharipov Microsoft Office Excel 4 03.12.2010 14:48
Удаление активой строки с одного листа на другой MilanAC Помощь студентам 0 28.04.2010 22:08
Событие листа - изменение выделения. Евгений ГВС Microsoft Office Excel 1 05.08.2009 01:24
Удаление листа без предупреждения tolikman Microsoft Office Excel 3 24.06.2009 19:13
Excel: Удаление графиков и картинок с листа treiber Microsoft Office Excel 5 04.09.2008 13:22