Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Адрес текущей ячейки на неактивном листе - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Адрес текущей ячейки на неактивном листе
psw Дата: Воскресенье, 26.05.2013, 15:20 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

Как в VB определить
адрес текущей (выбранной) ячейки на неактивном листе
или
является ли ячейка на неактивном листе - текущей (выбранной)
?
(активировать лист нельзя)
 
Ответить
СообщениеКак в VB определить
адрес текущей (выбранной) ячейки на неактивном листе
или
является ли ячейка на неактивном листе - текущей (выбранной)
?
(активировать лист нельзя)

Автор - psw
Дата добавления - 26.05.2013 в 15:20
Poltava Дата: Понедельник, 27.05.2013, 00:52 | Сообщение № 2
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Ну если в нужном месте кода активировать нельзя, то активируйте в начале макроса и просто храните в переменной.
 
Ответить
СообщениеНу если в нужном месте кода активировать нельзя, то активируйте в начале макроса и просто храните в переменной.

Автор - Poltava
Дата добавления - 27.05.2013 в 00:52
Alex_ST Дата: Понедельник, 27.05.2013, 08:43 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Poltava истину глаголит smile
Проще всего перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0) в Public-переменную



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеPoltava истину глаголит smile
Проще всего перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0) в Public-переменную

Автор - Alex_ST
Дата добавления - 27.05.2013 в 08:43
psw Дата: Понедельник, 27.05.2013, 11:20 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

Лист может быть вообще никогда не активирован.
Во время работы VB-программы
(своего рода демон корявый, с тайм-аутами по DoEvents)
пользователь "вручную" ходит по листам и "тыкает" в ячейки,
оставляя их выбранными.
Кроме того, VB-программа может быть остановлена
и перестартована после [ручной] деактивации листа.
Поэтому и надо определить выбранную ячейку
на НЕактивном листе.
Неужели VB Excel настолько беден...
 
Ответить
СообщениеЛист может быть вообще никогда не активирован.
Во время работы VB-программы
(своего рода демон корявый, с тайм-аутами по DoEvents)
пользователь "вручную" ходит по листам и "тыкает" в ячейки,
оставляя их выбранными.
Кроме того, VB-программа может быть остановлена
и перестартована после [ручной] деактивации листа.
Поэтому и надо определить выбранную ячейку
на НЕактивном листе.
Неужели VB Excel настолько беден...

Автор - psw
Дата добавления - 27.05.2013 в 11:20
Serge_007 Дата: Понедельник, 27.05.2013, 11:53 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Цитата (psw)
активировать лист нельзя
С чем связано это условие?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Цитата (psw)
активировать лист нельзя
С чем связано это условие?

Автор - Serge_007
Дата добавления - 27.05.2013 в 11:53
Alex_ST Дата: Понедельник, 27.05.2013, 12:23 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Цитата (psw)
Лист может быть вообще никогда не активирован

активируйте его насильно по Auto_Open или по Workbook_Open



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Цитата (psw)
Лист может быть вообще никогда не активирован

активируйте его насильно по Auto_Open или по Workbook_Open

Автор - Alex_ST
Дата добавления - 27.05.2013 в 12:23
AndreTM Дата: Понедельник, 27.05.2013, 14:11 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Цитата (psw)
Лист может быть вообще никогда не активирован.
противоречит
Цитата (psw)
Во время работы VB-программы ... пользователь "вручную" ходит по листам и "тыкает" в ячейки, оставляя их выбранными. Кроме того, VB-программа может быть остановлена и перестартована после [ручной] деактивации листа.
Если же лист вообще ни разу не "посещался" или новый - то "Текущая ячейка" на нем есть Cells(1,1). Совет
Цитата (Alex_ST)
перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0)
вполне подходит - только запоминайте адрес прямо в ячейку на листе.

С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос biggrin


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Цитата (psw)
Лист может быть вообще никогда не активирован.
противоречит
Цитата (psw)
Во время работы VB-программы ... пользователь "вручную" ходит по листам и "тыкает" в ячейки, оставляя их выбранными. Кроме того, VB-программа может быть остановлена и перестартована после [ручной] деактивации листа.
Если же лист вообще ни разу не "посещался" или новый - то "Текущая ячейка" на нем есть Cells(1,1). Совет
Цитата (Alex_ST)
перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0)
вполне подходит - только запоминайте адрес прямо в ячейку на листе.

С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос biggrin

Автор - AndreTM
Дата добавления - 27.05.2013 в 14:11
psw Дата: Понедельник, 27.05.2013, 20:46 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

Пользователь и VB-программа (для краткости - демон) работают параллельно.
Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
на котором пользователь в это время работает. Это недопустимо.

