Меню Закрыть

Vba передача массива в функцию

Содержание

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! ошибку и возвращает ошибку, если встречается нечисловое значение.
Читайте также:  Ролики в 3 д формат

То, как вы «проходите диапазон», является проблемой вызывающего абонента. Есть много способов сделать это — из формулы 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 .

Вывод в фиксированный массив

Вывод массива из метода класса

Выходной аргумент также может использоваться для вывода массива из метода / процедуры в модуле класса

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.