使用类的VBA中的错误91

时间:2014-01-12 11:26:31

标签: class vba

我目前正在尝试实施Clark& Wright在VBA中节省了Heurisitc,但我目前面临一些问题。我对VBA很新,这个错误(91)继续在类似情况下进行,这让我相信我缺少一些关键知识。接下来,我将向您介绍代码:

    Public Sub CWsavings()

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim aux As Integer
Dim d As Integer
Dim r As Integer


Dim Cu(200) As customer
Dim De(12) As Depot

For i = 1 To 200

    Set Cu(i) = New customer

    Cu(i).custID = i
     Cu(i).longitude = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 2)
     Cu(i).latitude = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 3)
     Cu(i).lt = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 4)
     Cu(i).et = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 5)
     Cu(i).weekdemand = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 6)
     Cu(i).peakdemand = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 7)
     Cu(i).D1 = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 8)
     Cu(i).D2 = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 9)
    Next i

For j = 1 To 12

    Set De(j) = New Depot

    De(j).depotID = j
    De(j).Dname = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 13)
    De(j).latitude = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 14)
    De(j).longitude = ThisWorkbook.Sheets("Folha1").Cells(i + 1, 15)
    De(j).ncust = ThisWorkbook.Sheets("Results").Cells(j, 7)
    De(j).nroute = 0

    For k = 1 To De(j).ncust
        aux = ThisWorkbook.Sheets("Results").Cells(j + 1, 10 + k)
       Call De(j).SetCustomer(Cu(aux), k)                              
    Next k

Next j

For d = 1 To 12


    Dim M(30, 30) As Double
    Dim maxsav As Double
    Dim maxpos(2) As Integer
    Dim connorder(676, 2) 'order of connections for routing
    Dim it As Integer

    it = 0

For i = 1 To De(d).ncust
    For j = 1 To De(d).ncust
      M(i, j) = CalcSavings(De(d), De(d).customer(i), De(d).customer(j))   ' error here
    Next j
Next i

itbegin:

    maxsav = 0
    maxpos(1) = 0
    maxpos(2) = 0


    For i = 1 To De(d).ncust
        For j = 1 To De(d).ncust
            If i <> j Then
                If M(i, j) > maxsav Then
                    maxsav = M(i, j)
                    maxpos(1) = i
                    maxpos(j) = j
                End If
            End If
        Next j
    Next i

    it = it + 1

    connorder(it, 1) = maxpos(1)
    connorder(it, 2) = maxpos(2)

    If it < De(d).ncust * De(d).ncust - ncust Then
        M(maxpos(1), maxpos(2)) = 0

        GoTo itbegin
    End If
Next d

End Sub

Public Function CalcSavings(d As Depot, C1 As customer, C2 As customer)

Dim id As Double
Dim dj As Double
Dim ij As Double

id = DeptDist(C1, d)
dj = DeptDist(C2, d)
ij = CustDist(C1, C2)

CalcSavings = id + dj - ij

End Function

课程仓库:

        Public depotID As Integer
Public Dname As String
Public latitude As Double
Public longitude As Double
Private customers(200) As customer
Public ncust As Integer
Private routes(500) As route
Public nroute As Integer

Public Sub addcust(C As customer)

    ncust = ncust + 1
    Set customers(ncust) = C

End Sub

Public Sub addroute(R As route)

    nroute = Me.nroute + 1
    Set routes(Me.nroute) = R

End Sub

Public Property Get customer(i As Integer) As customer

    customer = customers(i)

End Property

Public Sub SetCustomer(C As customer, i As Integer)

   Set customers(i) = C

End Sub

Public Property Get route(i As Integer) As route

    route = routes(i)

End Property

Public Sub SetRoute(R As route, i As Integer)

   Set routes(i) = R

End Sub

(类库更新)

班级客户:

Public custID As Integer
Public latitude As Double
Public longitude As Double
Public lt As Double
Public et As Double
Public weekdemand As Integer
Public peakdemand As Integer
Public D1 As Integer
Public D2 As Integer

我很抱歉这篇长篇文章,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

最终答案......

非常奇怪,(当你真正看到它时,不是很奇怪,但是)你甚至需要在你的Set属性中使用Get。我想这背后的原因是因为你正在返回一个对象,即使该对象可能已经存在,你也不会使用那个对象。使用副本而Set对于初始化该副本至关重要。

例如,这是“获得客户”的样子:

Public Property Get customer(i As Integer) As customer

    Set customer = customers(i)

End Property

我想这一切都有道理;你的数组是私有的,因此你不希望传递该数组中包含的确切对象,或者它是反逻辑的。


我想我又找到了......!

试试这个:

Public Sub SetCustomer(C As customer, i As Integer)

   Set customers(i) = C

End Sub

通知customer(i)已被customers(i)

取代

编辑:删除之前的答案,因为我主要是钓鱼。