Вызов Sub в пользовательской форме
У меня довольно простой вопрос, на который я не могу получить однозначный ответ, поэтому задаю его здесь.
У меня есть пользовательская форма, которая работает. В этой форме есть функция. Код для командной кнопки работает отлично и вызывает функцию просто отлично. Я также могу нормально вызывать сабы из других модулей.
То, что я не могу сделать, это вызвать подпрограмму, которая также находится внутри формы. Как я уже сказал, функции работают нормально, если предваряются словом "я".
Это не работает для сабов, хотя. Я пытался сделать сабы частными, публичными, пробовал также Form и Frm. Если я запускаю его как "я", я получаю ошибку автоматизации, отмечая, что соединения вызываемого абонента потерпели неудачу. Если я запускаю его как "Форма", я получаю сообщение о том, что объект является обязательным.
Итак, мой вопрос... вы можете назвать подпрограммы, которые хранятся в той же форме? Я подумал, да, учитывая, что функции работают, но, похоже, это не так.
Причина, по которой я хочу получить их в форме, заключается в том, что при развертывании их пользователям не нужно также развертывать еще 10 других подпрограмм. Если бы я мог хранить их все в одной форме, это было бы полезно.
Спасибо
Вот часть кода, о котором я говорю. Profile1 - это подпункт, который я пытаюсь вызвать, который, как вы можете видеть, находится в той же форме. Как уже отмечалось, он вызывает функцию GetBoiler без проблем. Включил вызов в Profile2 только для демонстрации опций формы, которые я пробовал.
Private Sub CommandButton1_Click()
findStr = Me.ComboBox1.Value
Unload Me
If findStr = "Vendor1" Then Me.Profile1
If findStr = "Vendor2" Then Form.Profile2
If findStr = 'Vendor3" Then Me.GetBoiler (SigString)
End Sub
Function GetBoiler(ByVal sFile As String) As String
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
GetBoiler = ts.ReadAll
ts.Close
End Function
Private Sub Profile1()
Select Case Application.ActiveWindow.Class
Case olInspector
Set oMail = ActiveInspector.CurrentItem
Case olExplorer
Set oMail = ActiveExplorer.Selection.Item(1)
End Select
SigString = Environ("appdata") & _
"\Microsoft\Signatures\Profile1.htm"
1 ответ
Me
Квалификатор ссылается на текущий экземпляр класса, в котором вы находитесь (да, форма является классом) и предоставляет вам открытые члены этого объекта.
Profile1
является Private
, так что этот член не находится в открытом интерфейсе объекта, поэтому не будет отображаться в IntelliSense как член Me
,
Просто... не квалифицируй это:
If findStr = "Vendor1" Then Profile1
If findStr = "Vendor2" Then Profile2
GetBoiler
функция неявно Public
, Me
классификатор работ:
If findStr = "Vendor3" Then Me.GetBoiler (SigString)
За исключением того, что у вас есть функция, и вы используете ее как процедуру, т.е. вы отбрасываете ее возвращаемое значение. При вызове такой функции вам нужно убрать скобки:
If findStr = "Vendor3" Then GetBoiler SigString
В противном случае скобки заставляют вычислять выражение аргумента и передавать результат ByVal
независимо от того, что говорит подпись функции - здесь это говорит ByVal
во всяком случае, так что скобки являются чисто избыточными.
Вам нужны скобки, когда вы не отбрасываете возвращаемое значение функции:
MsgBox "Message", vbOkOnly
result = MsgBox("Message", vbOkCancel)
Видя, что Unload Me
в середине процедуры довольно страшно. Я бы порекомендовал прочитать эту статью, которую я написал недавно - она немного продвинутая, но очень стоит понять.