Полностью указать рабочий лист по кодовому имени

Когда я ссылаюсь на рабочие листы Excel с использованием свойства CodeName, как я могу полностью их квалифицировать, включая ссылку на рабочую книгу?

Я хочу защитить сценарий двумя открытыми книгами и двумя листами, имеющими одно и то же CodeName. Я использую ThisWorkbook, потому что я хочу ссылаться на книгу, из которой выполняется код.

Я представляю себе что-то вроде этого:

Dim tgWs As Worksheet
Set tgWs = ThisWorkbook.WsSummary
tgWs.Cells(1,1).Value = "Test"

где WsSummary - это кодовое имя листа.

Ответ 1

Ссылаясь на лист по его кодовому имени, всегда следует лист в ThisWorkbook, то есть книга, содержащая код, который вы выполняете.

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

Эта функция поможет вам сделать это:

Function GetSheetWithCodename(ByVal worksheetCodename As String, Optional wb As Workbook) As Worksheet
    Dim iSheet As Long
    If wb Is Nothing Then Set wb = ThisWorkbook ' mimics the default behaviour
    For iSheet = 1 To wb.Worksheets.Count
        If wb.Worksheets(iSheet).CodeName = worksheetCodename Then
            Set GetSheetWithCodename = wb.Worksheets(iSheet)
            Exit Function
        End If
    Next iSheet
End Function

Пример использования:

GetSheetWithCodename("Sheet1", Workbooks("Book2")).Cells(1, 1) = "Sheet1 in Book2"
GetSheetWithCodename("Sheet1", ActiveWorkbook).Cells(1, 1) = "Sheet1 in ActiveWorkbook"
GetSheetWithCodename("Sheet1").Cells(1, 1) = "Sheet1 in ThisWorkbook" 

Обратите внимание, что последняя строка эквивалентна просто:

Sheet1.Cells(1, 1) = "Sheet1 in ThisWorkbook" 

поскольку, как упоминалось выше, ссылаясь на лист по его кодовому имени, всегда подразумевается лист в ThisWorkbook.

Ответ 2

Вы можете сделать это, добавив вторую Рабочую книгу в качестве ссылки и вызовите книгу по названию проекта VBA.

Очевидно, что хорошая идея изменить название проекта VBA по умолчанию "VBAProject"!

Я проверил это, создав две новые книги, каждая с одним листом, со значением 1 или 2 в ячейке A1. Проекты VBA назывались "Proj1" и "Proj2", а CodeNames рабочих листов были оставлены как "Sheet1".

Это код, который я использовал:

Sub test()

    Debug.Print Proj1.Sheet1.Cells(1, 1)
    Debug.Print Proj2.Sheet1.Cells(1, 1)

End Sub

Выход выходного сигнала:

1
2

Ответ 3

Рабочие листы могут ссылаться на их кодовое имя, когда код находится в одной книге, поэтому полная квалификация не требуется. Вы не можете ссылаться на другой лист книг по кодовому имени напрямую, если вы не зацикливаете каждый лист и не проверяете кодовое имя

поэтому этого достаточно, не создавая переменную

with WsSummary
  .Cells(1,1).Value = "Test"
end with

Ответ 4

Dim wb as Workbook
Dim ws  as worksheet

Set wb = "Your Workbook full path and name"

For each ws in wb.worksheets
    If ws.codename = "Your Codename" then exit for
    next ws

Теперь ws будет содержать ссылку на лист в другой книге с нужным кодовым именем без каких-либо изменяемых пользователем зависимостей.

Надеюсь это поможет

Ответ 5

Sheet1.Cells(1, 1) = "Sheet1 in ThisWorkbook" без префикса ThisWorkBook отлично работает без дополнительных методов