Содержание
629 просмотра
2 ответа
8 Репутация автора
Поэтому я хочу сделать базовую функцию, которая принимает среднее значение, которое я выделяю в Excel. Я хорошо знаю, что в Excel уже есть встроенная функция для этого, но я пытаюсь использовать ее на практике.
Моя проблема в том, что я не уверен, как передать диапазон, а затем вызвать определенные элементы в диапазоне.
Ниже приведен псевдокод, с которым я играл. Я понимаю, что это может быть ужасно написано. Я новичок, и я просто хочу немного попрактиковаться.
Ответы (2)
1 плюс
102281 Репутация автора
Не используйте range в качестве переменной.
Затем вы можете использовать rows.Count или Columns.Count, чтобы получить экстент
Или вы можете сделать это — на самом деле нет необходимости перебирать количество ячеек, когда вы можете просто перебирать Each ячейки в rng.Cells коллекции. Я бы также изменил имя переменной с average (которая вводит в заблуждение) на что-то более описательное, например total :
В качестве бонуса этот последний метод будет работать и в двумерном диапазоне.
Обратите внимание, что при этом пустые ячейки будут обрабатываться как 0-значения ( AVERAGE функция рабочего листа игнорирует пустые ячейки, поэтому ваши результаты могут отличаться), и возникнет ошибка, если в диапазоне есть нечисловые значения.
1 плюс
51963 Репутация автора
Вы не можете предполагать, что a Range будет смежным, и при этом вы не можете предполагать, что a Range будет горизонтальным или вертикальным.
A Range — это набор объектов, поэтому вы итерируете его с For Each циклом для оптимальной производительности.
Предполагая, что функция предназначена для использования в качестве функции рабочего листа UDF, и, следовательно, она определена в стандартном модуле (.bas):
- Параметр передается ByVal и не назван в честь существующего типа ( Range ); нам не нужна ссылка на указатель диапазона, его копия достаточно хороша.
- Функция явно Public , и имеет явный тип возврата ( Variant ).
- Функция возвращает a Variant , чтобы вернуть Double результат в «счастливом пути», или соответствующее Error значение ( #Div/0! ), когда это применимо.
- Функция рассчитывает только числовые ячейки, что означает, что она работает, даже если target диапазон содержит значения ошибок. Закомментированный код выдает #VALUE! ошибку и возвращает ошибку, если встречается нечисловое значение.
То, как вы «проходите диапазон», является проблемой вызывающего абонента. Есть много способов сделать это — из формулы Excel:
Вы также можете использовать его в коде VBA:
1 noway [2016-02-16 20:05:00]
У меня есть процедура, которая принимает массивы. Таким образом, я могу передать массив вроде:
Проблема в том, что когда я хочу сделать это inline, как
Я получаю ошибку компиляции, говоря, что тип несоответствие: Массив или пользовательский тип ожидается.
Как я могу передать встроенный массив?
2 ответа
2 Andrea [2016-02-16 20:36:00]
Я использовал Excel 2013 для запуска кода VBA, и нет ошибки несоответствия типа. Например, с помощью sub:
Я получаю 1, 2, 3, 4, 5, 6, цифры, напечатанные в непосредственном окне (Ctrl + G)
1 Sobigen [2016-02-16 20:30:00]
Измените параметр массива из массива вариантов только в один вариант
пример
Функция в нормальном модуле (но не модуле класса) может возвращать массив, помещая () после типа данных.
Результат функции можно затем поместить в динамический массив того же типа или варианта. К элементам также можно получить доступ, используя второй набор скобок, однако это вызовет функцию каждый раз, поэтому лучше сохранить результаты в новом массиве, если вы планируете использовать их более одного раза
Обратите внимание, что возвращаемое на самом деле является копией массива внутри функции, а не ссылкой. Поэтому, если функция возвращает содержимое массива Static, его данные не могут быть изменены процедурой вызова.
Обычно это хорошая практика кодирования для аргументов процедуры как входных данных и для вывода через возвращаемое значение. Однако ограничения VBA иногда требуют, чтобы процедура выводила данные через аргумент ByRef .
Вывод в фиксированный массив
Вывод массива из метода класса
Выходной аргумент также может использоваться для вывода массива из метода / процедуры в модуле класса