Необходимо написать пользовательскую функцию MS Ехсеl

программирование excel VBA visual basic массив

Необходимо написать пользовательскую функцию MS Ехсеl, которой в качестве аргументов передаются диапазоны ячеек с исходными данными, записи элементов массива А размером n x n в одномерный массив в порядке следования столбцов.
Подскажите как это можно сделать, вот мой код

Function mas(A)
Dim numb As Integer, n As Integer, i As Integer, j As Integer
n = A.Rows.Count
n = A.Columns.Count
numb = Rows.Count
numb = 0
For i = 1 To n
For j = 1 To n
numb = numb + 1
Active.Cells(numb, 1) = A(i, j)
End Function

я не могу понять в чем проблема почему оно не хочет работать

Примечание:
Вот еще одна попытка решения данной функции, она у меня выводит только нижнею строку матрицы, причем выводит в начале одномерного массива:

Function mass(A)
Dim F() As Integer
Dim i As Integer, j As Integer

ReDim F(1 To A.Columns.Count)
For i = 1 To A.Columns.Count
For j = 1 To A.Rows.Count

F(j) = A(i, j)

Next j
Next i
mass = F
End Function

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

Как это реализовать?

Примечание:
И чем этот код отличается от моего?
Function mass(A)
Dim F() As Integer
Dim i As Integer, j As Integer

ReDim F(1 To A.Columns.Count)
For i = 1 To A.Rows.Count
For j = 1 To A.Columns.Count

F(i) = A(i, j)

Next
Next
mass = F
End Function

Примечание:
Жаль но эта тоже не хочет работать,

Function mass(A)
Dim F() As Integer
Dim i As Integer, j As Integer

ReDim F(1 To A.Columns.Count*A.Rows.Count)
For i = 1 To A.Columns.Count
For j = 1 To A.Rows.Count

F((i-1)*A.Rows.Count + j) = A(i, j)

Next j
Next i
mass = F
End Function

Заполняет одномерный массив нолями...

Примечание:
с синтаксисом могу ошибиться (под * подразумевал умножение). алгоритм теперь должен быть правильным.
У вас работает? я проверил синтаксис.. и еще раз рачками все переписал... выводит одномерный массив из нулей...

Примечание:
========================
дело в том, что я даже не знаю где там в Excel пользовательские функции писать. я лишь алгоритм подправил, он был неправильный... скорее всего где-то в синтаксисе проблема... Если подскажете где их там писать - попробую.
---------------------------------------------------------------------------------

Заходишь в Эсель нажимаешь alt+f11 и появляется окно, там вкладка модуль 1 или просто модуль, там и пишешь.... а потом проверить можно через вставить\функцию\ и имя функции...

Примечание:
Но синтаксис вроде вроде правильный, оно ошибку не выбивает, я не чего не вижу....

Примечание:
А видеть в результате что хотите?
---------------------
в результате хочу видит одномерным массив записанный выбраных мною ячейках

Примечание:
Пользовательская функция в Excel должна возвращать какое то значение. Т.е. код должен иметь вид:
Function ИмяФункции(Аргументы)
'Какие то вычесления
ИмяФункции = Какое-тоЗначение
End Function
Вы же пишите что функция должна возвращать массив, что есть unreal. Пользовательская функция тем и отличается от обычной функции VBA что она должна возвращать конкретное значение. Вот вы знаете хоть одну стандартную функцию, которая бы возвращала больше одного значения и обеспечивала бы вывод больше чем в одну ячейку? Другое дело, если нужно считать в массив и на основании этого массива что то посчитать. Но в таком случае массив не нужен т.к. расчет можно организовать простым обходом диапазона переданого в качестве аргумента функции. Поэтому, уточните что вы подразумиваете под "в результате хочу видит одномерным массив записанный выбраных мною ячейках". Непонятно
----------------------------------------------------------
Я хочу что бы матрицу
11 12 13
21 22 23
31 32 33
Функция преобразовывала в одномерный массив и записывала в диапазон ячеек выбранный пользователям, то есть вы выбираете в данном варианте 9 ячеек вызываете функцию вводе матрицу в функцию, например что я написал в примере... нажимаете сочетание клавиш ctrl+shift+enter, и получаете в задом диапазоне из 9 ячеек что вы определи раньше одномерный массив из матрицы что вы вели функцию, по моему примеру одномерный массив должен иметь видь: 11 12 13 21 22 23 31 32 33
Если вы считаете что это не возможно, тогда видите мой код из дополнения #1 и попробуйте проделать это, жаль что я не могу понять в чем беда того цыкла, он выводить только последнею строку матрицы...
Ответы:
ну во-первых 2 неправильно оформленных цикла (в конце тела цикла должно быть End For) во-вторых переменная numb зачем-то обнуляется после numb=Rows.Count - это как минимум
ну правильно, она крутит вложенный цикл присваивая F() кажный раз новую строку, но она перезаписывается ! циклы надо делать наоборот: первый (внешний) по строкам, внутренний - по столбцам
Function mass(A)
Dim F() As Integer
Dim i As Integer, j As Integer
tecolote, не, так тоже фигня будет... теперь вы каждый столбец в одну ячейку впихиваете... тоже самое, только в профиль
с синтаксисом могу ошибиться (под * подразумевал умножение). алгоритм теперь должен быть правильным.
У вас работает? я проверил синтаксис.. и еще раз рачками все переписал...  выводит одномерный массив из нулей...
========================
дело в том, что я даже не знаю где там в Excel пользовательские функции писать. я лишь алгоритм подправил, он был неправильный... скорее всего где-то в синтаксисе проблема... Если подскажете где их там писать - попробую.
А видеть в результате что хотите?
http://www.intuit.ru/department/office/vbaexcel/2/5.html - вот пример того, как пользовательской функции можно передать в качестве аргумента массив и, в случае необходимости, массив получить в качестве результата. Заковырка в типе Variant


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.