【问题标题】:building a 2D array in excel在excel中构建一个二维数组
【发布时间】:2015-12-02 21:21:25
【问题描述】:

我正在尝试为一个学校项目构建一个数组,场景是这样的:

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

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

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

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

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

要使用的公式是:

到客户(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

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

【问题讨论】:

    标签: arrays excel vba


    【解决方案1】:

    当你通过维度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 应该会有所帮助。

    【讨论】:

    • 谢谢你,我做了这些改变,我已经取得了一些进展。我现在在 sheet3 上获得要填充的值,但是它在顶部列出 30 个位置的位置,它只会输入前 20 个位置的结果,同样在水平方向上,它列出 20,然后给出 30 个结果。再加上每一行的所有结果都是相同的,所以顶部都是 0,然后是 1.09319 下一行,依此类推。它似乎想继续前进,在显示所有这些信息后,它又给了我一个超出范围的下标。
    • 我认为到目前为止我走在正确的轨道上,我现在坚持的是,我的公式正在为第一个客户端执行并将数据填充到数组中,但是当它尝试去第二个客户端它崩溃了。我如何得到它,以便数组将运行第一个客户端的所有计算,存储该信息,计算第二个客户端的所有内容,将两个数量加在一起,存储,启动第三个客户端等等到最后?
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2020-08-02
    • 2011-06-22
    • 2015-07-13
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多