2015-12-02 2 views
1

Я пытаюсь создать массив для школьного проекта, сценарий заключается в следующем:построение 2D массива в Excel

У вас есть город, который находится в 30 милях (у) на 20 миль (х) с дорог каждый мили, необходимо написать код, который дает лучшее место для размещения распределительного центра на основе местонахождения предприятия и стоимость доставки товаров каждому.

У меня есть один бит кода, который записывает количество клиентских предприятий, массив, который регистрирует местоположения предприятий, и массив, в котором хранится объем продукта, который покупает каждый клиент.

Где я застрял, думаю, я должен построить массив от 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

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, так как for-loops в VBA сначала увеличивают счетчик, а затем тестируют если он превысил лимит.

Вы не используйте k снова до линии

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

На данном этапе k является Cust + 1 - что один больше, чем максимально допустимый индекс, следовательно, индекс из ошибок диапазона.

В контексте, я думаю, вы хотели использовать j, а не k как в этой строке, так и в следующей строке. Я не знаю, есть ли у вашего кода другие проблемы, но избавление от k в этих строках должно помочь.

+0

Спасибо, я внес эти изменения, и я сделал некоторый прогресс. То, что у меня сейчас есть на sheet3, я получаю значения для заполнения, но там, где он перечисляет 30 позиций по вершине, он будет вводить результаты только для первых 20, а также по горизонтали, он отображает 20, а затем дает результаты для 30. Плюс все результаты для каждой строки одинаковы, поэтому все 0s все сверху, затем 1.09319 следующая строка вниз и т. Д. И т. Д. Кажется, что вы хотите продолжать движение, и это дает мне индекс вне диапазона снова после отображения всей этой информации. – rero360

+0

Я думаю, что нахожусь на правильном пути до сих пор, что я застрял в нем, мои формулы проходят для первого клиента и заполняют данные в массиве, но когда он пытается перейти ко второму клиенту, сбои. Как получить его так, чтобы массив выполнил все вычисления для первого клиента, сохранил эту информацию, вычислил все для второго клиента, добавил две суммы вместе, сохранил это, запустил третий клиент и так далее, так до конца? – rero360

Смежные вопросы