2016-10-25 2 views
0

EDIT: Чтобы уточнить, приведенный ниже код находится внутри модуля, а UserForm содержится в его собственном коде.Excel VBA: ошибка компиляции: не найден метод или элемент данных

У меня есть следующий код. Когда я запускаю его, Excel бросает мне ошибку компиляции: Method or data member not found и выделяет следующий фрагмент кода: .showInputsDialog. Я не знаю, как решить эту ошибку.

Чтобы предоставить дополнительную информацию, подканал sportUserForm должен вызвать пользовательскую форму sportsUsrFrm. Любая помощь в этом вопросе очень ценится.

Option Explicit 

Sub sportUserForm() 

Dim sSport As String, sPreference As String 

If sportsUsrFrm.showInputsDialog(sSport, sPreference) Then 
    MsgBox "Your favorite sport is " & sSport & ", and you usually " _ 
      & sPreference & "." 
     Else 
    MsgBox "Sorry you don't want to play." 
End If 
End Sub 

Public Function showInputsDialog(sSports As String, sPreference As String) As Boolean 
Call Initialize 
Me.Show 
If Not cancel Then 
    If optBaseball.Value Then sSport = "Baseball" 
     ElseIf optBasketball.Value Then sSport = "Basketball" 
     Elss sSport = "Football" 
    End If 

    If optTV.Value Then sPreference = "watch on TV" _ 
     Else: sPreference = "go to games" 
    End If 

    showInputsDialog = Not cancel 
    Unload Me 
End Function 

UserForm код sportUsrFrm

Option Explicit 

Private Sub cmdCnl_Click() 
    Me.Hide 
    cancel = True 
End Sub 

Private Sub cmdOK_Click() 

    If Valid Then Me.Hide 
    cancel = False 
End Sub 

UserForm image

+0

Какой код в каком модуле? Все в пользовательской форме? Я бы предложил взглянуть на [этот пример] (http://stackoverflow.com/documentation/vba/5351/user-forms/19036/best-practices#t=201610252259347492268) в документации для лучшего подхода к обработке формы , – Comintern

+0

@Comintern Я отредактировал OP, чтобы отразить ваши вопросы. –

+0

Можете вы добавить код для 'sportsUsrFrm_Initialize'? – Comintern

ответ

1

Вы получаете ошибку, потому что showInputsDialog не является членом форме, он является членом модуля вы звоните это из. Вы также должны получать ошибки компилятора на этих двух строках ...

Call Initialize 
Me.Show 

... потому что вы, похоже, перепутали модуль и код формы.

Это говорит о том, что вы слишком задумываетесь об этом. UserForm является модулем класса и может быть сохранен в переменной (или в этом случае в блоке With) и может иметь свойства. Я бы добавить Cancelled свойство в виде:

'In sportsUsrFrm 
Option Explicit 

Private mCancel As Boolean 

Public Property Get Cancelled() As Boolean 
    Cancelled = mCancel 
End Property 

Private Sub cmdCnl_Click() 
    Me.Hide 
    mCancel = True 
End Sub 

Private Sub cmdOK_Click() 
    If Valid Then Me.Hide '<-- You still need to implement `Valid` 
End Sub 

А потом называют это так:

Sub sportUserForm() 
    With New sportsUsrFrm 
     .Show 
     Dim sSport As String, sPreference As String 
     If Not .Cancelled Then 
      If .optBaseball.Value Then 
       sSport = "Baseball" 
      ElseIf .optBasketball.Value Then 
       sSport = "Basketball" 
      Else 
       sSport = "Football" 
      End If 

      If .optTV.Value Then 
       sPreference = "watch on TV" 
      Else 
       sPreference = "go to games" 
      End If 
      MsgBox "Your favorite sport is " & sSport & ", and you usually " _ 
        & sPreference & "." 
     Else 
      MsgBox "Sorry you don't want to play." 
     End If 
    End With 
End Sub 
Смежные вопросы