在excel中构建一个2D数组

时间:2015-12-02 21:21:25

标签: arrays excel excel-vba vba

我正在尝试为学校项目构建一个数组,方案是:

你有一个30英里(y)乘20英里(x)的城市,每英里都有道路,必须编写代码,根据商业地点和交付货物的成本,为放置配送中心提供最佳位置每个人。

我有一些代码记录了客户端业务的数量,一个记录业务位置的数组,以及一个存储每个客户购买的产品量的数组。

我坚持认为,我认为我应该构建一个0到30,0到20(城市大小)的数组,但我必须根据用户定义的精度(.25, .5,1和2英里)所以我应该让数组能够存储120乘80个单元的计算值。

不确定这是否有意义,这是要求: 具体来说,您的程序应该能够完成以下任务:

  1. 读取客户数据和用户输入以进行分析解析。您的程序必须设计为 适应客户数量,位置和产品交付量的变化。分析解析的用户选项为:0.25英里,0.5英里,1英里和2英里。
  2. 验证用户输入是否为数字且有效。
  3. 分析所有可能的配送中心位置(可能与客户并置)的成本 位置),并确定最佳状态。
  4. 显示最佳配送中心位置的X和Y值以及相应的最小值 每周费用。可能有多个地点具有相同的最低费用。
  5. 显示与最佳值相邻的所有位置的成本,以显示结果的灵敏度。
  6. 使用的公式是:

    与客户的距离(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
    

    更新了,我已经构建了数组,但我需要弄清楚如何一次对一个单元格中的所有客户端进行计算,将每个客户端的结果加在一起并将它们的总和放入单元格中,然后进入下一个细胞。

1 个答案:

答案 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))

此阶段kCust + 1 - 比最高允许下标多一个,因此下标超出范围错误。

在上下文中,我认为您打算在该行和下一行中使用j而不是k。我不知道你的代码是否有其他问题,但在这些行中删除k应该会有所帮助。