Кроме того, демон м.б. стартован после того как пользователь
побывал на Листе1 демона и покинул его - "вручную деактивировал" Лист1.
Поэтому демону нечего запоминать "в ячейку на листе"[1].
В процессе совместной работы пользователя и демона, у демона
м.б. несколько жизней (от своего старта до своего завершения),
и очередной старт жизни м.б. необязательно на Листе1.

Почему-то народ пытается обойти именно
изначально сформулированное, главное (и единственное!)
условие задачки - запрет активации неактивного листа))))
 
Ответить
СообщениеПользователь и VB-программа (для краткости - демон) работают параллельно.
Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
на котором пользователь в это время работает. Это недопустимо.

Кроме того, демон м.б. стартован после того как пользователь
побывал на Листе1 демона и покинул его - "вручную деактивировал" Лист1.
Поэтому демону нечего запоминать "в ячейку на листе"[1].
В процессе совместной работы пользователя и демона, у демона
м.б. несколько жизней (от своего старта до своего завершения),
и очередной старт жизни м.б. необязательно на Листе1.

Почему-то народ пытается обойти именно
изначально сформулированное, главное (и единственное!)
условие задачки - запрет активации неактивного листа))))

Автор - psw
Дата добавления - 27.05.2013 в 20:46
AndreTM Дата: Понедельник, 27.05.2013, 20:56 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

Вам же советуют реальный обходной путь. Который исходит из того, что "текущую ячейку" на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, - видимо, не знаете, как правильно организовать событийную модель своей задачи...


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Понедельник, 27.05.2013, 21:01
 
Ответить
СообщениеВы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

Вам же советуют реальный обходной путь. Который исходит из того, что "текущую ячейку" на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, - видимо, не знаете, как правильно организовать событийную модель своей задачи...

Автор - AndreTM
Дата добавления - 27.05.2013 в 20:56
psw Дата: Понедельник, 27.05.2013, 21:30 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

А может и не понимаю.
Вот пользователь открыл файл, активировал Лист1, выбрал там ячейку,
перешёл на свой Лист2 (т.е. Лист1 - деактивирован) и работает там, на Листе2.
В это время стартовал демон.
Как демон может узнать: какая ячейка на ["давно уже"] неактивном Листе1
выбрана пользователем? (без помех для пользователя)
Может и не понимаю.
 
Ответить
СообщениеА может и не понимаю.
Вот пользователь открыл файл, активировал Лист1, выбрал там ячейку,
перешёл на свой Лист2 (т.е. Лист1 - деактивирован) и работает там, на Листе2.
В это время стартовал демон.
Как демон может узнать: какая ячейка на ["давно уже"] неактивном Листе1
выбрана пользователем? (без помех для пользователя)
Может и не понимаю.

Автор - psw
Дата добавления - 27.05.2013 в 21:30
Alex_ST Дата: Понедельник, 27.05.2013, 21:45 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, я даже не знаю как ещё яснее можно выразить совет:
Цитата (Alex_ST)
перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0) в Public-переменную
…?
Вам конкретный код-пример, кажется, писать не надо раз у Вас там метафизические демоны и так уже водятся smile



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНу, я даже не знаю как ещё яснее можно выразить совет:
Цитата (Alex_ST)
перед деактивацией листа по событию Worksheet_Deactivate запоминать ActiveCell.Address(0, 0) в Public-переменную
…?
Вам конкретный код-пример, кажется, писать не надо раз у Вас там метафизические демоны и так уже водятся smile

Автор - Alex_ST
Дата добавления - 27.05.2013 в 21:45
psw Дата: Понедельник, 27.05.2013, 23:16 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

..и вообще-то при Worksheet_Deactivate для Листа1
в ActiveCell.Address(0, 0) содержится
адрес ячейки Листа2 НА который делается переход
а не
адрес ячейки Листа1 С которого делается переход..

можете проверить)):

[vba]
Код
Private Sub Worksheet_Deactivate()
Application.EnableEvents = False
Application.ScreenUpdating = False
MsgBox (ActiveCell.Address(0, 0))
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
[/vba]

[admin]Оформляйте коды тегами![/admin]
 
Ответить
Сообщение..и вообще-то при Worksheet_Deactivate для Листа1
в ActiveCell.Address(0, 0) содержится
адрес ячейки Листа2 НА который делается переход
а не
адрес ячейки Листа1 С которого делается переход..

можете проверить)):

[vba]
Код
Private Sub Worksheet_Deactivate()
Application.EnableEvents = False
Application.ScreenUpdating = False
MsgBox (ActiveCell.Address(0, 0))
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
[/vba]

