Динамически создаваемый лист и события для него

Программирование на Visual Basic for Applications
uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Динамически создаваемый лист и события для него

Сообщение uhm » 03.05.2005 (Вт) 17:00

Задачка: нужно создать в экселе программно лист, и добавить к этому листу обработку события WorkSheet_Change. Вопрос - что для этого нужно прописать в WorkBook_NewSheet или где-то еще.

Понимаю, что тема уже поднималась не раз... В голове смутно мелькают слова WithEvents, Class Module и т. д. Но в единую картину они не сложились даже после чтения формуа. Объясните кто-нибудь, а?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2005 (Вт) 17:15

Код: Выделить всё
option rtfm

private withevents ws as worksheet

private sub addsheet()
  set ws=worksheets.add
end sub

private sub ws_change(byval target as range)
  msgbox "!"
end sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 03.05.2005 (Вт) 21:45

...и таки оно не работает! :(

Я вставил то, что ты написал, в Class Module (Class1). Ничего не происходит. Поменял все Private на Public, написал процедуру:

Код: Выделить всё
Sub test()
    Dim x As New Class1
    Set x.ws = Worksheets.Add
 
End Sub


Сам код работает без ошибок, но событие при изменении ячейки не происходит.

Аналогично, не работает, если я делаю x.addsheet

Я совсем что-то не то делаю? Или путь правильный, просто чего-то не хватает?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2005 (Ср) 3:42

Я где-то упоминал про Class1? :?
Вложения
Book1.zip
(6.51 Кб) Скачиваний: 42
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2005 (Ср) 3:45

А если хочется через класс, то почитай про время жизни объектов сначала :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 04.05.2005 (Ср) 7:57

Хмм...

F@!$ing Manual писал(а):WithEvents: Optional. Keyword that specifies that varname is an object variable used to respond to events triggered by an ActiveX object. WithEvents is valid only in class modules. You can declare as many individual variables as you like using WithEvents, but you can't create arrays with WithEvents. You can't use New with WithEvents.


Поэтому я и полез в class module. Про время жизни - это да, это я учту.

Спасибо за пример, в нем все работает. Но... Если добавить более чем один лист, event происходит только на нем, а на предыдущем - нет. Можно ли сделать таким способом event'ы для всех добавляемых листов?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.05.2005 (Ср) 8:38

Можно залезть в VBE, если это надо, и управлять непосредственно кодом.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 04.05.2005 (Ср) 10:02

alibek, спасибо за идею!

Сделал через VBE, так, пожалуй, проще:


Код: Выделить всё
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim k as String
k="..."
Application.VBE.ActiveVBProject.VBComponents(Sh.Name).CodeModule.AddFromString k
End Sub


k содержит код, который нужно вставить в модуль кода каждого листа.

GSerg, тебе тоже спасибо. Я немножко с этими всеми вещами разобрался.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList