Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Office Новый топик    Ответить
 Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
Здравствуйте!

Создал простую пользовательскую функцию:
Function UserFunction1(Rn As Range)
    UserFunction1 = Rn.Count
End Function

На листе в ячейке выбираем функцию "UserFunction1" и в аргументе задаем диапазон A1:D1.
=UserFunction1(A1:D1)
Пользовательская функция работает.

Но как сделать так, чтобы можно было задавать прерывные диапазоны, например, одновмеренно A1:D1 и F1:G1?

К сообщению приложен файл. Размер - 7Kb
6 окт 17, 12:24    [20847784]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
F
Guest
Через ;
6 окт 17, 12:52    [20847929]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
F
Через ;

Не работает. Если ставить точку с запятой, то будто задаем второй аргумент функции.

К сообщению приложен файл. Размер - 8Kb
6 окт 17, 13:06    [20847996]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
sergeyvg
Member

Откуда: Тольятти
Сообщений: 290
на http://www.planetaexcel.ru нашел. еще одни скобки нужно =UserFunction1((A1:D1;F1:G1))
6 окт 17, 14:06    [20848312]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
sergeyvg
на http://www.planetaexcel.ru нашел. еще одни скобки нужно =UserFunction1((A1:D1;F1:G1))

Заработало! Спасибо!
6 окт 17, 14:10    [20848331]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1590
sergeyvg
еще одни скобки нужно
сейчас проверить нет возможности, но сдается мне, что в случае нескольких диапазонов простой .Count может "врать". Скорее всего нужен будет цикл по Areas переданного "рваного" диапазона:
Function UserFunction1(Rn As Range)
    dim lcnt as long,ra as range
    for each ra in rn.areas
        lcnt = lcnt+ra.count
    next
    UserFunction1 = lcnt
End Function
6 окт 17, 14:22    [20848402]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
iMrTidy
Member

Откуда:
Сообщений: 552
ferzmikk,

Еще вариант без вторых скобок.

Function RngCount(ParamArray rng() As Variant) As Long
Dim r As Variant
For Each r In rng
    RngCount = RngCount + r.Count
Next
End Function
6 окт 17, 15:18    [20848696]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
iMrTidy
ferzmikk,

Еще вариант без вторых скобок.

Function RngCount(ParamArray rng() As Variant) As Long
Dim r As Variant
For Each r In rng
    RngCount = RngCount + r.Count
Next
End Function

Тогда получается, что прерывные диапазоны нужно вводить через точку с запятой. А если у функции не один аргумент, а несколько?
9 окт 17, 07:32    [20853363]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
iMrTidy
Member

Откуда:
Сообщений: 552
ferzmikk,

Если речь не о втором наборе диапазонов, то, например, так.

Option Explicit

Function RngCount(withinRange As Range, ParamArray rng() As Variant) As Long

Dim r As Variant

For Each r In rng
    RngCount = RngCount + Application.Intersect(withinRange, r).Count
Next

End Function
9 окт 17, 12:44    [20854173]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
Спасибо за дополнительные варианты. Продолжу.

Пусть функция теперь считает не количество, а суммирует значения выбранных диапазонов. Логика такая, что в функции диапазоны отбираются в одной строке.

В функции добавляю еще аргумент, который сдвигает выбранные колонки. Он будет как первый аргумент. А второй аргумент как выбор диапазонов.

Сдвиг должен быть таким образом, что игнорирует не выбранные диапазоны. В данном случае это колонки "P", "R" и "T". См. скриншот.

Если использовать функцию Offset, то не учтет не выбранные диапазоны.

Подскажите, как это можно сделать?

К сообщению приложен файл. Размер - 31Kb
13 окт 17, 14:36    [20867738]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
+
Option Explicit
Function UserFunction1(ColumnShift As Integer, ParamArray Rn() As Variant)
    Dim Sum As Integer, i As Integer, r As Range
    For i = LBound(Rn) To UBound(Rn)
        For Each r In Rn(i)
            Sum = Sum + r.Value
        Next
    Next i
    UserFunction1 = Sum
End Function


К сообщению приложен файл (Книга1.xlsm - 14Kb) cкачать
13 окт 17, 14:41    [20867764]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
Может быть задачку решать следующим образом?

Добавить строку отметок. И к функции добавить еще один аргумент. У функции будут три аргумента:
1. Количество дней для сдвига
2. Диапазон значений (включая игнорирующие ячейки)
3. Диапазон отметок. Если указано "да", то соответствующую ячейку из диапазона значений нужно игнорировать при суммировании и сдвигах.

См. скриншот.

Или это усложнит?

К сообщению приложен файл. Размер - 16Kb
13 окт 17, 16:22    [20868160]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательская функция. Range  [new]
ferzmikk
Member

Откуда:
Сообщений: 984
И к функции добавить еще один аргумент. У функции будут три аргумента:
1. Количество дней для сдвига
2. Диапазон значений (включая игнорирующие ячейки)
3. Диапазон отметок. Если указано "да", то соответствующую ячейку из диапазона значений нужно игнорировать при суммировании и сдвигах.
Учитывая, что при таком варианте аргументы это не массивы.
13 окт 17, 16:25    [20868170]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Office Ответить