Вопрос № 162945: Уважаемые эксперты! Помогите выйти из затруднительного положения: как можно в VBA дать имя листу Excel, который только что возник в результате копирования (перемещения) и имя его не известно. Это относится к конечному числу писем. Заранее благо...
Вопрос № 162.945
Уважаемые эксперты! Помогите выйти из затруднительного положения: как можно в VBA дать имя листу Excel, который только что возник в результате копирования (перемещения) и имя его не известно. Это относится к конечному числу писем. Заранее благодарю - Ф.Зыков
Отвечает: Залетин Виталий Викторович
Здравствуйте, Зыков Феликс Никанорович! Откройте VBA-проект, выберите двойным щелчком в менеджере проекта строку "Эта книга" и в появившемся окне кода в левом списке выберите "Workbook" (собственно там оно только и будет), а в правом списке (событий) - "NewSheet". Теперь при любом создании листа в книге у Вас будет вызываться это событие. Вот пример:
Код:
Private Sub Workbook_NewSheet(ByVal Sh As Object) MsgBox Sh.Name End Sub
Собственно, Sh в параметре - это объект Worksheet, который можно рассмотреть в браузере объектов (по Ф2). Много чего можно понаделать с ним...
Теперь по сути: прямого события по описанным Вами действиям
обнаружить не удалось, но можно отреагировать на событие SheetActivate, но тогда Вам прийдется при открытии книги составлять список листов в ней и при активизации листа проверять, есть ли этот лист в Вашем списке при открытии и если нету - то добавлять его в список (чтобы в дальнейшем не откликаться на него как на новый), а если есть в списке этот лист, который активировался - то ничего не делать.
--------- Учиться никогда не поздно. Особенно программированию!
#thank 245783 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает: Megaloman
Здравствуйте, Зыков Феликс Никанорович! Во первых, давайте определимся, какой лист Вы копируете. И куда Вы его копируете. Как только получим с этим ясность, дальнейшее совершенно тривиально. В книге может быть несколько листов. Чтобы получить их количество, можно написать выражение
Число_Листов_в_книге = Sheets.Count
Если Вы копируете активный лист, то можно определить его имя и номер по порядку
Если вы знаете имя листа, который копируем, то его номер можно определить как
Номер_листа_с_именем = Sheets("Лист1").Index
Далее всё просто. Вы знаете, что копируем, теперь копируем в определенное нами место, например:
Допустим, копируем "Лист1" перед всеми листами
Sheets("Лист1").Copy Before:=Sheets(1) (аналогично перед любым другим существующим листом, лишь бы его номер не выходил за
диапазон имеющихся листов) при этом его номер очевидно станет Новый_номер = 1
Допустим, копируем лист с номером 5 после всех имеющихся листов
Sheets(5).Copy After:=Sheets(Число_Листов_в_книге) (аналогично любой по номеру лист после любого другого существующего листа, лишь бы их номера не выходили за диапазон имеющихся листов) при этом его номер очевидно станет Новый_номер = Число_Листов_в_книге + 1
Теперь Вы знаете, где расположен вставленный лист Нам надо его переименовать,
например
Новое_имя = "Желаемое_Имя"
Переименовываем его (лишь бы новое имя не совпадало с имеющимся иначе надо писать обработку ошибки и как-то модифицировать желаемое имя) Sheets(Новый_номер).Name = Новое_имя
Вообще-то после копирования новый лист становится активным, поэтому можно вообще не принимать в расчёт, что я выше насоветовал (я постарался показать имеющиеся инструменты для работы с листами применительно к Вашей задаче),
и написать ActiveSheet.Name = Новое_имя
--------- Нет времени на медленные танцы
Ответ отправил: Megaloman (статус: Практикант)
Ответ отправлен: 22.03.2009, 19:18
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 245800 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: С учетом последнего сообщения получилось прекрасное решение. Очень важна прозрачность (для -увы - любителя). Спасибо за проделанную работу! Циклы буду терзать сам, в случае провала воспользуюсь Вашим предложением. Снаилучшими пожеланиями Ф.Зыков
Отвечает: HookEst
Здравствуйте, Зыков Феликс Никанорович! в свете новых фактов: т.к. Вы копируете скрытые листы, то и активными они у Вас не станут, ActiveSheet использовать нельзя, остальные способы имеют право на жизнь, можно еще не высчитывать индексы как Megaloman, а использовать свойства Next и Previous:
Код:
Sub CopyNamed(ws As Worksheet, ByVal aName As String, Optional aBefore As Worksheet, Optional aAfter As Worksheet) If Not aBefore Is Nothing Then ws.Copy before:=aBefore aBefore.Previous.Name = aName ElseIf Not aAfter Is Nothing Then ws.Copy after:=aAfter aAfter.Next.Name = aName End If End Sub
Sub usage() Dim ws As Worksheet Dim ws2 As Worksheet Set ws = Worksheets(1
) Set ws2 = Worksheets(2)
CopyNamed ws, "before2", ws2 CopyNamed ws, "after2", , ws2 End Sub
ну и по традиции: можно это все не делать, а т.к. Вы все равно все копируете в одно место, то копируйте сначала все 4 листа, например, в начало, а потом просто присваиваете имена первым 4 листам.
Успехов.
Ответ отправил: HookEst (статус: Специалист)
Ответ отправлен: 23.03.2009, 03:24
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 245824 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценка за ответ: 5 Комментарий оценки: Решение прекрасное. Спасибо, что не прошли мимо, спасибо за профессионализм. Я затратил бы меньше времени, если были бы примечания, но это уже моя беда. А может и хорошо - приходится шевелить... Желаю всего хорошего Ф.Зыков
Скажите "спасибо" эксперту, который помог Вам!
Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
на короткий номер 1151 (Россия)
Номер ответа и конкретный текст СМС указан внизу каждого ответа.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.