2016-09-24 1 views
5

У меня есть переменные общедоступного рабочего листа, которые сначала инициализируются при открытии книги. У меня есть кнопка, которая делает это по существу:VBA Глобальные переменные больше не объявляются после удаления рабочего листа

Dim Response As Variant 

Response = MsgBox("Are you sure you want to delete this worksheet?", vbYesNo + vbExclamation, "Confirm Action") 
If Response = vbNo Then 
    GoTo exit sub 
End If 

'Save workbook prior to deletion as a precaution 
ThisWorkbook.Save 

ActiveSheet.Delete 

По какой-то причине после этого не работает, эти переменные рабочий лист больше не объявлено, и я должен переинициализировать их каждый раз. Я попытался добавить мой вызов макроса InitVariables после .Delete, и он все еще не работает.

Любая причина, по которой это может произойти?

ответ

9

Причина на самом деле очень проста: рабочий лист является классом в VBA, а его модуль кода компилируется вместе с остальной частью вашего проекта , даже если он пуст. Когда вы удаляете рабочий лист и прекращаете выполнение кода, при следующем запуске некоторого кода VBE должен перекомпилировать проект, потому что вы удалили модуль кода. Это приводит к тому, что пользовательские расширения классов теряют свое состояние.

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

Sheet1.foo = 42  'foo is a public variable in Sheet1 
Sheet2.Delete 
Debug.Print Sheet1.foo 'Prints 42 
+0

Я вижу. Есть ли способ, каким образом я могу вставить мой вызов InitVariables во время процесса перекомпиляции? – KingKong

+0

Невозможно перехватить вызов компиляции, и, конечно же, не из VBA. Что у вас есть в ваших глобалах? Если вы можете воссоздать их с помощью вызова «InitVariables», не проще ли просто вызвать его до запуска вашего кода? – Comintern

+0

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

3

Я только что протестировал его, используя Comintern foo. Интересно, что стандартный модуль foo потеряет его значение, но переменная public foo в модуле рабочего листа не теряет значения.

enter image description here

Смежные вопросы