Страницы: 1 2 След.
RSS
Как не перебирать все условия, а выйти после первой ИСТИНЫ
 
Здравствуйте.

Как при первой же "ИСТИНЕ" в условии прекратить дальнейшие операторы цикла и уйти сразу же на следующий элемент коллекции в этом же цикле?
Цель: максимальная скорость макроса. Никаких лишних проверок и действий быть не должно.

P/S/ Надеюсь, тут изобилия "подколов" не будет про заданный диапазон и желание высокой скорости ))
Диапазон стоит для примера.
Код
Sub Макрос2()

    For Each Ячейка In Range("B1:B10")        
        If Ячейка.Cells.Value < -1000000000 Then Ячейка.Cells.NumberFormat = "0,,,В"
        If Ячейка.Cells.Value < -1000000 Then Ячейка.Cells.NumberFormat = "0,,М"
        If Ячейка.Cells.Value < -1000 Then Ячейка.Cells.NumberFormat = "0,К"
        If Ячейка.Cells.Value > 1000000000 Then Ячейка.Cells.NumberFormat = "0,,,В"
        If Ячейка.Cells.Value > 1000000 Then Ячейка.Cells.NumberFormat = "0,,М"
        If Ячейка.Cells.Value > 1000 Then Ячейка.Cells.NumberFormat = "0,К"
        If Ячейка.Cells.Value < 0 Then Ячейка.Cells.NumberFormat = "0"       
    Next
End Sub
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
ElseIf
 
Цитата
RAN написал:
ElseIf
и что после ?  
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
и что после ?  
А зачем? Просто, не сочтите за труд - почитайте, разберите пример.
 
Спсибо за ссылку. Но я, вроде, более-менее знаю работу циклов/условий. Посмотрел конечно. Ничего нового для себя не открыл, ответа не нашел. Плохо искал ?

Понимаю, читать, да еще и вникать в чужой код большой крутолом. Гораздо проще сказать: "Иди учись".
Но форум же называется "Вопросы по Microsoft Excel". А вопросы предполагают наличие ответов, а не советов идти учится. Хоть с вашей стороны и весьма культурных советов, за что вам отдельное спасибо.

___________________________________________________

Может кто-нибудь внятно и понятно всё-же дать ответ ? Пожалуйста.
Прежде чем сюда писать, трачу по несколько часов на поиск решения. И миллион вопросов сюда не попадает. Форум не засоряет. Но бывают, к огромному моему сожалению, исключения. Приходится всё-же умолять и выпрашивать...
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
А почему не воспользоваться другой более адекватной для этой задачи функцией? Первое условие удовлетворяет, остальные уже не проверяются.
Код
Sub пример()
  a = 9
   Select Case a
      Case Is > 5
            MsgBox "a больше 5"
      Case Is > 7
            MsgBox "a больше 7"
      Case Else
            MsgBox "Нет значений"
   End Select
End Sub
 
Спасибо большое. Сейчас попробую.
Что помнил издалека про "Case", но я ей особо как-то не пользовался. Быть может поэтому и не додумался привлечь её к труду.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Select Case и ElseIf работают аналогично. Проверка набора условий идет до первого выполнившегося.
Поэтому список условий рекомендуется составлять с учетом вероятности выполнения.
 
Цитата
Сергей Евдокимов написал:
Что помнил издалека про "Case"
в прошлой теме в явном виде писал вариант
Цитата
=ТЕКСТ(A1;"0,0"&ВЫБОР(ОТБР(LOG10(A1)/3)+1;"";" K";"  M";"   \B"))
в vba можно обойтись без логарифмов, только там потом выяснилось, что и 999999 должно быть 1М - или снова условия поменялись?
Цитата
Сергей Евдокимов написал:
Приходится всё-же умолять
ага, каждую тему вас просят начинать с файла - "что есть" и "что надо" - и что? - опять веселые картинки
Цитата
Сергей Евдокимов написал:
трачу по несколько часов на поиск решения
так выделите несколько минут на создание нормального примера, может и умолять не придется
Изменено: buchlotnik - 17.04.2021 10:08:34
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Светлый написал: А почему не воспользоваться другой более адекватной для этой задачи функцией? ...
Всё прекрасно получилось. Еще раз спасибо.

Цитата
buchlotnik написал: так выделите несколько минут на создание нормального примера
Отступлю от темы. Ибо вопрос же закрыт.

Вы, скорее, слышали когда-нибудь про 4 фундаментальных Закона логики. И конкретно про первый из них - Закон Тождества.
Дк вот наши с вами представления о "НОРМАЛЬНОМ ПРИМЕРЕ" - не являются тождественными. То бишь один из законов уже нарушается. А это означает, что любое умозаключение, к которому мы можем прийти в хоже наших совместных суждений - будет не достоверным.

Понимаете о чем я ?

