2012-12-29 43 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。 –

相关问题