[admin]Оформляйте коды тегами![/admin]

Автор - psw
Дата добавления - 27.05.2013 в 23:16
Poltava Дата: Вторник, 28.05.2013, 01:20 | Сообщение № 13
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

psw а что проверять то? все так и должно быть, в чем можно легко убедиться
Цитата (из F1)
Событие SheetDeactivate(Sh As Object). Возникает когда страница перестает быть активной, поскольку активной становится другая страница. Деактивированная страница передается обработчику события в качестве параметра

Так что когда срабатывает SheetDeactivate активным уже является другой лист! Но нам никто не запрещает сделать так

Ну и так сказать мои 5 копеек! Я конечно понимаю что настоящие герои всегда идут в обход но как по мне писать этот код для 20-30 листов в книге это пагубная идея! предлагаю такой вариант в модуль книги. Попробуйте попереключать листы в приложенном файле.

Вместо месенжа используйте Public массив в котором храните текущие значения. Заполнить массив можно при старте перебрав все листы. В качестве номера в массиве можно использовать индекс листа! но это только если пользователь не может перетасовать листы! иначе можно использовать коллекцию и кодовые имена листов. В общем тут уже сами придумаете что удобней
К сообщению приложен файл: _Post1210171459.xls (36.5 Kb)


Сообщение отредактировал Poltava - Вторник, 28.05.2013, 01:24
 
Ответить
Сообщениеpsw а что проверять то? все так и должно быть, в чем можно легко убедиться
Цитата (из F1)
Событие SheetDeactivate(Sh As Object). Возникает когда страница перестает быть активной, поскольку активной становится другая страница. Деактивированная страница передается обработчику события в качестве параметра

Так что когда срабатывает SheetDeactivate активным уже является другой лист! Но нам никто не запрещает сделать так

Ну и так сказать мои 5 копеек! Я конечно понимаю что настоящие герои всегда идут в обход но как по мне писать этот код для 20-30 листов в книге это пагубная идея! предлагаю такой вариант в модуль книги. Попробуйте попереключать листы в приложенном файле.

Вместо месенжа используйте Public массив в котором храните текущие значения. Заполнить массив можно при старте перебрав все листы. В качестве номера в массиве можно использовать индекс листа! но это только если пользователь не может перетасовать листы! иначе можно использовать коллекцию и кодовые имена листов. В общем тут уже сами придумаете что удобней

Автор - Poltava
Дата добавления - 28.05.2013 в 01:20
AndreTM Дата: Вторник, 28.05.2013, 06:14 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Я придумал немного другой вариант (с доп.переменной в модуле каждого "нужного" листа), построенный на исключениях.
Правда, что-то там не дает переключаться на другие открытые книги (есть обход - можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия "новооткрытого" - не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно... Что-то там с событиями - надо посмотреть.
Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) - без нареканий (при добавлении - надо озаботиться прописыванием переменной, при копировании - достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода - минимум biggrin

Да, ещё. Переменные в модулях листа - Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к "активной" ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика.
К сообщению приложен файл: 10-4879-1-2-.xls (74.5 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Вторник, 28.05.2013, 06:29
 
Ответить
СообщениеЯ придумал немного другой вариант (с доп.переменной в модуле каждого "нужного" листа), построенный на исключениях.
Правда, что-то там не дает переключаться на другие открытые книги (есть обход - можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия "новооткрытого" - не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно... Что-то там с событиями - надо посмотреть.
Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) - без нареканий (при добавлении - надо озаботиться прописыванием переменной, при копировании - достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода - минимум biggrin

Да, ещё. Переменные в модулях листа - Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к "активной" ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика.

Автор - AndreTM
Дата добавления - 28.05.2013 в 06:14
psw Дата: Воскресенье, 02.06.2013, 19:58 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 10
Репутация: 0 ±
Замечаний: 0% ±

Спасибо всем огромное.
Ввиду того, что достаточно простого и "минималистического" [для меня]
метода не нашлось, пришлось несколько пересмотреть технологию,
и в результате её пересмотра оказалось возможным использовать
обработчик события Worksheet_SelectionChange.
Тут вообще практически кода нет)).
Благодарен..
 
Ответить
СообщениеСпасибо всем огромное.
Ввиду того, что достаточно простого и "минималистического" [для меня]
метода не нашлось, пришлось несколько пересмотреть технологию,
и в результате её пересмотра оказалось возможным использовать
обработчик события Worksheet_SelectionChange.
Тут вообще практически кода нет)).
Благодарен..

Автор - psw
Дата добавления - 02.06.2013 в 19:58
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!