Vba excel цикл for обратный

Dragon34

2 / 2 / 1

Регистрация: 23.09.2009

Сообщений: 40

1

Цикл в обратном направлении

10.05.2010, 18:01. Показов 31267. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Можно ли в VBA сделать обратный цикл(что бы считал наоборот).

На паскале он реализуется вот так.

Pascal
1
for k:=6 downto 1 do



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

10.05.2010, 18:34

2

step -1



4



Vlanib

Частенько бываю

749 / 330 / 42

Регистрация: 20.06.2007

Сообщений: 854

11.05.2010, 07:58

3

Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Подробнее:

Visual Basic
1
2
3
For k = 6 To 1 Step -1
'.....
Next



4



 

asesja

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

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

#1

08.11.2022 21:09:30

Здравствуйте.
Подскажите, пож-та, можно ли цикл For Each в диапазоне запустить в обратном порядке, т.е. при 1-м проходе  rng.Value=Range(«A10»), при 2-м rng.Value=Range(«A9»), при 3-м rng.Value=Range(«A8») и т.д.?

Код
Dim rng As Range
For Each rng In Range("A1:A10")
    msgbox rng.Value
Next
 

в For Each — не предусмотрено
ни для диапазона, ни для массива, ни для коллекций, ни для чего не предусмотрен перебор в обратном порядке

Изменено: Ігор Гончаренко08.11.2022 21:17:48

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

 

asesja

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

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

 

asesja

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

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

Подскажите, как пройтись по диапазону «A1:A10» с конца, если в середине и по краям могут быть скрытые фильтром строки? Пройтись нужно только по видимым .SpecialCells(xlCellTypeVisible)

 

New

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

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

#5

08.11.2022 21:44:12

Код
Sub Test()
    Dim LastRow As Long, i As Long
        
    'номер последней строки на листе
    LastRow = ActiveSheet.UsedRange.Rows.Count
    'цикл снизу вверх
    For i = LastRow To 2 Step -1
        If Rows(i).Hidden = False Then
            'тут делаете что хотите
            'Cells(i,1) = это ячейка из столбца А видимая
        End If
    Next i
End Sub

Изменено: New08.11.2022 21:46:07

 

asesja

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

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

 

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

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

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

#7

08.11.2022 21:52:53

Код
for r = 10 to 1 Step -1
  If Not Rows(r).Hidden Then 'видимая строка (ячейка)
next

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

 

asesja

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

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

 

ocet p

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

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

#9

09.11.2022 03:47:35

Можно тоже использовать свойство «Areas» объекта «Range»:

Код
Sub xyz()
    Dim i&, rg As Range
    
    With ActiveSheet
        Set rg = .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
        
        For i = rg.Areas.Count To 1 Step -1
            'With rg.Areas(i).Range("A1")
            'With rg.Areas(i).Cells(1)
            With rg.Areas(i)
                .Select
                .Interior.ColorIndex = 9 - i
            End With
            Application.Wait (Now + TimeValue("00:00:02"))
        Next
        
        .Range("A1").CurrentRegion.Interior.ColorIndex = xlNone 'xlColorIndexNone
    End With
    
    Set rg = Nothing
End Sub
 

asesja

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

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

#10

09.11.2022 08:43:40

Цитата
написал:
Можно тоже использовать свойство «Areas» объекта «Range»:

спасибо

 

Jack Famous

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

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

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#11

09.11.2022 09:31:33

Цитата
asesja: Цикл For Each в обратном порядке, VBA

Если очень нужно, то можно, но это настолько неправильно, что на страшном суде может иметь решающее значение

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

What This VBA Code Does

Looping is a great coding technique to condense the amount of VBA lines you write. While cycling through numbers typically goes the way of 1,2,3, etc…, there is a way to count down (ie 3,2,1). In order to do this, you can incorporate Step -1 into your loop statement. Below is a simple example of how you can do this.

VBA Code:

Using VBA Code Found On The Internet

