2015-12-02 106 views
1

我試圖建立一個學校項目的數組,情況是這樣的:建立一個二維數組在Excel

你有一個城市,是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. 顯示與最佳值相鄰的所有位置的成本,以顯示結果的敏感度。

使用的公式是:

距離客戶(Di)=abs|x-xi|+|y+yi|

成本爲客戶(Ci)=1/2*Di*Vi *英尺

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

當你標註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-loops首先遞增計數器然後測試如果它超過了限制。

您不要再使用k直到行

di = Abs(Sheet3.Cells(1, x + 2) - loc(k, 1)) 

在這個階段kCust + 1 - 這比允許的最高標多一個,因此標超出範圍的錯誤。

在上下文中,我認爲你打算在該行和下一行中使用j而不是k。我不知道你的代碼是否有其他問題,但在這些行中刪除k應該有所幫助。

+0

謝謝你,我做了這些改變,並取得了一些進展。我現在有的是sheet3,我得到的值是填充的,但是它在上面列出了30個位置,它只輸入前20個結果,同樣沿着水平線輸入結果,列出20個結果,然後給出30個結果。 加上每一行的所有結果都是相同的,所以它的頂部都是0,然後是1.09319下一行,依此類推。 它似乎想要繼續下去,它顯示所有信息後再次給我一個下標超出範圍。 – rero360

+0

我想我到目前爲止正確的軌道上,我現在卡住它了,我的公式正在經歷第一個客戶端並將數據填充到數組中,但是當它嘗試去第二個客戶端時崩潰。 我該如何得到它,以便數組將運行第一個客戶端的所有計算,存儲該信息,爲第二個客戶端計算所有內容,將這兩個數據加在一起,存儲該數據,啓動第三個客戶端等,以及等到最後? – rero360