Необходимо написать пользовательскую функцию 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 и попробуйте проделать это, жаль что я не могу понять в чем беда того цыкла, он выводить только последнею строку матрицы...