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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 07:28   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Использование кодовых имен страниц книги в надстройках

Разрабатываю ряд макросов пока они размещаются в рабочей книге. Активно использую обращение к страницами по кодовым именам. Для оптимизации хочу перенести большую часть макросов в надстройку. Краем уха слышал, что в этом нельзя обращаться к листам по кодовым именам. Так ли это?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 17.03.2009, 07:50   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Когда Вы пишите что-то вроде этого: Лист1.[a1] = 123
Excel пытается найти объект Лист1 в той книге, из которой запускается макрос.

В случае с надстройкой такой код будет искать лист с кодовым именем в самой надстройке, и, если не найдёт, возвратит ошибку.
Проще обращаться к листам по именам.

Я бы добавил в надстройку такой код:
Код:
Public sh1 As Worksheet, sh2 As Worksheet

Private Sub Workbook_Open() 'Макрос Запускается При Запуске Надстройки
    Set sh1 = Workbooks("Книга1").Worksheets("Лист1")
    Set sh2 = Workbooks("Книга1").Worksheets("Лист2")
End Sub
А потом во всем коде надстройки обращался бы к объектам sh1 и sh2

Можно в надстройке переопределить кодовые имена Лист1 и Лист2 (или какие у Вас там кодовые имена листов):
Код:
Public Лист1 As Worksheet, Лист2 As Worksheet

Private Sub Workbook_Open() 'Макрос Запускается При Запуске Надстройки
    Set Лист1 = Workbooks("Книга1").Worksheets("Лист1")
    Set Лист2 = Workbooks("Книга1").Worksheets("Лист2")
End Sub
В этом случае и код переделывать не придётся...
EducatedFool вне форума Ответить с цитированием
Старый 17.03.2009, 08:45   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно в надстройке переопределить кодовые имена Лист1 и Лист2 (или какие у Вас там кодовые имена листов):
Код:
Public Лист1 As Worksheet, Лист2 As Worksheet

Private Sub Workbook_Open() 'Макрос Запускается При Запуске Надстройки
    Set Лист1 = Workbooks("Книга1").Worksheets("Лист1")
    Set Лист2 = Workbooks("Книга1").Worksheets("Лист2")
End Sub
В этом случае и код переделывать не придётся...
Спасибо! Думаю это будет оптимально.
Жалко конечно что теряются кодовые имена. :( Я хотел с их помощью дать возможность пользователю переименовывать листы.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 17.03.2009, 09:01   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Жалко конечно что теряются кодовые имена
А куда они теряются?
Пользователь же не будет изменять кодовые имена листов...

Используйте такую функцию:
Код:
Function GetSheetByCodename(ByVal wbname As String, ByVal Cname As String) As Worksheet
    Dim sh As Worksheet
    For Each sh In Workbooks(wbname).Worksheets
        If sh.CodeName = Cname Then Set GetSheetByCodename = sh: Exit Function
    Next
    MsgBox "Лист с кодовым именем " & Cname & "  не найден", vbCritical
End Function
Возможно, это делается проще, но я другого способа не придумал...

Весь код будет выглядеть так:
Код:
Public Лист1 As Worksheet, Лист2 As Worksheet

Private Sub Workbook_Open()    'Макрос Запускается При Запуске Надстройки
    Set Лист1 = GetSheetByCodename("post_53728.xls", "КодовоеИмяЛиста1")
    Лист1.[a1] = 456
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
снятие пароля с книги/листа из другой книги? Bezdar Microsoft Office Excel 3 25.12.2008 11:59
Проблемы с пространствами имен z00m1e Общие вопросы C/C++ 0 29.10.2008 17:33
Вывод имен столбцов maxix БД в Delphi 2 29.09.2008 16:28
использование в макросе другой книги Роня Microsoft Office Excel 19 13.09.2007 15:47