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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2009, 22:19   #1
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
Стрелка Аналог continue в VBA

Делаю цикл For Each. Нужно провалиться на следующий элемент массива - аналогично continue в др. языках. Как сделать это?
motorway вне форума Ответить с цитированием
Старый 05.07.2009, 22:24   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

В VBA нет аналогичного оператора. Собственно, он и не нужен.
Приведите пример кода, и объясните, как он должен работать.

PS: Для выхода из цикла есть команда Exit For
Для более подробной информации ставим курсор на слово Each, и нажимаем F1
EducatedFool вне форума Ответить с цитированием
Старый 05.07.2009, 22:27   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Код:
...
For Each form In formula
...
frm=... 
' формула
    If (Trim(frm) = "") Then  здесь что-то должно быть
' если формула пустая, то перейти к анализу следующей
Range(...).Formula=frm;
...
В цикле формуле что-то присваивается. Если она пустая, то нужно перейти к следующей, если нет - написать в ячейку такую-то эту формулу. Код примерный

Последний раз редактировалось motorway; 05.07.2009 в 22:32.
motorway вне форума Ответить с цитированием
Старый 05.07.2009, 22:33   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
'...
For Each form In Formula
    '...
    'frm=...    ' формула
    If Len(Trim(frm)) Then
        'Range(...").Formula = frm
        ' и т.д.
    End If
Next form
EducatedFool вне форума Ответить с цитированием
Старый 05.07.2009, 22:41   #5
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

То есть, надо просто сделать проверку наоборот, если строка больше 0 символов, то все остальное?

Последний раз редактировалось motorway; 05.07.2009 в 22:45.
motorway вне форума Ответить с цитированием
Старый 05.07.2009, 22:46   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
А по-другому нельзя?
Можно. Но оператор Goto обычно стараются не применять.
Код:
Sub test()
    For Each form In Formula
        frm = "sdfsdsdfsdf"  ' формула
        
        If Trim(frm) = "" Then GoTo 1    ' аналог continue
        Range("a1").Formula = frm

        If xxx < 1 Then GoTo 1    ' аналог continue
        ' и т.д.
1:
    Next form
End Sub
Но лучше использовать вложенные IF-ы:
Код:
Sub test()
    For Each form In Formula
        frm = "sdfsdsdfsdf"  ' формула

        If Len(Trim(frm)) Then
            Range("a1").Formula = frm
            
            If xxx >= 1 Then
                ' и т.д.
            End If
        End If
    Next form
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 05.07.2009, 22:51   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Спасибо. Наверно, можно обойтись только положительными условиями, т.е. что-то делать, если только что-то выполняется. Тогда не надо будет делать continue. Т.е. не проверять, равна ли строка пустой, а просто: если больше 0, то ...
motorway вне форума Ответить с цитированием
Старый 05.07.2009, 22:54   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Наверно, можно обойтись только положительными условиями
Не обязательно.
Даже если у Вас не получается придумать "положительное" условие, можно работать и с отрицательными:
Код:
        If Not Trim(frm) = "" Then
            Range("a1").Formula = frm
            
            If Not xxx < 1 Then
                ' и т.д.
            End If
        End If
EducatedFool вне форума Ответить с цитированием
Старый 06.07.2009, 01:51   #9
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
оператор Goto обычно стараются не применять.
Игорь, а почему, поясни, пожалуйста?
valerij вне форума Ответить с цитированием
Старый 06.07.2009, 02:48   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от valerij Посмотреть сообщение
Игорь, а почему, поясни, пожалуйста?
Если хочешь узнать ответ на какой-либо вопрос, надо воспользоваться поиском.

Цитата с http://ru.wikipedia.org/wiki/GOTO
Цитата:
Критика

Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение нарушает иерархическую структуру программы и приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO»[1], который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность.

Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения, и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO аннулирует многие возможности компилятора по оптимизации управляющих структур, из-за чего исполняемый код становится медленней и объёмней[2].

Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный. Это нашло своё отражение при проектировании новых языков программирования. Например, GOTO был намеренно полностью запрещён в Java и Ruby. Вместе с тем, в Аде — одном из наиболее продуманных с точки зрения архитектуры языке за всю историю[3], GOTO всё же был оставлен.

Формально доказано, что применение GOTO не является обязательным (то есть не существует такой программы с GOTO, которую нельзя было бы переписать без этого оператора с полным сохранением функциональности). Одним из доводов против GOTO является то, что в некоторых случаях программисты ставят GOTO, чтобы быстрее достичь желаемого результата (написать фрагмент программы с определёнными свойствами), в то время как отсутствие GOTO заставило бы их провести более внимательный анализ задачи, который обычно приводит к получению более ясного, эффективного и лучше организованного кода.


Оправданное применение

Тем не менее, в практическом программировании применение GOTO в некоторых случаях можно считать допустимым. Поскольку GOTO — «простейший», «атомарный» оператор перехода, а все остальные являются «составными», производными от него, то применение GOTO допустимо и оправданно, когда другие средства языка не реализуют или недостаточно эффективно реализуют нужную функциональность.
К таким случаям можно отнести:

1) Выход из нескольких вложенных циклов сразу
2) Обработка ошибок
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог формулы СУММЕСЛИ на VBA bud-dy Microsoft Office Excel 7 03.02.2014 06:01
continue Neymexa Общие вопросы .NET 8 30.04.2009 13:35
Написать в VBA аналог формулы екселя. tae1980 Microsoft Office Excel 8 13.04.2009 00:08
Drag&Drop-continue. Icons MAcK Общие вопросы .NET 2 16.09.2008 12:59
bass.dll - ошибка - Use the step or run to continue. vitalik007 Общие вопросы Delphi 1 20.08.2007 19:59