Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Botsman
Статус: Студент
Рейтинг: 142
∙ повысить рейтинг >>
Faustofel
Статус: 10-й класс
Рейтинг: 102
∙ повысить рейтинг >>
Evgenijm
Статус: 3-й класс
Рейтинг: 40
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 874
от 27.03.2009, 16:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 283, Экспертов: 25
В номере:Вопросов: 1, Ответов: 3

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>

Вопрос № 162945: Уважаемые эксперты! Помогите выйти из затруднительного положения: как можно в VBA дать имя листу Excel, который только что возник в результате копирования (перемещения) и имя его не известно. Это относится к конечному числу писем. Заранее благо...


Вопрос № 162.945
Уважаемые эксперты!
Помогите выйти из затруднительного положения: как можно в VBA дать имя листу Excel, который только что возник в результате копирования (перемещения) и имя его не известно. Это относится к конечному числу писем.
Заранее благодарю - Ф.Зыков
Отправлен: 22.03.2009, 15:49
Вопрос задал: Зыков Феликс Никанорович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Залетин Виталий Викторович
Здравствуйте, Зыков Феликс Никанорович!
Откройте VBA-проект, выберите двойным щелчком в менеджере проекта строку "Эта книга" и в появившемся окне кода в левом списке выберите "Workbook" (собственно там оно только и будет), а в правом списке (событий) - "NewSheet". Теперь при любом создании листа в книге у Вас будет вызываться это событие. Вот пример:

Код:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox Sh.Name
End Sub


Собственно, Sh в параметре - это объект Worksheet, который можно рассмотреть в браузере объектов (по Ф2). Много чего можно понаделать с ним...

Теперь по сути: прямого события по описанным Вами действиям обнаружить не удалось, но можно отреагировать на событие SheetActivate, но тогда Вам прийдется при открытии книги составлять список листов в ней и при активизации листа проверять, есть ли этот лист в Вашем списке при открытии и если нету - то добавлять его в список (чтобы в дальнейшем не откликаться на него как на новый), а если есть в списке этот лист, который активировался - то ничего не делать.
---------
Учиться никогда не поздно. Особенно программированию!
Ответ отправил: Залетин Виталий Викторович (статус: Практикант)
Ответ отправлен: 22.03.2009, 16:28

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 245783 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает: Megaloman
    Здравствуйте, Зыков Феликс Никанорович!
    Во первых, давайте определимся, какой лист Вы копируете. И куда Вы его копируете. Как только получим с этим ясность, дальнейшее совершенно тривиально.
    В книге может быть несколько листов.
    Чтобы получить их количество, можно написать выражение

    Число_Листов_в_книге = Sheets.Count

    Если Вы копируете активный лист, то можно определить его имя и номер по порядку

    Имя_активного_листа = ActiveSheet.Name
    Номер_активного_листа = ActiveSheet.Index

    Если вы знаете имя листа, который копируем, то его номер можно определить как

    Номер_листа_с_именем = 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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Решение прекрасное. Спасибо, что не прошли мимо, спасибо за профессионализм. Я затратил бы меньше времени, если были бы примечания, но это уже моя беда. А может и хорошо - приходится шевелить...
    Желаю всего хорошего Ф.Зыков


    Вы имеете возможность оценить этот выпуск рассылки.
    Нам очень важно Ваше мнение!
    Оценить этот выпуск рассылки >>

    Отправить вопрос экспертам этой рассылки

    Приложение (если необходимо):

    * Код программы, выдержки из закона и т.п. дополнение к вопросу.
    Эта информация будет отображена в аналогичном окне как есть.

    Обратите внимание!
    Вопрос будет отправлен всем экспертам данной рассылки!

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное