Внутри цикла, как указать «все строки» при взятии среднего значения нескольких столбцов (Visual Basic) - PullRequest
0 голосов
/ 29 ноября 2011

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

Смысл цикла состоит в том, чтобы захватить эти средства в новом векторе.

Так что для каждого цикла мне нужно указать «все строки». В matlab это было бы легко, просто используйте ":" Но я не могу понять, какова аналогия с VB. Пожалуйста помоги! Спасибо.

(Пожалуйста, сообщите мне, что я положил в код ниже, где у меня есть ALLROWS ).

Моя попытка до сих пор:

   For i = 1 To CA
        mrCA11(i) = Application.WorksheetFunction.Average(revCA11(**ALLROWS**,i))
   Next i

В Matlab это будет:

   For i = 1:CA
        mrCA11(i) = mean(revCA11(:,i));
   Next i

РЕДАКТИРОВАТЬ: Я также попробовал этот трюк безрезультатно:

    For j = 1 To CA
        For i = 1 To s11
             temp11(i) = revCA11(i, j)
        Next i
        mrCA11(j) = Application.WorksheetFunction.Average(temp11)
    Next j

Я получаю сообщение об ошибке: «Невозможно получить свойство Average класса функций рабочего листа»

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Как все (по крайней мере, Тим и Шахкалпеш) указали, нам нужно понять, что такое revCall или, более конкретно, нам нужно понять, как вы хотите дать им ALL ROWS в качестве аргумента.

Поиск последней строки (или столбца или ячейки)

Распространенной проблемой Excel является поиск последней использованной строки / столбца / ячейки.
Это даст вам конец вашего вектора.

Excel дает вам несколько способов справиться с этим:

xlTypeLastCell

Последняя ячейка, использованная во всем листе (независимо от того, используется она в столбце А или нет)

lastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

End (xlUp)

Последняя использованная ячейка (включая пробелы между ними) в столбце A проста:

lastRow = Range("A" & Rows.Count).End(xlUp).Row

End (xlToLeft)

Последняя использованная ячейка (включая пробелы между ними) в строке 1 очень проста:

lastRow = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Row

UsedRange

Последняя ячейка, использованная в рабочем листе (согласно интерпретации Excel):

Set rangeLastCell = ActiveSheet.UsedRange

Использование массива в качестве аргумента

Приведенные выше методы объяснили вам, как найти последний ряд (если это то, что вам нужно). Затем вы можете легко создать свой вектор и использовать его в своей процедуре revCA11.

Вы можете либо указать массив в качестве аргумента , как Тим указал в своем ответе с помощью такого утверждения:

myArray = ActiveSheet.Range("A1", Cells(lastRow, lastColumn).Value

Или вы можете использовать целое число (или длинное), чтобы построить свой вектор внутри вашей процедуры так же просто, как объявить диапазон:

Range("A1:A" & lastRow)
1 голос
/ 29 ноября 2011

Вы можете уточнить, как именно revCA11 объявляется / создается, но, возможно, что-то в этом роде может работать для вас:

Sub Tester()

Dim arr, x
arr = ActiveSheet.Range("A1:D5").Value '2-D array

'average each column
Debug.Print "Columns:"
For x = 1 To UBound(arr, 2)
    Debug.Print x, Application.Average(Application.Index(arr, 0, x))
Next x

'average each row
Debug.Print "Rows:"
For x = 1 To UBound(arr, 1)
    Debug.Print x, Application.Average(Application.Index(arr, x, 0))
Next x

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...