Ниже представлен вопрос, на который я отвечу сам, однако это вызвало серьезное разочарование для меня, и у меня возникло множество проблем с поиском его в Интернете, поэтому я размещение здесь в надежде спасти какое-то время & усилия для других, и, возможно, для себя, если я забуду это в будущем:
для VBA (в моем случае, MS Excel), то Public
декларации предполагается сделать переменную (или функцию), доступную по всему миру другими функциями или подпрограммами в этом модуле, а также в любом другом модуле.
Оказывается, это неверно, в случае с Forms
, и я подозреваю также, что в Sheets
, но я не проверил последний.
Короче говоря, следующий не будет создавать общественности, доступ к переменной при создании в Form
, и, следовательно, приведет к краху, говоря, что переменные bYesNo и dRate не определены в mModule1:
Публичные переменные не являются ДЕЙСТВИТЕЛЬНО публичными в VBA в формах
(inside fMyForm)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
Однако, если вы сделаете небольшое изменение ниже, все это будет работать нормально:
(inside fMyForm)
Private Sub SetVals()
bYesNo = Me.cbShouldIHaveADrink.value
dRate = CDec(Me.tbHowManyPerHour.value)
End Sub
(Presume the textbox & checkbox are defined in the form)
(inside mModule1)
Public bYesNo As Boolean`
Public dRate As Double
Private Sub PrintVals()
Debug.Print CStr(bYesNo)
Debug.Print CStr(dRate)
End Sub
mModule1
будет работать прекрасно и, предполагая, что fMyForm всегда называют первым, то к тому времени, PrintVals
процедуры выполняется, значение из текстового поля и флажка в форме будет должным образом быть захвачены.
Я, честно говоря, не могу понять, что думает MS с этим изменением, но отсутствие согласованности - это огромная зависимость от эффективности, изучающая идиосинкратии, подобные этим, которые настолько плохо документированы, что поиск Google в 2013 году для чего-то вероятного были вокруг в течение десятилетия или более, так сложно искать.
Модули Userform и Sheet являются объектными модулями: они не ведут себя так же, как обычный модуль. Однако вы можете ссылаться на переменную в пользовательской форме аналогично тому, как вы относитесь к свойству класса. В вашем примере ссылка на 'fMyForm.bYesNo' будет работать нормально. Если вы не объявили bYesNo как Public, он не будет видимым для кода вне формы, поэтому, когда вы сделаете его Public, он действительно отличается от негосударственного. –
Известно, что если вам нужны истинные общедоступные переменные, вам необходимо объявить их в модуле кода, а не в области кода формы/листа. См. Эту ссылку http://msdn.microsoft.com/en-us/library/office/gg264241.aspx 'Публичные переменные могут использоваться в любых процедурах в проекте. Если публичная переменная объявлена в стандартном модуле или модуле класса, ее также можно использовать в любых проектах, которые ссылаются на проект, в котором объявлена публичная переменная. ' –
Что касается последнего комментария', который так плохо документирован, что поиск Google в 2013 году для чего-то, что, вероятно, было около десятилетия или более, так сложно искать. Возможно, вы ищете неправильное ключевое слово? Попробуйте найти это в Google? 'msdn VBA объявляет публичные переменные';) –