Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)} / 9 сообщений из 9, страница 1 из 1
04.12.2006, 07:58
    #34173589
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Можно ли создать пользовательскую функцию типа {=MyFunction(A1:A5)}, возвращающую массив на рабочий лист, и если да – то как?
...
Рейтинг: 0 / 0
04.12.2006, 08:12
    #34173598
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Как узнать имя текущего листа в макросе?
...
Рейтинг: 0 / 0
05.12.2006, 10:27
    #34176687
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
klen_Как узнать имя текущего листа в макросе?

klen_

Я не совсем поняла, кому вы задали свой вопрос?
...
Рейтинг: 0 / 0
11.12.2006, 02:42
    #34188896
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Function MySAdd(v As Range)
'пример функции массива. Добавляет 1 к каждому элементу
 Dim retArr
If v.Cells.Count >  1  Then
    Dim i As Long, j As Long
    'допустимый вызов с указанием диапазона только в качестве функции массива.
    'иначе возвратим N/A
    If CalledByArray Then
      ReDim retArr(v.Rows.Count -  1 , v.Columns.Count -  1 )   
    
      For i =  1  To v.Rows.Count
        For j =  1  To v.Columns.Count
            retArr(i -  1 , j -  1 ) = v(i, j).Value +  1 
        Next
      Next
      MySAdd = retArr
    Else
    'недопустимый вызов
      MySAdd = CVErr(xlErrNA)
    End If
Else
    MySAdd = v.Value +  1 
End If
End Function

Private Function CalledByArray() As Boolean
'первоисточник: http://www.tek-tips.com/viewthread.cfm?qid=1301663&page=6
'This function indicates whether the cell from which it was called was a single cell or
'part of an array (as in the use of array formulae).

If TypeName(Application.Caller) = "Range" Then
    CalledByArray = Application.Caller.Cells.Count >  1 
Else
    CalledByArray = False
End If
End Function
...
Рейтинг: 0 / 0
11.12.2006, 03:08
    #34188903
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
один из спорных моментов в приведенном примере - по какому диапазону создавать выходной массив - по диапазону-параметру или по по вызывающему диапазону
в примере сделано по диапазону-параметру в предположении, что его размер вызывающего массива ему соответствует.

Полагаю, что лучше было бы строить по вызывающему, дополняя лишние клетки соответствующими ошибками.
...
Рейтинг: 0 / 0
11.12.2006, 03:57
    #34188916
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
lena_####Можно ли создать пользовательскую функцию типа {=MyFunction(A1:A5)}, возвращающую массив на рабочий лист, и если да – то как?
А ничего особо делать и не надо:
Код: plaintext
1.
2.
Function MyFunction(ByRef rng As Range) As Variant
    MyFunction = rng
End Function

В этом случае формула =MyFunction(A1:A5) возвращает массив

Достаточно декларировать функцию как Variant (явно или по умолчанию) и присвоить ей результат ввиде массива или ранга.

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
17.12.2006, 13:42
    #34205620
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Victosha, KL (XL) спасибо огромное за помощь. Проблему до конца не решила, но это связано с конкретикой моей задачи (формулировать условие задачи полностью сейчас не досуг, по-видимому, вернусь к ней после Нового года).
Victosha, низкий поклон за Application.Caller – это позволило мне решить важную часть проблемы.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.01.2010, 20:47
    #36414819
Херург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Подскажите как написать аналог текстовой функции, которая сможет работать и со строкой и с массивом.

Например,
такая формула в excele работает нормально
{=СУММ((ПРАВСИМВ(D3:D60003;3)="АБВ")*(B3:B60003))}

Т.е. в функции ПРАВСИМВ параметром может служить и строка и массив.

У меня есть похожая текстовая функция описанная на VBA:
напрмиер,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function GetDataBySrc(Source As String, OutData As String)
  Dim Code
  If UCase(OutData) = "BNK" Then
    Code = UCase(Left(Source,  3 ))
  ElseIf UCase(OutData) = "CCY" Then
    Code = UCase(Right(Source,  3 ))
  End If
  GetDataBySrc = Code
End Function

Но при подстановке моей функции в формулу с массивом:
{=СУММ((GetDataBySrc(D3:D60003;"BNK")=A3)*(B3:B60003))}
, возникает ошибка.
...
Рейтинг: 0 / 0
19.01.2010, 12:22
    #36417706
Djon Player
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
Херург,

Используй FormulaArray

Например так:
Код: plaintext
Range("A5").FormulaArray = "=SUM(IF(R[-4]C:R[-2]C>1,R[-4]C:R[-2]C,0))"
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)} / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]