Excel vba не работает for

Sub Macro1()
Dim счетчик As Integer, sData As String, sNom As String, sFIO As String, sMT As String, sGOSNomt As String, sPric As String, sMesto As String, sVidRab As String, sNach As Date, sKon As Date, NewSheet
Dim sh As Worksheet
 
Set sh = ActiveSheet
With sh
For счетчик = 3 To 33 Step 1
If .Cells(счетчик, 1) = "x" Then
        Data = .Cells(счетчик, 2)
        sNom = .Cells(счетчик, 3)
        sFIO = .Cells(счетчик, 4)
        sMT = .Cells(счетчик, 5)
        sGOSNomt = .Cells(счетчик, 6)
        sPric = .Cells(счетчик, 7)
        sMesto = .Cells(счетчик, 8)
        sVidRab = .Cells(счетчик, 9)
        sNach = .Cells(счетчик, 10)
        sKon = .Cells(счетчик, 11)
    On Error Resume Next
        Set NewSheet = Sheets(sFIO)
        If NewSheet Is Nothing Then
            Sheets("412-АПК").Copy Before:=Sheets(Sheets.Count)
            Sheets("412-АПК (2)").Name = sNom
            Cells(8, 3) = sData
            Cells(3, 8) = sNom
            Cells(5, 7) = sFIO
            Cells(6, 12) = sMT
            Cells(7, 12) = sGOSNomt
            Cells(8, 12) = sPric
            Cells(12, 3) = sMesto
            Cells(12, 4) = sVidRab
            Cells(25, 11) = sNach
            Cells(27, 11) = sKon
        Else
            MsgBox "Лист с таким именем уже существует!", 48, "Ошибка!"
        End If
        End If
Next счетчик
End With
        
End Sub

Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.

Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.


For counter = start To end [ Step step ]

    [ statements ]

    [ Exit For ]

    [ statements ]

Next [ counter ]


For счетчик = начало To конец [ Step шаг ]

    [ операторы ]

    [ Exit For ]

    [ операторы ]

Next [ счетчик ]


В квадратных скобках указаны необязательные атрибуты цикла For… Next.

Компоненты цикла For… Next

Компонент Описание
counter Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла.
start Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика.
end Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика.
Step* Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла.
step Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.
Next [ counter ] Здесь counter — необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать.

*Если атрибут Step отсутствует, цикл For… Next выполняется с шагом по умолчанию, равному 1.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For… Next

Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.

Простейший цикл

Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:

Sub test1()

Dim i As Long

  For i = 1 To 10

    Cells(i, 1) = i

  Next

End Sub

Простейший цикл с шагом

В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:

Sub test2()

Dim i As Long

  For i = 1 To 10 Step 3

    Cells(i, 2) = i

  Next

End Sub

Цикл с отрицательными аргументами

Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:

Sub test3()

Dim i As Long

  For i = 0 To 9 Step 1

    Cells(i + 10, 3) = i + 10

  Next

End Sub

Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:

Sub test4()

Dim i As Long

  For i = 0 To 9 Step 3

    Cells(i + 10, 4) = i + 10

  Next

End Sub

Вложенный цикл

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

Sub test5()

Dim i1 As Long, i2 As Long

  For i1 = 1 To 10

‘Пятой ячейке в строке i1 присваиваем 0

    Cells(i1, 5) = 0

      For i2 = 1 To 4

        Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2)

      Next

  Next

End Sub

Выход из цикла

В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:

Sub test6()

Dim i As Long

  For i = 1 To 10

    Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _

    «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот»)

  Next

End Sub

Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».

Sub test7()

Dim i As Long

  For i = 1 To 10

    If Cells(i, 6) = «Крокодил» Then

      Cells(i, 7) = «Он съел галоши»

      Exit For

        Else

      Cells(i, 7) = «Здесь был цикл»

    End If

  Next

End Sub


Результат работы циклов For… Next из примеров:

Результат работы циклов For... Next из примеров

Результат работы циклов For… Next

Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.

Цикл с дробными аргументами

Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:

For i = 1 To 20 Step 2

For i = a To b Step c

For i = a 3 To 2b + 1 Step c/2  

В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:

‘Значения атрибутов до округления

For i = 1.5 To 10.5 Step 2.51

‘Округленные значения атрибутов

For i = 2 To 10 Step 3  

Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.


Создавал симуляцию блэкджека для одного игрока, но когда я запускаю, он возвращается с сообщением:

Ошибка компиляции

Далее без For

    For i = 1 To 5
    
        If win = "False" Then
            Range("C13").Select
            Selection.Insert Shift:=xlDown
            Range("B11").Select
            Selection.Copy
            Range("C13").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            
            With Selection.Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
            
            Range("C18").Select
            Application.CutCopyMode = False
            ActiveCell.FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
            Range("C19").Select
            ActiveCell.FormulaR1C1 = ""
            Range("H19").Select
    
            If Range("C18") < 22 And Range("C18") >= Range("B18") Then
                win = "True"
            End If
        
            If Range("C18") < 22 Then
                win = "Bust"
        End If
    Next i
    
    If win = "True" Then
        Application.Run "Dealer_wins"
    Else
        Application.Run "player_wins"
    End If
End Sub

3 ответа

Лучший ответ

Вам просто не хватало End If для теста на C18!

И я избавился от бесполезного .Select, поскольку это действительно ресурсоемкая команда, которая в большинстве случаев абсолютно не нужна!

    For i = 1 To 5

        If win = "False" Then
            Range("C13").Insert Shift:=xlDown
            Range("B11").Copy

            With Range("C13")
                .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                            :=False, Transpose:=False
                With .Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
            End With

            Application.CutCopyMode = False
            Range("C18").FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
            Range("C19").FormulaR1C1 = ""

            If Range("C18") < 22 And Range("C18") >= Range("B18") Then
                win = "True"
            End If

            If Range("C18") < 22 Then
                win = "Bust"
            End If
        End If
    Next i

    If win = "True" Then
        Application.Run "Dealer_wins"
    Else
        Application.Run "player_wins"
    End If
End Sub


3

R3uK
7 Дек 2015 в 12:49

Дополнительный вариант к уже предоставленным:

....

For i = 1 To 5
    If win = "False" Then
        With [C13]
            .Insert
            .Value = [B11].Value2
            With .Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
        End With
        [C18].Value = Application.Sum([C13:C17])
        [C19] = ""
        If [C18].Value2 < 22 And [C18].Value2 >= [B18].Value2 Then 'this condition shall be reviewed
            win = "True"
        ElseIf [C18].Value2 < 22 Then
            win = "Bust"
        End If
    End If
Next i
If win = "True" Then
    Application.Run "Dealer_wins"
Else
    Application.Run "player_wins"
End If

....

Также обратите внимание на эту строку вашего кода:

Range("C18") >= Range("B18")

Он всегда будет true, поэтому это условие может быть удалено из-за чрезмерной части кода или обновлено для сравнения [B18] с другой ячейкой.


0

Vasily Ivoyzha
7 Дек 2015 в 14:38

Вот почему между началом и концом элемента не должно быть больше 10-15 строк. Здесь For-Next.

Поскольку ваш отступ хороший (за это спасибо), другие комментаторы уже заметили ошибку в конце:

        If Range("C18") < 22 Then
            win = "Bust"
    End If
Next i

Которые должны быть

        If Range("C18") < 22 Then
            win = "Bust"
        End If
    End If
Next i

NB: восстановлен по требованию R3uK


-1

gazzz0x2z
7 Дек 2015 в 14:50

 

Nik021

Пользователь

Сообщений: 63
Регистрация: 24.02.2017

#1

01.08.2017 18:46:47

Добрый день.

Есть цикл for, в нем много условий и действие.
Я хочу, чтобы при определенном условии дальнейшие условия не проверялись вообще и переходить к следующему шагу.
Делать многоуровневые конструкции if else не хочется. При проверке каждого условия хочется быть уверенным, что предыдущие условия выдали положительный ответ.
Заранее спасибо.

Код
For i = 1 To 5
        
        q = False
        
        If 1 = 1 Then
            q = True
        Else
            If 1 > 2 Then
                q = True
            Else
                '   перейти к следующему шагу
            End If
        End If
        
        If 3 = 3 Then
            q = True
        Else
            '   перейти к следующему шагу
        End If
        
        
        If 5 = 6 Then
            q = True
        Else
            '   перейти к следующему шагу
        End If
        
        
        If q Then Debug.Print "выполняем действие"
        
    Next
 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Go to?
Еще может имеет смысл присмотреться к Select Case. Но не зная конечной цели сложно точно сказать, подойдет или нет.
ElseIf тоже никто не отменял.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

как может быть 1 > 2 и 5 = 6?

 

Nik021

Пользователь

Сообщений: 63
Регистрация: 24.02.2017

The_Prist,
Go to почему-то все настоятельно рекомендуют не использовать в циклах
Select Case не поможет в моей ситуации

В каждом условии буду вдобавок проверять результат предыдущего условия, пока так…  

 

Equio

Пользователь

Сообщений: 274
Регистрация: 05.05.2016

Continue For

https://msdn.microsoft.com/en-us/library/z6zekeaa(v=vs.100).aspx

Хотя это для VB. Не знаю, будет ли в VBA работать.

Update: Попробовал, не работает в VBA.

Изменено: Equio01.08.2017 19:36:30

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#6

01.08.2017 19:33:21

Цитата
Nik021 написал:
Select Case не поможет в моей ситуации

— как часто слышали это в разных вариантах :)

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#7

01.08.2017 19:38:16

Цитата
Nik021 написал:
Go to почему-то все настоятельно рекомендуют не использовать

значит не используйте, раз Вам так рекомендуют :) Я иногда использую. К слову, если бы это было совсем уж «неграмотно» — его бы не было и в более серьезных языках. Но он там есть. Главное использовать правильно, чтобы эти GoTo не не ломали читаемость кода и главное — были оправданы. Потому как некоторые пихают их там, где без них можно обойтись более чем.
Выбора за Вами.
По поводу Select Case — уже говорил. И Hugo прав — иногда за этим «не поможет» часто стоит просто незнание всех возможностей этой конструкции. Не более.
Да и в любом случае — не видя реальной задачи подсказать больше нечего.

Изменено: The_Prist01.08.2017 19:39:18

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Nik021

Пользователь

Сообщений: 63
Регистрация: 24.02.2017

The_Prist, я искал легкий способ прекратить дальнейшее выполнение кода и перехода к следующему шагу цикла, как, например, exit for (exit полностью завершает цикл, но вы поняли). Рас так просто нельзя, то буду использовать другие доступные варианты. Спасибо.

 

Влад

Пользователь

Сообщений: 1189
Регистрация: 24.12.2012

В таких случаях внутри цикла For…Next делается замкнутый Do…Loop с командой выхода в конце. Любое условие, при котором нужно перейти к следующему шагу Next, выполняет Exit Do.

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#10

01.08.2017 20:49:51

Цитата
Nik021 написал:
Select Case не поможет в моей ситуации

А мне кажется, что Select Case именно то, что Вам нужно.

 

Nik021

Пользователь

Сообщений: 63
Регистрация: 24.02.2017

Юрий М, Select Case, на сколько я помню, проверяет только числа, а строковые значение сравнивать не умеет или я что-то путаю уже.

Влад, а вот это уже интересная идея !)

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#12

01.08.2017 21:57:11

Цитата
Nik021 написал:
или я что-то путаю уже.

Или )

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#13

02.08.2017 08:59:56

Цитата
Nik021 написал:
на сколько я помню, проверяет только числа

что-то Вы не то помните. Эта конструкция принимает не просто и числа и текст, но и очень такие выражения в качестве условий, для которых в If … then надо будет городить доп.условия.
Идея с Do .. Loop не очень хорошая. Делать цикл только ради того, чтобы перескочить к концу другого цикла — это уже перебор. Уж в таких случаях куда оправданнее будет тот же GoTo, чем Exit Do в тех же места, не считаете?

Изменено: The_Prist02.08.2017 09:03:02

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Влад

Пользователь

Сообщений: 1189
Регистрация: 24.12.2012

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#15

02.08.2017 13:07:26

Цитата
Влад написал:
Не перевариваю GoTo

Это выбор каждого :) И если мне приведут вменяемое обоснование, чем он так плох — может тоже не буду использовать. Пока что не нашел причин отказываться от него совсем, особенно в ситуациях, где с ним процедура намного лаконичнее, читабельнее и быстрее, чем без него.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#16

02.08.2017 14:40:01

