2017-06-19 29 views
3

我想創建我的自定義類的數組,但它給了我這個錯誤:VBA:創建類模塊陣列

Run-time error '91':

Object variable or With block variable not set

這是到目前爲止我的代碼:

Sub DBM_Format() 

Dim coreWS As Worksheet 
Dim WS As Worksheet 
Dim LastRow As Long 
Dim RowRange As Long 
Dim dataList() As clsDBM 
Dim tmpdate As Date 

Set coreWS = Sheets(ActiveSheet.Name) 
'Set WS = Sheets.Add 


LastRow = coreWS.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).row 
RowRange = LastRow - 1 

Dim row As Integer 
ReDim Preserve dataList(RowRange) 
Dim i As Integer 
Dim tmpData As clsDBM 

For i = 0 To (RowRange - 1) 
    row = i + 2 
    tmpData.setDate = Format(Cells(row, 2), "MM/dd/yyyy hh:mm:ss") 
    tmpData.setBloodGlucose = Cells(row, 3) 
    tmpData.setCH = Cells(row, 4) 
    tmpData.setInzulinF = Cells(row, 5) 
    tmpData.setInzulinL = Cells(row, 6) 
    tmpData.setCategory = Cells(row, 8) 
    tmpData.setDayOfWeek = Weekday(dataList(i).pDate, vbMonday) 
    'dataList(i).setDate = Format(Cells(row, 2), "MM/dd/yyyy hh:mm:ss") 
    'dataList(i).setBloodGlucose = Cells(row, 3) 
    'dataList(i).setCH = Cells(row, 4) 
    'dataList(i).setInzulinF = Cells(row, 5) 
    'dataList(i).setInzulinL = Cells(row, 6) 
    'dataList(i).setCategory = Cells(row, 8) 
    'dataList(i).setDayOfWeek = Weekday(dataList(i).pDate, vbMonday) 

    Set dataList(i) = tmpData 
Next i 
End Sub 

和類模塊:

Option Explicit 

Public pDayOfWeek As Integer 
Public pDate As Date 
Public pBloodGlucose As Double 
Public pCH As Double 
Public pInzulinF As Double 
Public pInzulinL As Double 
Public pCategory As String 
Public Property Let setDayOfWeek(Value As Integer) 
    pDayOfWeek = Value 
End Property 
Public Property Let setDate(Value As Date) 
    pDate = Value 
End Property 
Public Property Let setBloodGlucose(Value As Double) 
    pBloodGlucose = Value 
End Property 
Public Property Let setCH(Value As String) 
    If IsNumeric(Value) Then 
     setCH = CDbl(Value) 
    Else 
     setCH = 0 
    End If 
End Property 
Public Property Let setInzulinF(Value As String) 
    If IsNumeric(Value) Then 
     pInzulinF = CDbl(Value) 
    Else 
     pInzulinF = 0 
    End If 
End Property 
Public Property Let setInzulinL(Value As String) 
    If IsNumeric(Value) Then 
     pInzulinL = CDbl(Value) 
    Else 
     pInzulinL = 0 
    End If 
End Property 
Public Property Let setCategory(Value As String) 
    If Value = "Something" Then 
     If Hour(pDate) < 9 Then 
      pCategory = "Something" 
     ElseIf Hour(pDate) < 11 Then 
      pCategory = "Something" 
     ElseIf Hour(pDate) < 14 Then 
      pCategory = "Something" 
     ElseIf Hour(pDate) < 16 Then 
      pCategory = "Something" 
     ElseIf Hour(pDate) < 19 Then 
      pCategory = "Something" 
     ElseIf Hour(pDate) < 21 Then 
      pCategory = "Something" 
     End If 
    Else 
     pCategory = Value 
    End If 

    pCategory = Value 
End Property 

所以我的類名是「clsDBM」我試圖填補這一陣列從whorksheet相應的數據。該表格格式良好,沒有空行,所以這不是問題,但我不知道什麼是...

有沒有辦法解決它,並使之發生(或應該我使用完全不同的方法:D)

在此先感謝!

回答

5

使用操作

Dim tmpData As New clsDBM 

因爲這種說法您使用的:Dim tmpData As clsDBM簡單地定義一個變量容器或佔位符,clsDBM用的Nothing默認值(也:Dim i as Integer創建一個空整數0一個默認值)。要創建一個類對象的實際實例,你需要New它。

3

要在Zsmaster擴大,這裏有一個完整的例子填補了5項數組與您的自定義類:

Private myCls(0 To 4) As myClass 
Private Sub Test() 
    Dim i As Integer 
    For i = 0 To 4 
     Set myCls(i) = New myClass 
    Next i 
End Sub 

在你的情況,你必須先從循環:

For i = 0 To (RowRange - 1) 
    row = i + 2 
    Set tmpData = New clsDBM 
    tmpData.setDate = Format(Cells(row, 2), "MM/dd/yyyy hh:mm:ss") 
    '... do stuff... 

    Set dataList(i) = tmpData 
Next i 

,或者忘了tmpdata僞對象,像這樣做:

For i = 0 To (RowRange - 1) 
    Set dataList(i) = New clsDBM 
    row = i + 2 
    dataList(i).setDate = Format(Cells(row, 2), "MM/dd/yyyy hh:mm:ss") 
    dataList(i). '...Do more stuff... 
Next i 
+0

的tempvariable通常是更好的。如果您使用多次數據(i)或TmpVariable,也不要忘記使用'with'語句。 –

+0

使用"與"聲明確實避免了額外的IO操作,是很好的做法。然而,temp變量消耗了額外的內存,並且比直接對數組工作的優化程度要低。使用Collection對象時,您會需要它。 –