powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пользовательская функция. Range
13 сообщений из 13, страница 1 из 1
Пользовательская функция. Range
    #39532094
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

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


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

Пользовательская функция работает.

Но как сделать так, чтобы можно было задавать прерывные диапазоны, например, одновмеренно A1:D1 и F1:G1?
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532119
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через ;
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532141
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FЧерез ;
Не работает. Если ставить точку с запятой, то будто задаем второй аргумент функции.
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532215
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на http://www.planetaexcel.ru нашел. еще одни скобки нужно =UserFunction1((A1:D1;F1:G1))
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532222
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergeyvgна http://www.planetaexcel.ru нашел. еще одни скобки нужно =UserFunction1((A1:D1;F1:G1))
Заработало! Спасибо!
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532249
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergeyvgеще одни скобки нужносейчас проверить нет возможности, но сдается мне, что в случае нескольких диапазонов простой .Count может "врать". Скорее всего нужен будет цикл по Areas переданного "рваного" диапазона:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39532314
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

Код: vbnet
1.
2.
3.
4.
5.
6.
Function RngCount(ParamArray rng() As Variant) As Long
Dim r As Variant
For Each r In rng
    RngCount = RngCount + r.Count
Next
End Function
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39533157
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyferzmikk,

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

Код: vbnet
1.
2.
3.
4.
5.
6.
Function RngCount(ParamArray rng() As Variant) As Long
Dim r As Variant
For Each r In rng
    RngCount = RngCount + r.Count
Next
End Function


Тогда получается, что прерывные диапазоны нужно вводить через точку с запятой. А если у функции не один аргумент, а несколько?
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39533352
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39536033
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за дополнительные варианты. Продолжу.

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

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

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

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

Подскажите, как это можно сделать?
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39536037
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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

...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39536103
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть задачку решать следующим образом?

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

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

Или это усложнит?
...
Рейтинг: 0 / 0
Пользовательская функция. Range
    #39536106
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И к функции добавить еще один аргумент. У функции будут три аргумента:
1. Количество дней для сдвига
2. Диапазон значений (включая игнорирующие ячейки)
3. Диапазон отметок. Если указано "да", то соответствующую ячейку из диапазона значений нужно игнорировать при суммировании и сдвигах.Учитывая, что при таком варианте аргументы это не массивы.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пользовательская функция. Range
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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