Как я могу получить объект листа из определенной книги (не «ThisWorkbook»), используя кодовое имя листа? - PullRequest
0 голосов
/ 26 июня 2019

Я хочу получить объект листа из определенной книги, например так:

 Set ws = Application.Workbooks("WorkBookName.xlsm").Worksheets("sheet1")

Однако я хочу использовать кодовое имя рабочего листа, поскольку имя листа можно изменить. Например:

 Set ws = Application.Workbooks("WorkBookName.xlsm").Sheet1

Теперь я знаю, что это не работает, поскольку Sheet1 - глобальная переменная, созданная редактором VBA для удобства.

Я также знаю, что мог бы использовать индекс (то есть Рабочие листы (1)) для получения объекта рабочего листа, но если кто-то переместит рабочие листы в рабочей книге, функции не будут работать должным образом.

Итак, мой вопрос: как я могу получить объект рабочего листа из определенной рабочей книги (не «ThisWorkbook») и сохранить его в переменной, используя CodeName?

Вот пример кода (я очень новичок в публикации на stackoverflow.com):


Public Sub Main()

    ' Test Class
    Dim test As New StoreContestModel
    test.StoreID = "28"
    test.StoreName = "Kippersville"

    ' Other workbook
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim r As Range
    Dim v As String

    ' Showing test StoreID in other workbook. Code is broken up because as one-line it did not work.
    Set wb = Application.Workbooks("Contest.xlsm")
    Set ws = Application.Workbooks("Contest.xlsm").Sheet1 ' wb.Sheet1 didn't work
    Set r = ws.Range("N2")
    r.value = test.StoreID

End Sub

Я хочу, чтобы StoreID отображался в ячейке, указанной в другой книге. Однако я получаю эту ошибку:

Ошибка времени выполнения '438':

Объект не поддерживает это свойство или метод

1 Ответ

0 голосов
/ 26 июня 2019

Вы можете сделать что-то вроде этого:

Sub Tester()

    Dim ws As Worksheet

    Set ws = SheetFromCodeName(ActiveWorkbook, "Sheet1")

    Debug.Print ws.Name

End Sub

Function SheetFromCodeName(wb As Workbook, cn As String)
    Dim s, rv As Worksheet
    For Each s In wb.Worksheets
        If s.CodeName = cn Then
            Set rv = s
            Exit For
        End If
    Next s
    Set SheetFromCodeName = rv
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...