Вы упускаете точку свойства кодового имени.
Идея состоит в том, что он дает вам время компиляции , глобальный программный идентификатор проекта c, который вы можете использовать всякий раз, когда вам нужно обратиться к конкретному указанному c рабочему листу в ThisWorkbook
(рабочая книга, содержащая ваш код VBA).
Метод 1 не работает, поскольку выражение "mySheet" & myVar
оценивает значение String
, и вы пытаетесь Set
-присвоить эту строку в ссылку на объект Worksheet
. VBA не может прочитать ваши мысли здесь, он видит строку с правой стороны, переменную Worksheet
с левой стороны и не знает, что это значит.
Method2 создает локальную копию идентификатора, который уже является глобальным для проекта: он полностью избыточен и бесполезно сбивает с толку косвенное обращение, не делайте этого.
Method3 было бы лучше реализован как функция:
Public Function GetSheetByCodeName(ByVal value As String) As Worksheet
Dim sheet As Worksheet
For Each sheet In ThisWorkbook.Worksheets
If sheet.CodeName = value Then
Set GetSheetByCodeName = sheet
Exit Function
End If
Next
Err.Raise 9 '"subscript out of range", specified name was not found.
End Function
Тем не менее, принимая что-то, что проверено во время компиляции, и делая это во время выполнения, чувствует себя задом наперед. Это многогранный способ сделать что-то, потому что вы должны использовать этот идентификатор как .. идентификатор:
Sheet1.Range("SomeRange").Value = 42
Рабочие таблицы, которые существуют во ThisWorkbook
во время компиляции, не должны Нужны любые сложные логи c для извлечения - они прямо там .