2016-10-25 32 views
0

編集:明確にするために、以下のコードはモジュール内にあり、ユーザーフォームはすべてそのコードに含まれています。Excel VBA:コンパイルエラー:メソッドまたはデータメンバーが見つかりません

私は以下のコードを持っています。私が実行すると、Excelは私にコンパイルエラー:Method or data member not foundを投げ、次のコードをハイライトします:.showInputsDialog。私はこのエラーを解決する方法を知らない。

サブsportUserFormは、詳細情報を提供するために、ユーザーフォームsportsUsrFrmを呼び出すことになっています。この問題の助けを借りていただければ幸いです。 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は、フォームのメンバーではないので、あなたがエラーを取得しているため

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 

ユーザーフォームのコードでは、それはあなたが呼んでいるモジュールのメンバーですそれから。また、この2行でコンパイルエラーが発生するはずです...

Call Initialize 
Me.Show 

...モジュールとフォームコードが混ざっているようです。

つまり、あなたはこれを考えすぎています。ユーザーフォームはクラスモジュールであり、変数(またはこの場合はWithブロック)に格納することができ、プロパティを持つことができます。

'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 

をし、このようにそれを呼び出す:私は、フォームにCancelledプロパティを追加したい

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 
関連する問題