powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
9 сообщений из 9, страница 1 из 1
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34173589
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли создать пользовательскую функцию типа {=MyFunction(A1:A5)}, возвращающую массив на рабочий лист, и если да – то как?
...
Рейтинг: 0 / 0
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34173598
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать имя текущего листа в макросе?
...
Рейтинг: 0 / 0
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34176687
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_Как узнать имя текущего листа в макросе?

klen_

Я не совсем поняла, кому вы задали свой вопрос?
...
Рейтинг: 0 / 0
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34188896
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34188903
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один из спорных моментов в приведенном примере - по какому диапазону создавать выходной массив - по диапазону-параметру или по по вызывающему диапазону
в примере сделано по диапазону-параметру в предположении, что его размер вызывающего массива ему соответствует.

Полагаю, что лучше было бы строить по вызывающему, дополняя лишние клетки соответствующими ошибками.
...
Рейтинг: 0 / 0
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34188916
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #34205620
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha, KL (XL) спасибо огромное за помощь. Проблему до конца не решила, но это связано с конкретикой моей задачи (формулировать условие задачи полностью сейчас не досуг, по-видимому, вернусь к ней после Нового года).
Victosha, низкий поклон за Application.Caller – это позволило мне решить важную часть проблемы.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #36414819
Херург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как написать аналог текстовой функции, которая сможет работать и со строкой и с массивом.

Например,
такая формула в 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
Excel. Можно ли создать свою функцию массива {=MyFunction(A1:A5)}
    #36417706
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Херург,

Используй FormulaArray

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


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