Как сохранить ссылку на лист в объекте 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

каким-то образом унаследовав встроенные методы работы, но это привело к тому, что у меня был клонированный код, поскольку я пытался заставить его работать.

Итак, три вопроса:

  1. Почему лист, который я сохранил в saveCursheet, исчез?
  2. Что мне нужно изменить, чтобы заставить код работать?
  3. Что мне нужно сделать иначе, чем описанный выше подход, чтобы сделать 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 
Interesting Posts

VBA: Substitute () работает с строкой, но не по содержимому ячейки

Группируйте часы за днем ​​в сводной таблице правильно

Копирование диапазона ячеек (исключая пробелы) в одну ячейку

Макрос VBA не правильно вставлен

Target.count, вызывающий ошибку переполнения

Невозможно освободить объект Excel COM в .NET.

Хотите обновить веб-страницу после ввода значения в поле ввода с помощью vba

требуется сложный VBA для Excel, чтобы разделить несколько листов на многие другие, отфильтрованные по столбцам

Как автоматическое заполнение значения ячейки в слайке сетки при изменении другого значения ячейки

Поиск в Excel с использованием VBA

Фрагмент VBA, чтобы превзойти уведомление о макроопределении

Excel VBA copy-paste из исходной книги в многостраничную книгу

Alter Excel Display с Excel-документом

(C #) Могу ли я программно установить ячейку XLSX на изображение / изображение?

Как использовать javascript для открытия файла excel html в приложении excel

Давайте будем гением компьютера.