Вызов 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 в середине процедуры довольно страшно. Я бы порекомендовал прочитать эту статью, которую я написал недавно - она ​​немного продвинутая, но очень стоит понять.

Другие вопросы по тегам