我正在尝试为学校项目构建一个数组,方案是:
你有一个30英里(y)乘20英里(x)的城市,每英里都有道路,必须编写代码,根据商业地点和交付货物的成本,为放置配送中心提供最佳位置每个人。
我有一些代码记录了客户端业务的数量,一个记录业务位置的数组,以及一个存储每个客户购买的产品量的数组。
我坚持认为,我认为我应该构建一个0到30,0到20(城市大小)的数组,但我必须根据用户定义的精度(.25, .5,1和2英里)所以我应该让数组能够存储120乘80个单元的计算值。
不确定这是否有意义,这是要求: 具体来说,您的程序应该能够完成以下任务:
使用的公式是:
与客户的距离(Di)=abs|x-xi|+|y+yi|
客户成本(Ci)=1/2*Di*Vi
(客户产品数量)* Ft
Ft = 0.03162*y+0.04213*x+0.4462
cost = sum Ci from 1 to number of clients
下面是我的代码到目前为止,我开始让它基本上构建数组并将其显示在第二张纸上,所以我可以想象它,但我不能在最终产品中拥有它。在调试它时,它会到达代码行di =
并给我一个超出范围的下标。
Option Explicit
Option Base 1
Sub load()
Dim Cust!, x#, y#, volume#(), n!, loc#(), i%, vol#, xi#, ci#, di#, j#
Dim choices#, val#(), nptsx!, nptsy!, Ft#, lowx!, lowy!, low!, M!
Dim costmatrix#(), npts!, cost!()
'find number of customers
Cust = 0
Do While Cells(8 + Cust, 1).Value <> ""
Cust = Cust + 1
Loop
If Cust < 2 Then
MsgBox "number of customers must be greater than 1."
Exit Sub
End If
'establist array of customer locations
ReDim loc#(1, Cust)
For j = 1 To Cust
x = Cells(7 + j, 2)
y = Cells(7 + j, 3)
Next j
ReDim volume#(Cust, 1)
For i = 1 To Cust
vol = Cells(7 + i, 4)
Next i
choices = Cells(3, 7).Value
nptsx = 30 / choices + 1
nptsy = 20 / choices + 1
'30x20 grid
ReDim costmatrix(x To nptsx, y To nptsy)
For x = 0 To nptsx - 1
Sheet3.Cells(1, x + 2) = x * choices
Next x
For y = 0 To nptsy - 1
Sheet3.Cells(2 + y, 1) = y * choices
Next y
For x = 0 To nptsx - 1
For y = 0 To nptsy - 1
For k = 1 To Cust
di = Abs(x * choices - Sheet1.Cells(7 + j, 2)) + Abs(y * choices - Sheet1.Cells(7 + j, 3))
Ft = 0.03162 * Sheet1.Cells(7 + j, 3) + 0.4213 * Sheet1.Cells(7 + j, 2) + 0.4462
ci = 1 / 2 * di * vol * Ft
Sheet3.Cells(x + 2, 2 + y) = ci
Next k
Next y
Next x
lowx = x
lowy = y
Range("I9:J:3").Clear
Range("I9") = "optimum"
Range("J9") = lowx * choices
Range("K9") = lowy * choices
Range("L9") = low
i = 9
If lowy < npts - 1 Then
i = i + 1
Cells(1, "I") = "Increment North"
Cells(1, "L") = cost(lowx, lowy + 1)
End If
If lowy > 0 Then
i = i + 1
Cells(1, "I") = "Increment South"
Cells(1, "L") = cost(lowx, lowy - 1)
End If
If lowx < npts - 1 Then
i = i + 1
Cells(1, "I") = "Increment East"
Cells(1, "L") = cost(lowx, lowy + 1)
End If
If lowx > 0 Then
i = i + 1
Cells(1, "I") = "Increment West"
Cells(1, "L") = cost(lowx, lowy - 1)
End If
End Sub
更新了,我已经构建了数组,但我需要弄清楚如何一次对一个单元格中的所有客户端进行计算,将每个客户端的结果加在一起并将它们的总和放入单元格中,然后进入下一个细胞。
答案 0 :(得分:0)
通过
标注loc#
时
ReDim loc#(Cust, 2)
第一个索引必须介于1和Cust
你有循环
For k = 1 To Cust
x = Cells(7 + k, 2)
y = Cells(7 + k, 3)
Next k
此循环运行后k
的值为Cust + 1
,而不是Cust
,因为VBA中的for循环首先递增计数器,然后测试它是否超出限制。
在
行之前,您不会再次使用k
di = Abs(Sheet3.Cells(1, x + 2) - loc(k, 1))
此阶段k
为Cust + 1
- 比最高允许下标多一个,因此下标超出范围错误。
在上下文中,我认为您打算在该行和下一行中使用j
而不是k
。我不知道你的代码是否有其他问题,但在这些行中删除k
应该会有所帮助。