Ну и насчет "выложить файл". Там 2 цифры в двух ячейках. Файл до сих пор даже у меня даже не сохранен. Он точно был нужен ? Человек с ником "Светлый" легко обошелся и помог без него.

P/S/ Давно уже заметил. Тем меньше сообщений у пользователя, тем меньше снобизма и пафоса. Говорю как есть. Без обид 😉
P/S/S Всем сорри за оффтоп.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
Он точно был нужен ?
2.3
Цитата
Сергей Евдокимов написал:
Ибо вопрос же закрыт.
тот же вопрос открыт в другой вашей теме, где было дано решение, причем с учетом дополнительных хотелок, только там вы не потрудились отписаться
Цитата
Сергей Евдокимов написал:
Говорю как есть
нарушая первый фундаментальный Закон логики
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
только там вы не потрудились отписаться
Ну это же не правда. Зачем вы так говорите ?

Там мое сообщение последнее. Вывод я для себя сделал: решения нет. И даже последовал совету  - "пишите макрос". Написал.
Тему открыл другую - потому что это и есть другая тема. И полностью другой вопрос по своей сути и содержанию.

Если вас чем-то задел, как-то действием или бездействием вдруг обидел - извините.
В любом случае, спасибо вам за участие...
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
Ну это же не правда. Зачем вы так говорите ?
затем что ваше последнее сообщение там
Цитата
Сергей Евдокимов написал:Округляем по мат.правилу, а следственно значит зреться будет должно как 1M
и номер оно имеет #28, а варианты решений даны в сообщениях #30, #32; но вам класть на время, которое тратят помогающие, главное самому не перетрудиться, файл ещё какой-то прикладывать - сами пусть делают и тестят...
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Сергей Евдокимов написал: Цель: максимальная скорость макроса.
См. сообщение №2. Select Case работает медленнее. Хотя  в читаемости кода выигрывает.

Теперь взгляд со стороны. Прошу воспринять не как нравоучение, а как предложение подумать.

О примере. Даже если ячейка-две - помогающим легче написать код в редакторе, чем "на коленке". И проверить работоспособность можно сразу.

Цитата
Сергей Евдокимов написал: читать, да еще и вникать в чужой код большой крутолом. Гораздо проще сказать: "Иди учись".
...а еще проще не разбираться, а обвинить помогающих в нежелании помогать. И, следуя Вашему высказыванию, Вам тоже "вникать в чужой код большой крутолом" (перефразируя - вникать в предоставленную информацию)

Вам дают удочку (ElseIf, ссылку) - почитать, самостоятельно разобраться.
"Ничего нового не нашел"... Да, бывает. Но где после этой фразы пример применения ElseIf, где попытки применения и уточняющие вопросы?
Вы о логике упомянули. Давайте логически: дана подсказка, попыток вникнуть не видно (не утверждаю, что их не было - о них никто, кроме Вас, не знает), но есть претензии "дайте ответ". Вывод: человек зашел за готовым решением, ему вникать нет желания. Опять же: не утверждаю, только наблюдение по сообщениям.

Цитата
А вопросы предполагают наличие ответов, а не советов
Часто советы - ответ на вопрос.
А подсказки, указание направления - тоже ответ, где искать решение. Решение, полученное собственными шишками на лбу, гораздо ценнее решения "на блюдечке"
 
Цитата
Сергей Евдокимов написал:
я, вроде, более-менее знаю работу циклов/условий.
Не льстите себе. Достаточно было бы прочитать, что прийти ElseIf конструкции
Код
Sub Макрос2()
 
    For Each Ячейка In Range("B1:B10")
        If Ячейка.Cells.Value < -1000000000 Then
            Ячейка.Cells.NumberFormat = "0,,,В"
        ElseIf Ячейка.Cells.Value < -1000000 Then
            Ячейка.Cells.NumberFormat = "0,,М"
        ElseIf Ячейка.Cells.Value < -1000 Then
            Ячейка.Cells.NumberFormat = "0,К"
        ElseIf Ячейка.Cells.Value > 1000000000 Then
            Ячейка.Cells.NumberFormat = "0,,,В"
        ElseIf Ячейка.Cells.Value > 1000000 Then
            Ячейка.Cells.NumberFormat = "0,,М"
        ElseIf Ячейка.Cells.Value > 1000 Then Я
            чейка.Cells.NumberFormat = "0,К"
        ElseIf Ячейка.Cells.Value < 0 Then
            Ячейка.Cells.NumberFormat = "0"
        End If
    Next
End Sub

Исходя из того, что в For VBA нет оператора Continue For, в отличие от For VB.Net. Всегда полезно начать со справочника, а не тратить кучу времени на ожидание.
 