и тем более GOTO логически и визуальнео очень органично встраивается в представленнй макрос
достаточно заменить комментарии ‘   перейти к следующему шагу на GOTO Метка, а саму метку поставить перед Next

Скрытый текст

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#17

02.08.2017 14:51:01

Цитата
Ігор Гончаренко написал:
логически и визуальнео очень органично встраивается

тоже сделает ElseIf конструкция без всяких гот и меток ;)

Я сам — дурнее всякого примера! …

Ячейке мы присваиваем формулу созданную следующим образом «=C» & CStr(i) & «+E» & CStr((n — i) + 2). Знак & — «склеивание» символов, строк. В результате у нас получится формула «=Сn+E((n — i) + 2)» где n = 21, i — счетчик.
Страшно? Это только кажется 🙂

Все. После выполнения макроса мы получим следующий столбец (выделен), а в каждой ячейке формула:

Пример 2
Теперь рассмотрим цикл с указанным шагом. После расчета прошлого макроса мы получили три столбца, теперь нам необходимо из столбца E вычесть D, в столбец F вывести формулы вычитания. Код макроса следующий:

Sub Цикл_For_с_шагом()
Const n = 21
For i = n To 2 Step -1
Cells(i, 6) = «=E» & CStr(i) & «-D» & CStr(i)
Next i
End Sub

В данном случае все тоже самое, только цикл теперь «бежит» не от 2, а от 21 до 2 с шагом (Step) -1.
Результат выполнения получим следующий:

Цикл For, в VBA, является не единственным циклом. В дальнейшем будут рассмотрены еще пара вариантов циклов, без которых не обойтись при написании макрокоманд в Excel.

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

таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).

Стандартный набор функций Excel не поддерживает ничего похожего на циклы, однако выход нашелся – использование циклических ссылок и итераций.

Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:

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

!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».

Рассмотрим пример использования итеративных вычислений в виде цикла.

Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:

Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:

Как видите, каждый этап итерации (новое значение А1) добавляется к ячейке B1 до тех пор пока происходят итерации.

!Замечание: Возможно, результат в B2 будет не таким – для того, чтобы исправить это сделайте следующее: после ввода формулы в ячейку B1 перейдите в ячейку A1, установите курсор в поле редактирования формулы и нажмите Enter – произойдет пересчет итераций. Для корректной работы итераций необходимо задать ряд дополнительных условий, ограничивающих их количество и задающее условие сброса текущего значения поля в исходное значение. Пересчет всех ячеек с циклическими ссылками происходит каждый раз при изменении ячеек, от которых они зависят.

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

Далее мы подробно рассмотрим каждый из этих циклов.

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

Правила перепечаткиЕще больше уроков по Microsoft Excel

Оцените качество статьи. Нам важно ваше мнение:

Добрый день!
Неделю пытаюсь разобраться с макросами в Excel — выходит признаюсь честно плохо…
Решение задачи так и не нашла. Надеюсь вы сумеете мне подсказать куда конкретнее направить свою активность.

Задача передо мной стоит такая:

ячейка A1 содержит значение, которое я с помощью формул разбиваю на диапазон ячеек (задействовано 276 ячеек) целыми числами. Но при разбивке образуется дельта округления. Так вот мне необходимо эту дельту целыми числами доразнести в уже заполненные формулами ячейки например по порядку.
Например если дельта = 117, а диапазон 276, то в первые 117 ячеек прибавляем по 1, а остальные не трогаем.

Подскажите, пожалуйста, возможно ли вообще это описать для Excel?

VBA Excel. Цикл For… Next

Цикл For. Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For. Next.

Цикл For. Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each. Next.

Синтаксис цикла For. Next

В квадратных скобках указаны необязательные атрибуты цикла For. Next.

Компоненты цикла For. Next

*Если атрибут Step отсутствует, цикл For. Next выполняется с шагом по умолчанию, равному 1.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For. Next

Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.

Простейший цикл

Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:

Простейший цикл с шагом

В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:

Цикл с отрицательными аргументами

Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:

Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:

Вложенный цикл

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

Выход из цикла

В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For. Next:

Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».

Результат работы циклов For. Next из примеров:

Результат работы циклов For. Next

Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For. Next.

Цикл с дробными аргументами

Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:

В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:

Циклы в VBA

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

К циклам VBA относятся:

Далее мы подробно рассмотрим каждый из этих циклов.

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

В приведённом примере условие iFib_Next

Все циклы VBA в одной статье

Рамакришна, Источники индийской мудрости

Сейчас … мы идем по кругу

Эта статья содержит полное руководство по VBA Do While и VBA While Loops. (Если вы ищете информацию о циклах VBA For и For Each, перейдите сюда)

Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.

Для быстрого ознакомления с этими циклами перейдите к таблице быстрого руководства ниже.

Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.

Краткое руководство по VBA While Loops

Ниже приведены примеры условий

Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.

В следующей таблице показано, как «=» используется в условиях и назначениях.

Формат цикла Do

Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу. Однако в каждом из этих четырех способов есть только небольшая разница.

Do всегда в начале первой строки, а Loop всегда в конце последней строки.

Мы можем добавить условие после любой строки.

Условию предшествует While или Until, которое дает нам эти четыре возможности

Давайте посмотрим на некоторые примеры, чтобы прояснить это.

Примеры цикла Do

Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.

В этом случае цикл For не подойдет, поскольку вы не знаете, сколько элементов будет вводить пользователь. Пользователь может ввести пустую строку первым или с сотой попытки. Для этого типа сценария вы бы использовали цикл Do.

Следующий код показывает это

Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.

Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.

Когда условие находится в строке Do, цикл может вообще не работать. Так что он будет работать ноль или более раз.
Когда условие находится на линии Loop, цикл всегда будет запущен хотя бы один раз. Так что он будет запущен один или несколько раз.

В нашем последнем примере условие находится в строке Loop, потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «н».

В приведенном выше примере оба цикла будут вести себя одинаково.

Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.

Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.

While против Until

При использовании Do Loop условию должно предшествовать Until или While.

Until и While, по сути, противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.

  • Оставьте одежду, пока не пойдет дождь
  • Оставь одежду, пока не идет дождь
  • Оставайся в постели, пока не станет светло
  • Оставайся в постели, пока темно

Еще один пример:

  • повторять, пока число не станет больше или равно десяти
  • повторить пока счет меньше десяти

Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.

Примеры Until и While

Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.

Примечание: знаки <> означают «не равно».

  • Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
  • Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.

Пример: проверка объектов

Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.

Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.

Противоположностью Nothing не является Nothing, что может сбить с толку.

Представьте, что у нас есть две функции: GetFirstWorkbook и GetNextWorkbook, которые возвращают некоторые объекты книги. Код будет печатать имя рабочей книги до тех пор, пока функции больше не вернут действительную рабочую книгу.

Вы можете увидеть пример кода здесь:

Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing

Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.

Цикл Exit Do

Мы можем выйти из любого цикла Do с помощью оператора Exit Do.

Следующий код показывает пример использования Exit Do

В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».

While Wend

Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.

Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».

Формат цикла VBA While Wend

Цикл VBA While имеет следующий формат:

While Wend против Do

Разница между циклами VBA While и VBA Do заключается в следующем:

  1. While может иметь условие только в начале цикла.
  2. While не имеет версии Until.
  3. Не существует оператора для выхода из цикла While, как Exit For или Exit Do.

Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.

Бесконечный цикл

Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.

Следующий код показывает бесконечный цикл

В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.

В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.

Как вы можете видеть, использование For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счет в цикле. Ниже приведен тот же цикл с использованием For.

Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.

Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий

Работа с бесконечным циклом

Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.

Раньше вы могли выйти из цикла, просто нажав Ctrl и Break. В настоящее время разные ноутбуки используют разные комбинации клавиш. Полезно знать, как это настроено в вашем ноутбуке, чтобы в случае возникновения бесконечного цикла вы могли легко остановить код.

Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.

Использование функций Worksheet вместо циклов

Иногда вы можете использовать функцию листа вместо цикла.

Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию таблицы Sum. Это быстрее и экономит много кода.

Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.

В следующем примере используется цикл для выполнения того же действия. Как видите, это гораздо более длинный способ достижения той же цели.

Понравилась статья? Поделить с друзьями:
  • Excel vba не выдавать ошибку
  • Excel vba оператор select case
  • Excel vba не виден лист
  • Excel vba оператор do while
  • Excel vba начало программирования