Как сохранить ссылку на лист в объекте VBA?
Это будет казаться тривиальным для тех из вас, кто погружен в программирование объектов Excel, но это избило меня.
Раньше я делал следующее в vba Excel для восстановления активной таблицы перед выходом из подпрограммы.
sub foo() dim cursheet cursheet = ActiveSheet someOtherSheet.activate .... cursheet.activate end sub
Это прекрасно работает. Я попытался сделать что-то подобное с помощью объектов и после нескольких разных подходов написал следующее в новом классе проблемы …
'''''''''''''''''''''' ' sheet property '''''''''''''''''''''' Public Property Get sheet() As Worksheet Set sheet = psheet End Property Public Property Let sheet(Value As Worksheet) Set psheet = Value End Property Public Sub saveCursheet() Me.sheet = ActiveSheet End Sub Public Sub activateSheet() Me.sheet.Activate End Sub
В моем коде я вызываю методы таким образом …
Sub TallyQuizScore() Dim curStudent As Problem Set curStudent = New Problem curStudent.saveCursheet Worksheets("QuizTallies").Activate ... curStudent.activateSheet End Sub
Когда я пытаюсь выполнить curStudent.activateSheet, я получаю сообщение о том, что мне нужен объект. Поэтому я переработал код вызова и прошел через метод saveCursheet. Я вижу, что активная таблица хранится, но заметьте, что объект листа исчезает, как только я попал в строку свойств конца сеттера. Я не знаю, является ли это артефактом отладчика или если лист действительно перебрасывается, когда я нажимаю конец строки свойств, но что бы это ни было, объект исчезает, когда я пытаюсь его активировать, когда я закончил.
Удручающая вещь – это то, что я действительно хотел написать в моем абоненте, был curStudent.sheet = Activesheet
и curStudent.sheet.Activate
каким-то образом унаследовав встроенные методы работы, но это привело к тому, что у меня был клонированный код, поскольку я пытался заставить его работать.
Итак, три вопроса:
- Почему лист, который я сохранил в saveCursheet, исчез?
- Что мне нужно изменить, чтобы заставить код работать?
- Что мне нужно сделать иначе, чем описанный выше подход, чтобы сделать curStudent.sheet = Activesheet и его партнером, curStudent.sheet.Activate подход работать?
Вам нужна переменная уровня модуля для хранения значения, в то время как ваш код выполняет другие действия. Обратите внимание, что это личное.
Кроме того, как поймал ja72, в случае объектов это Set
, а не Let
:
UNTESTED:
Private m_Sheet as Worksheet Public Property Get Sheet() As Worksheet Set sheet = m_Sheet End Property Public Property Set Sheet(Value As Worksheet) Set m_Sheet = Value End Property Public Sub saveCursheet() Me.Sheet = ActiveSheet End Sub Public Sub activateSheet() Me.m_Sheet.Activate End Sub