Цитата
Андрей VG написал:
Не льстите себе. Достаточно было бы прочитать, что прийти ElseIf конструкции
Использовал ElseIf еще до того, как сюда написать. Вылазила какая-то ошибка. Понимаю их я крайне плохо. Победить не смог.
Признаю. Уделали...
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
vikttur написал:
Теперь взгляд со стороны. Прошу воспринять не как нравоучение, а как предложение подумать.
Да. Полагаю, вы правы.
Буду думать. Спасибо.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
GoTo или Exit For
Изменено: Marat Ta - 17.04.2021 13:11:16
 
Цитата
Marat Ta написал:
Exit For
самое то!!! остальные ячейки проверять не нужно, нашли одну и отлично!
Marat Ta,
как бы это по-мягче...
если подобные советы вы раздавали бы где -то на городской площади, то уходили бы домой далеко не в самой чистой одежде.
интернет, конечно гораздо более безопасное место с этой точки зрения)) тут и не такое можно написать (практически безнаказанно)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, ok
Изменено: Marat Ta - 17.04.2021 12:43:25
 
Цитата
vikttur написал:
См. сообщение №2. Select Case работает медленнее. Хотя  в читаемости кода выигрывает.
Замерил.
Объем числовых данных - 540 тысяч ячеек.

Макрос с "Case" - 5 минут 09 секунд
Макрос с "ElseIf" - 5 минут 14 секунд.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Цитата
Сергей Евдокимов написал:
Уделали...
И не стремился, стар уже для этого. Просто настаиваю, чтобы если уж высказывается некоторое утверждение, то необходимо быть готовым его доказать или хотя бы обосновать.
Цитата
Сергей Евдокимов написал:
Макрос с "Case" - 5 минут 09 секундМакрос с "ElseIf" - 5 минут 14 секунд.
На данном примере - вы разницу между Case и множественным If не почувствуете - тут основное время съедает постоянное обращение к ячейкам, поэтому расхождение в 5 секунд - это в пределах погрешности. Ну, или нужно выполнить хотя бы 5-7 запусков, набрать статистику, реально показывающую, что в основной массе запусков If или Case проигрывает, не забыв оценить меру достоверности такой гипотезы.
 
Цитата
Андрей VG написал:
поэтому расхождение в 5 секунд - это в пределах погрешности. Ну, или нужно выполнить хотя бы 5-7 запусков, набрать статистику, реально показывающую, что в основной массе запусков If или Case проигрывает, не забыв оценить меру достоверности такой гипотезы.
Совершенно ничего не утверждаю и не опровергаю. Замерил для себя. Поделился. Ни на какую истину не претендую. Ни с кем не спорю. Починяю примус...
Ежели у кого имеется потреба в истинно-точных цифрах - ради бога, сидеть придется с секундомером или в код его его писать. Да и выборку бы побольше, на пару порядков )
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Только сейчас заметил - код можно и сократить в 2 раза, сравнивая ABS(число).
Тогда и выигрыш в ускорении на 5 копеек при раннем выходе из проверки всех условий.
Изменено: Marat Ta - 17.04.2021 13:07:38
 
Цитата
Сергей Евдокимов написал:
Ни на какую истину не претендую
Ну и напрасно - это шаманский подход, а не инженерный :)
Вариант чуть пошустрее
Код
Public Sub FormatNumbers()
    Dim pFuncs As WorksheetFunction, vSign As Long
    Dim vData, i As Long, t As Single, vValue As Double
    Dim formats(0 To 3) As String, sFormat As String
    t = Timer
    formats(0) = "0"
    formats(1) = "0,К"
    formats(2) = "0,,М"
    formats(3) = "0,,,В"
    
    vData = Range("B2:B540000").Value
    Set pFuncs = Application.WorksheetFunction
    For i = 1 To UBound(vData)
        vValue = Abs(vData(i, 1))
        If vValue < 1 Then
            vSign = 0
        Else
            vSign = CLng(pFuncs.RoundDown(pFuncs.Log10(vValue), 0)) \ 3
        End If
        Cells(i + 1, 2).NumberFormat = formats(vSign)
    Next
    Debug.Print Timer - t
End Sub
 
Цитата
Андрей VG написал:
Вариант чуть пошустрее
Наверное, это крутой код, но заценить я его уже не способен. За неимением нужных извилин.
В любом случае, спасибо.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Сергей Евдокимов, почитайте тему https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=73664

В макросе Андрея, применение только массива - вместо прямого обращения к ячейкам диапазона повысит скорость в разы..... при большом диапазоне.
А ранний выход из условия дает совершенно мизерный выигрыш.
Изменено: Marat Ta - 17.04.2021 13:53:11
 
Цитата
Marat Ta написал:  Сергей Евдокимов , почитайте тему...
Спасибо. Ознакомлюсь.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Добрый день, Андрей, коллеги! #25 - отличный стенд для Алексея.
Владимир
 
Цитата
sokol92 написал:
отличный стенд для  Алексея
Привет, Владимир.
Ну, в таком случае можно попаразитировать на подходе Алексея. Сократив выполнение #25 с 67 секунд до 18.
Скрытый текст
Страницы: 1 2 След.
Наверх