Now that you’ve found some VBA code that could potentially solve your Excel automation problem, what do you do with it? If you don’t necessarily want to learn how to code VBA and are just looking for the fastest way to implement this code into your spreadsheet, I wrote an article (with video) that explains how to get the VBA code you’ve found running on your spreadsheet.

Getting Started Automating Excel

Are you new to VBA and not sure where to begin? Check out my quickstart guide to learning VBA. This article won’t overwhelm you with fancy coding jargon, as it provides you with a simplistic and straightforward approach to the basic things I wish I knew when trying to teach myself how to automate tasks in Excel with VBA Macros.

Also, if you haven’t checked out Excel’s latest automation feature called Power Query, I have put together a beginner’s guide for automating with Excel’s Power Query feature as well! This little-known built-in Excel feature allows you to merge and clean data automatically with little to no coding!

How Do I Modify This To Fit My Specific Needs?

Chances are this post did not give you the exact answer you were looking for. We all have different situations and it’s impossible to account for every particular need one might have. That’s why I want to share with you: My Guide to Getting the Solution to your Problems FAST! In this article, I explain the best strategies I have come up with over the years to get quick answers to complex problems in Excel, PowerPoint, VBA, you name it

I highly recommend that you check this guide out before asking me or anyone else in the comments section to solve your specific problem. I can guarantee that 9 times out of 10, one of my strategies will get you the answer(s) you are needing faster than it will take me to get back to you with a possible solution. I try my best to help everyone out, but sometimes I don’t have time to fit everyone’s questions in (there never seem to be quite enough hours in the day!).

I wish you the best of luck and I hope this tutorial gets you heading in the right direction!

Chris
Founder, TheSpreadsheetGuru.com

I have a problem with my macro. It deletes row that fullfil certain criteria. But when few consecutive rows fullfil those criteria an error occurs. When the row is deleted the other rows are shifted up so if i.e. row(2:2) and row(3:3) fullfil the criteria then the row(2:2) is deleted and row(3:3) is shifted up, so it becomes row(2:2), and For loop goes to another row (third one). As a result row that used to be row(3:3) and now is row(2:2) is omitted and not deleted.
In order to deal with this topic I think that it is enough to reverse to For loop, so it wouldn’t go from up to bottom but from bottom to top. Te resulat would be double checking of some rows, but no rows would be omitted.
The proble is that I don’t know how to revese the For loop. I have tried to change ‘For x = startrow To endrow’ to ‘For x = endrow To startrow’, but it didn’t help.
Here is the code:

Sub Repurchase_upload()

Dim Worksheet As Worksheets
startrow = Worksheets("GUTS").Cells(10, 1)
endrow = Worksheets("GUTS").Cells(11, 1)

 For x = startrow To endrow 'I have tried to change this line into: 'For x = endrow To startrow', but it didn' help
            If Cells(x, "A").Value <> "AA" And Cells(x, "A").Value <> "AB" And Cells(x, "A").Value <> "AC" And Cells(x, "A").Value <> "AD" And Cells(x, "A").Value <> "AE" And     Cells(x, "A").Value <> "AH" And Cells(x, "A").Value <> "AI" And Cells(x, "A").Value <> "AF" And Cells(x, "A").Value <> "AG" Then
            Cells(x, "A").EntireRow.Delete

            End If



    Next
End Sub  

Thank you all a lot in advance,
with best regards,
Artur Rutkowski

vba цикл excel for each for next

Цикл For Loop в VBA – один из самых популярных циклов в Excel. Данный цикл имеет две формы – For Next и For Each In Next. Данные операторы используются для последовательного  перемещения по списку элементов или чисел. Для завершения цикла мы можем в любой момент использовать команду выхода. Давайте подробнее рассмотрим каждый из этих циклов.

Цикл For Next имеет следующий синтаксис:

1
2
3

For счетчик = начало_счетчика To конец_счетчика
‘Какое-то действие
Next счетчик

