2015-08-21 2 views
0

Я пытаюсь научить себя VBA писать некоторые мелочи. Я пытаюсь сделать что-то, что позволяет вам выбирать некоторые данные, а затем вычисляет среднее значение и дисперсию. Мой код выглядит следующим образом:Создание выделенного диапазона в массив и ведение дел с ним

Sub VarianceCalculator() 

    Dim k As Integer 
    Dim SelectedData As Range 
    Dim SelectedDataArray() As Variant 
    Dim Var As Double 
    Dim Mu As Double 

    On Error Resume Next  
     Set SelectedData = Application.InputBox("Select a range of data to be 
     calculated", Default:=Selection.Address, Type:=8)  
    On Error GoTo 0 

    SelectedDataArray = Range(SelectedData.Address)  
    k = UBound(SelectedDataArray)  
    Call VarianceCalculatorWithArray(SelectedDataArray, k)  
    MsgBox ("The selected data has variance " & Var & " and has mean " & Mu)   
End Sub 

Sub VarianceCalculatorWithArray(Data() As Variant, k As Integer) 

    Dim Var As Double  
    Dim Mu As Double  
    Dim j As Integer 
    Dim i As Integer 

    ReDim Data(k) As Variant 
    Mu = 0 
    Var = 0 
    For j = 0 To k 
     Mu = Mu + (Data(j))/(k + 1)  
    Next j 

    For i = 0 To k  
     Var = Var + ((Data(i) - Mu)^(2))/(k + 1)  
    Next i  
End Sub 

Я думаю, что ошибка в том, что каким-то образом данные не получает переданы в массив, но я не могу найти решение этой проблемы.

Спасибо!

+0

Вы пробовали пройти через код и проверить, что находится в ваших переменных? – Theresa

+0

Какая ошибка вы получаете и на какой строке. – MatthewD

+0

BTW, вот место для начала. Это даст вам общее введение. Не для deep.http: //www.excelvbatutor.com/vba_book/vbabook_ed2.pdf – MatthewD

ответ

0

Есть две основные проблемы:

(1) Если вы хотите передать переменные Var и Mu от одной процедуры к другой, вы должны будете объявить их как публичные переменные до первой процедуры. Альтернативой является настройка VarianceCalculatorWithArray как функции.

(2) Массив Data() является 2D как диапазон, состоящий из строк и столбцов. Итак, если вы хотите использовать элемент из этого массива, вам нужно будет указать его как Data(1, 1). Также обратите внимание, что этот массив массивов начинается с строк 1 и столбца 1. Поэтому ваши операторы for...next должны начинаться с 1, а не с 0.

Обратите внимание, что вы всегда можете установить контрольную точку, чтобы проверить, переданы ли данные в массив.

+0

Чтобы избежать предположения, что массив 'Data' индексируется с 0 или 1, вы всегда должны использовать' LBound() 'и' UBound() 'функции, которые проверяют нижнюю и верхнюю границы данного массива. В вашем случае это будет: 'Для j = LBound (data, 2) To UBound (data, 2)' – mielk

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