Полностью указать рабочий лист по кодовому имени
Когда я ссылаюсь на рабочие листы 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
отлично работает без дополнительных методов