Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2010, 17:26   #1
Hagen83
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 33
По умолчанию Подсчет серий положительных и отрицательных значений.

Добрый день.

Помогите, пожалуйста, никак не могу найти как подсчитать максимальное количество положительных и отрицательно-нулевых значений, идущих подряд.

Например, столбец -1, 0, -2, 4, 1, -2, -1, 2. Максимальная положительная серия равна 2 (4 и 1 подряд), максимальная нулевая-отрицательная серия - 3 (-1, 0 и -2 подряд).

Спасибо.
Hagen83 вне форума Ответить с цитированием
Старый 30.03.2010, 17:46   #2
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

пользовательская функция
Код:
Function serij(t As Range, l As Boolean)
    Dim cell As Range
    Dim s As Integer
    Dim k As Integer
    Dim res As Integer
    Dim it As Boolean
    For Each cell In t
        If l Then
            If cell > 0 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        Else
            If cell < 1 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        End If
    Next cell
    serij = res
End Function
если нужна формула спросите тут: http://www.planetaexcel.ru/forum.php?thread_id=12169
Dophin вне форума Ответить с цитированием
Старый 30.03.2010, 17:54   #3
Hagen83
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Dophin Посмотреть сообщение
пользовательская функция
Код:
Function serij(t As Range, l As Boolean)
    Dim cell As Range
    Dim s As Integer
    Dim k As Integer
    Dim res As Integer
    Dim it As Boolean
    For Each cell In t
        If l Then
            If cell > 0 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        Else
            If cell < 1 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        End If
    Next cell
    serij = res
End Function
если нужна формула спросите тут: http://www.planetaexcel.ru/forum.php?thread_id=12169
Спасибо, вообще я думал, что есть формула для этой задачи. Поищу в интернете как применять пользовательские функции и, если это будет удобно, воспользуюсь советом.
Hagen83 вне форума Ответить с цитированием
Старый 30.03.2010, 18:54   #4
peq
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 230
По умолчанию

Формула, конечно, тоже есть
Вложения
Тип файла: rar 1231.rar (6.3 Кб, 67 просмотров)
peq вне форума Ответить с цитированием
Старый 30.03.2010, 18:58   #5
Hagen83
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Dophin Посмотреть сообщение
пользовательская функция
Код:
Function serij(t As Range, l As Boolean)
    Dim cell As Range
    Dim s As Integer
    Dim k As Integer
    Dim res As Integer
    Dim it As Boolean
    For Each cell In t
        If l Then
            If cell > 0 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        Else
            If cell < 1 Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        End If
    Next cell
    serij = res
End Function
если нужна формула спросите тут: http://www.planetaexcel.ru/forum.php?thread_id=12169
Если не сложно, подскажите, пожалуйста, как исключить из выборки пустые ячейки, данная функция считает их положительными значениями. Спасибо.
Hagen83 вне форума Ответить с цитированием
Старый 30.03.2010, 19:05   #6
Hagen83
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 33
По умолчанию

Цитата:
Сообщение от peq Посмотреть сообщение
Формула, конечно, тоже есть
Спасибо, но с пользовательской формулой получается проще, так как нет дополнительных столбцов...
Hagen83 вне форума Ответить с цитированием
Старый 30.03.2010, 20:51   #7
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

а не отрицательными? (то есть меньше 1) :

Код:
Function serij(t As Range, l As Boolean)
    Dim cell As Range
    Dim s As Integer
    Dim k As Integer
    Dim res As Integer
    Dim it As Boolean
    For Each cell In t
        If l Then
            If cell > 0 And cell <> "" Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        Else
            If cell < 1 And cell <> "" Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        End If
    Next cell
    serij = res
End Function
Dophin вне форума Ответить с цитированием
Старый 30.03.2010, 21:56   #8
Hagen83
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Dophin Посмотреть сообщение
а не отрицательными? (то есть меньше 1) :

Код:
Function serij(t As Range, l As Boolean)
    Dim cell As Range
    Dim s As Integer
    Dim k As Integer
    Dim res As Integer
    Dim it As Boolean
    For Each cell In t
        If l Then
            If cell > 0 And cell <> "" Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        Else
            If cell < 1 And cell <> "" Then
                it = True
                If it Then
                    s = s + 1
                    If s > res Then res = s
                End If
            Else
                it = False
                s = 0
            End If
        End If
    Next cell
    serij = res
End Function
Вот! Это то, что надо. Очень выручили. Благодарю.
Hagen83 вне форума Ответить с цитированием
Старый 30.03.2010, 23:37   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот еще вариант для расширения кругозора
Код:
Function MaxPM(Rg As Range) As String
  Dim mi As Integer, ma As Integer
  Dim CurS As Integer, CurV As Integer
  For Each cl In Rg
    If cl > 0 Then
      CurV = 1
      If CurS < 0 Then
        If CurS < mi Then mi = CurS
        CurS = 0
      End If
    Else
      CurV = -1
      If CurS > 0 Then
        If CurS > ma Then ma = CurS
        CurS = 0
      End If
    End If
    CurS = CurS + CurV
  Next
  MaxPM = "*<=0* = " & -mi & ",   *>0* = " & ma
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 31.03.2010, 00:55   #10
kim2
Форумчанин
 
Регистрация: 23.03.2010
Сообщений: 101
По умолчанию

Да, насчет формулы, если Вы не идете в избушку - избушка идет к вам
Для положительных:
=МАКС(МУМНОЖ({-1;1};НАИМЕНЬШИЙ((A1:A100<=0)*(СТРОК А(A1:A100));ТРАНСП(СТРОКА(A2:A100))-{1:0}))-1)
Для отрицательно-нулевых:
=МАКС(МУМНОЖ({-1;1};НАИМЕНЬШИЙ((A1:A100>0)*(СТРОКА (A1:A100));ТРАНСП(СТРОКА(A2:A100))-{1:0}))-1)
Обе формулы массива.
A1:A100 - Ваш диапазон с числами.
kim2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Составить функцию для подсчета числа серий положительных, отрицательных чисел и нулей KASPEER Помощь студентам 0 13.01.2010 15:19
сумму положительных и отрицательных чисел матрицы Superlotles Помощь студентам 1 07.01.2010 11:11
Перепись положительных значений массива в динамический. reserved Общие вопросы C/C++ 4 10.06.2009 18:30
Найти максимальный из положительных элементов матрицы и сумму отрицательных элементов. bessonov12 Microsoft Office Excel 7 04.05.2009 05:44