Страницы: 1
RSS
Обратиться по CodeName к листу книги-не-ThisWorkbook, без проверок - напрямую
 
Добрый день.

Подозреваю, что вопрос наивен и не знаю элементарного (поиск не помог).
Но как самым простым образом обратиться по CodeName к листу книги, не являющейся ThisWorkbook?
Наподобие, как для ThisWorkbook это можно сделать коротко, при обращении к ячейке A1 так: ASheet1.[A1]

Конструкции типа ABook1.ASheet1.[A1] не работают, а каждый раз проверять через If sh.CodeName = "ASheet1" Then sh.[A1] .. - громоздко.
Изменено: vladjuha - 12.10.2016 07:16:19
 
Так?
Код
ThisWorkbook.Sheets("Ваше имя")
ThisWorkbook.Sheets(CodeName) ' с переменной
Изменено: Grr - 12.10.2016 07:38:48
 
Дело в том, что кодовое имя листа принадлежит VBAProject, а не книге. Поэтому и обращаться будем через VBAProject
   
Код
ActiveWorkbook.VBProject.VBComponents("Лист1").Activate
 
где Лист1 это кодовое имя листа. Попробуйте.
Я сам - дурнее всякого примера! ...
 
Grr, пишет ошибку ".. out of range..". Вряд ли возможно, что в коллекции Sheets перечисляются и name и codename - ведь они могут совпасть по написанию, коллизия-с.

kuklp, спасибо! Бум пробовать.
 
Только перебирая циклом листы книги, можно получить лист по CodeName
(напишите отдельную функцию, всего 4 строки кода)

Вариант с VBProject я не рассматриваю, так как не на всех компах будет работать (он требует включения галочки доступа к объектной модели, да и проект VBA файла не должен быть запаролен)
А функция простейшая, отработает моментально
Код
Function SheetByCodename(ByRef WB As Workbook, ByVal Codename$) As Worksheet
    On Error Resume Next: Dim sh As Worksheet
    For Each sh In WB.Worksheets
        If sh.Codename = Codename$ Then Set SheetByCodename = sh: Exit Function
    Next sh
End Function

Sub ПримерИспользования()
    Dim sh As Worksheet
    Set sh = SheetByCodename(ActiveWorkbook, "myname")
End Sub
 
Игорь,спасибо, сбылись, значиться мои наихудшие опасения :)
 
Цитата
vladjuha написал: Наподобие, как для ThisWorkbook это можно сделать коротко, при обращении к ячейке A1 так: ASheet1.[A1]
Если известно CodeName листа в книге с кодом, например, кодовое имя ASheet1, то ответ, вообще-то, есть в приведенной цитате: нужно так и записать: ASheet1.[A1] = 123 .
CodeName листа в VBE  (Alt-F11) в Object Browser (F2) отображается на объекте листа в круглых скобах после имени листа.
Что поменять CodeName нужно на объекте листа нажать F4 - откроется окно Properties, и записать кодовое  имя в поле (Name), которое вверху и в круглых скобках.
Изменено: ZVI - 12.10.2016 11:07:14
 
Если же речь об обращении к CodeName другой книги, то прямого метода нет - см. вариант Игоря
Изменено: ZVI - 12.10.2016 11:18:06
 
Да, спасибо ZVI, речь именно про обращение к CodeName другой книги, я излишне витиевато сформулировал вопрос.
Страницы: 1
Наверх