2012-12-29 23 views
1

我仍然有diffculty與此問題。我正在使用自定義類模塊:TimeFrame和TimeSheet。以下是縮短版本:對象不支持此屬性或方法錯誤的自定義類

_________________________ 
'TIMEFRAME CLASS MODULE 
'This class records Military Time, but allows 
'you to also display it in Civilian Time 
Private pHours As Integer 
Private pMinutes As Integer 
Private pTotalMinutes As Integer 

Public Property Get hours() As Integer 
    hours = pHours 
End Property 
Public Property Let hours(Value As Integer) 
    If Value >= 1 And Value <= 24 Then 
    pHours = Value 
    Else 
    Err.Raise 9009, , "Hours Value [" & CStr(Value) & "] is not valid." 
    End If 
End Property 
Public Property Get minutes() As Integer 
    minutes = pMinutes 
End Property 
Public Property Let minutes(Value As Integer) 
    If Value >= 0 And Value <= 59 Then 
    pMinutes = Value 
    Else 
    Err.Raise 9010, , "Minutes Value [" & CStr(Value) & "] is not valid." 
    End If 
End Property 

Public Property Let Initialize(str As String) 
    'This property expects a string formatted like: 08:30 
    Dim vhours As String 
    Dim vminutes As String 
    Dim arrTime() As String 

    If InStr(str, Me.Delimiter) Then 
    arrTime = Split(str, Me.Delimiter) 
    vhours = Trim(arrTime(0)) 
    vminutes = Trim(arrTime(1)) 
    If IsNumeric(vhours) Then 
     pHours = CInt(vhours) 
    End If 
    If IsNumeric(vminutes) Then 
     pMinutes = CInt(vminutes) 
    End If 
    Else 
    'Set to defaults 
    pHours = 0 
    pMinutes = 0 
    End If 
End Property 
... 

_____________________________ 
'TIMESHEET CLASS MODULE 
Private pEmployeeID As Integer 
Private pStartDate As Date 
Private pEndDate As Date 
Private pMonStart As TimeFrame 
Private pMonEnd As TimeFrame 
Private pMonBreak As Double 
Private pTuesStart As TimeFrame 
Private pTuesEnd As TimeFrame 
Private pTuesBreak As Double 
Private pWedStart As TimeFrame 
Private pWedEnd As TimeFrame 
Private pWedBreak As Double 
Private pThursStart As TimeFrame 
Private pThursEnd As TimeFrame 
Private pThursBreak As Double 
Private pFriStart As TimeFrame 
Private pFriEnd As TimeFrame 
Private pFriBreak As Double 
Public Property Get EmployeeID() As Integer 
    EmployeeID = pEmployeeID 
End Property 
Public Property Let EmployeeID(Value As Integer) 
    If Value > 0 Then 
      pEmployeeID = Value 
    Else 
     MsgBox "Employee ID " & Value & " is an incorrect value." & vbCrLf & "Employee ID must be a positive integer" 
    End If 

End Property 
Public Property Get StartDate() As Date 
    StartDate = pStartDate 
End Property 
Public Property Let StartDate(Value As Date) 
    pStartDate = Value 
End Property 
Public Property Get EndDate() As Date 
    EndDate = pEndDate 
End Property 
Public Property Let EndDate(Value As Date) 
    pEndDate = Value 
End Property 
Public Property Get MondayStart() As TimeFrame 
    Set MondayStart = pMonStart 
End Property 
Public Property Set MondayStart(ByRef Value As TimeFrame) 
    Set pMonStart = Value 
End Property 
Public Property Get MondayEnd() As TimeFrame 
    Set MondayEnd = pMonStart 
End Property 
Public Property Set MondayEnd(ByRef Value As TimeFrame) 
    Set pMonEnd = Value 
End Property 
Public Property Get MondayBreak() As Double 
    MondayBreak = pMonBreak 
End Property 
Public Property Let MondayBreak(Value As Double) 
    pMonBreak = Value 
End Property 
Public Property Get TuesdayStart() As TimeFrame 
    Set TuesdayStart = pTuesStart 
End Property 
Public Property Set TuesdayStart(ByRef Value As TimeFrame) 
    Set pTuesStart = Value 
End Property 
Public Property Get TuesdayEnd() As TimeFrame 
    Set TuesdayEnd = pTuesStart 
End Property 
Public Property Set TuesdayEnd(ByRef Value As TimeFrame) 
    Set pTuesEnd = Value 
End Property 
Public Property Get TuesdayBreak() As Double 
    TuesdayBreak = pTuesBreak 
End Property 
Public Property Let TuesdayBreak(Value As Double) 
    pTuesBreak = Value 
End Property 
... 

在我的主要模塊中,我打一個接一個地調用兩個子例程。

  1. 我有一個名爲TimeSheetCollection全程變量,它是一個集合包含類型的TimeSheet
  2. 首先我調用子程序ReadWeeklyTimeSheets(),其設置TimeSheetCollection對象的實例,在今天的mailitems讀取和從所獲得的值mailitem的主體我們在每個TimeSheet中設置屬性。這個子程序工作得很好。
  3. 接下來,調用名爲ExportTimeSheetsToDatabase()的子例程。我已經輸入幾個Debug.print聲明,我上Item.MondayStart和Item.MondayEnd性質的錯誤消息:「對象不支持此屬性或方法」

主要模塊:

Sub ExportTimeSheetsToDatabase() 
    Dim Item As TimeSheet 
    For Each Item In TimeSheetCollection 
    Debug.Print "TSCollection Count: " & TimeSheetCollection.count 
    Debug.Print Item.EmployeeID & ", " & Item.StartDate & ", " & Item.EndDate 
    Debug.Print Item.MondayStart '<<< Error occurs here 
    Debug.Print Item.MondayEnd 
    Debug.Print "Toal Hours: " & Item.TotalWeeklyHours 
    Next Item 
End Sub 

由於項目的類型是考勤卡,你可以從類模塊見上面,它幷包含Get方法:「」

Public Property Get MondayStart() As TimeFrame 
    Set MondayStart = pMonStart 
End Property 

從我研究的語法似乎正確的,當我輸入點運算符項目後,我的列表出現與所有屬性顯示。這不像我拼錯任何東西。請指教。

Alan Alan

+1

爲什麼你希望能夠打印'TimeFrame',它不是一個標準的數據類型。您需要處理'TimeFrame'對象並返回可打印的標準類型。 –

回答

2

Debug.Print對對象不起作用。您需要在返回標準數據類型的屬性或方法上使用它。否則,您將始終得到錯誤「對象不支持此屬性或方法」。

例如,你需要像TimeFrame.ValueTimeFrame.MilitaryValue

可能的實現:

Public Property Get Value() As String 
    'Returns TimeFrame TimeStamp as standard time 
    Value = CDate(pHours & ":" & pMinutes) 
End Property 

Public Property Get MilitaryValue() as String 
    'Returns TimeFrame TimeStamp as Military Time 
    MilitaryValue = Format(CDate(pHours & ":" & pMinutes),"hh:nn") 
End Property 

基於你的執行期限的它似乎是一個時間戳和持續時間。在這種情況下,使用標準的Date數據類型可能更有意義。日期數據類型精確到秒,您可以使用小時和分鐘功能提取特定的小時和分鐘信息。例如: Hour(timeStamp)Minute(timeStamp)

然後,您可以顯示一個簡單的debug.print時間如在我MilitaryValue例子將通過使用Format默認爲標準時間,但可能是軍用時間。

+2

艾倫,我建議你閱讀常見問題,尤其是提問部分:http://stackoverflow.com/faq#howtoask。 –

相關問題