То что мы делаем здесь, по существу, это создаем цикл, который использует переменную счетчик как хранитель времени. Устанавливаем его значение равным начало_счетчика, и увеличиваем (или уменьшаем) на 1 во время каждого витка. Цикл будет выполняться до тех пор, пока значение счетчик не станет равным конец_счетчика. Когда оба эти значения совпадут, цикл выполнится последний раз и остановится.

Пример цикла

1
2
3
4
5
6

Sub пример_цикла1()
For счетчик = 1 to 10
j = счетчик
Next счетчик
msgbox «Значение счетчика на последнем витке равно  « &amp; счетчик
End Sub

Последнее значение переменной счетчик будет равным 11

VBA обратный цикл For Loop с инструкцией STEP

Если у вас появилась необходимость перемещаться от большего значения к меньшему – вы можете использовать цикл в обратном направлении. Вот пример обратного цикла:

1
2
3
4
5
6

Sub пример_цикла2()
For счетчик = 10 to 1 Step -1
j = счетчик
Next счетчик
msgbox «Значение счетчика на последнем витке равно  « &amp; счетчик
End Sub

Последнее значение переменной счетчик будет равным 1.

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

VBA цикл For Each … Next

Цикл For Each … Next имеет следующий цикл:

1
2
3

For Each элемент_группы In группа_элементов
‘Какое-то действие
Next элемент_группы

Здесь переменная элемент_группы принадлежит к группе_элементов (железная логика!!!). Я имею в виду, что объект группа_элементов должен быть коллекцией объектов. Вы не сможете запустить цикл For Each для отдельно объекта (Microsoft сразу оповестит вас об этом 438-й ошибкой).

vba циклы excel for each for next

Данный цикл перебирает все элементы какой-либо коллекции, начиная с самого первого. Вы можете использовать данный цикл, если вам необходимо, например, обойти все листы в книге, объекты на листе, сводные таблицы и т.д.

Ниже представлен пример, как можно воспользоваться циклом For Each для просмотра всех листов книги:

1
2
3
4
5

Sub пример_цикла4()
For Each sht In ActiveWorkbook.Worksheets
MsgBox sht.Name
Next sht
End Sub

… либо всех сводных таблиц на листе

1
2
3
4
5

Sub пример_цикла()
For Each pvt In ActiveSheet.PivotTables
MsgBox pvt.Name
Next pvt
End Sub

Прерывание  цикла VBA

Если вам необходимо выйти из цикла до момента, как будет достигнуто условие завершения цикла, воспользуйтесь командой End For в связке с инструкцией IF. В примере, приведенном ниже, мы выйдем из цикла до момента достижения условия завершения, в данном цикле выход будет осуществлен при условии, когда переменная счетчик будет  равна 3.

1
2
3
4
5
6

Sub пример_цикла5()
For счетчик  = 0 To 5
MsgBox счетчик
If (счетчик = 3) Then Exit For
Next счетчик
End Sub

Пропуск части цикла в For Each

Пропускать часть цикла, а затем возвращаться назад – плохая практика. Тем не менее, давайте рассмотрим пример:

1
2
3
4
5
6
7
8
9
10
11
12

Sub пример_цикла6 ()
Dim j As Integer
For i = 0 To 5
b:
If (j = 3) Then GoTo a:
j = i
Next i
a:
j = 4
GoTo b:
MsgBox («Значение  j = « &amp; j)
End Sub

Здесь мы пропустили одну итерацию (когда j = 3). Как вы думаете, какой результат выдаст программа? 3? 5? Ну… на самом деле, ни один из вариантов не верный. Цикл будет выполняться бесконечно, пока память компьютера не переполнится.

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

1
2
3
4
5
6

Sub пример_цикла7()
For i = 0 To 5
i = i + 1
MsgBox i
Next i
End Sub

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

Like this post? Please share to your friends:
  • Vba excel целочисленное деление
  • Vba excel функция формат
  • Vba excel цвета текста ячеек
  • Vba excel функция тип данных
  • Vba excel цвет ячейки коды