Цикл в цикле excel по столбцам

when we are going to do a loop in the rows, we can use code like the following:

i = 1
Do
   Range("E" & i & ":D" & i).Select
   i = i + 1
Loop Until i > 10

but what if we want to do a loop on a column?

Can we use the same method as above?

while the columns in Excel is a complex such as A, B, C, …, Y, Z, AA, AB, AC, …, etc.
problems will arise between loop from the «Z» to the «AA».

how we do looping alphabet column from «A» to «Z» and then continued into «AA», «AB» and so on

is there anything that can help?

Charles's user avatar

Charles

50.8k13 gold badges104 silver badges142 bronze badges

asked Dec 21, 2012 at 6:03

wahyueka31's user avatar

Yes, let’s use Select as an example

sample code: Columns("A").select

How to loop through Columns:

Method 1: (You can use index to replace the Excel Address)

For i = 1 to 100
    Columns(i).Select
next i

Method 2: (Using the address)

For i = 1 To 100
 Columns(Columns(i).Address).Select
Next i

EDIT:
Strip the Column for OP

columnString = Replace(Split(Columns(27).Address, ":")(0), "$", "")

e.g. you want to get the 27th Column —> AA, you can get it this way

answered Dec 21, 2012 at 6:31

Larry's user avatar

LarryLarry

2,7542 gold badges24 silver badges36 bronze badges

4

Another method to try out.
Also select could be replaced when you set the initial column into a Range object. Performance wise it helps.

Dim rng as Range

Set rng = WorkSheets(1).Range("A1") '-- you may change the sheet name according to yours.

'-- here is your loop
i = 1
Do
   '-- do something: e.g. show the address of the column that you are currently in
   Msgbox rng.offset(0,i).Address 
   i = i + 1
Loop Until i > 10

** Two methods to get the column name using column number**

  • Split()

code

colName = Split(Range.Offset(0,i).Address, "$")(1)
  • String manipulation:

code

Function myColName(colNum as Long) as String
    myColName = Left(Range(0, colNum).Address(False, False), _ 
    1 - (colNum > 10)) 
End Function 

BenMorel's user avatar

BenMorel

33.8k49 gold badges179 silver badges316 bronze badges

answered Dec 21, 2012 at 8:40

bonCodigo's user avatar

bonCodigobonCodigo

14.1k1 gold badge47 silver badges88 bronze badges

3

If you want to stick with the same sort of loop then this will work:

Option Explicit

Sub selectColumns()

Dim topSelection As Integer
Dim endSelection As Integer
topSelection = 2
endSelection = 10

Dim columnSelected As Integer
columnSelected = 1
Do
   With Excel.ThisWorkbook.ActiveSheet
        .Range(.Cells(columnSelected, columnSelected), .Cells(endSelection, columnSelected)).Select
   End With
   columnSelected = columnSelected + 1
Loop Until columnSelected > 10

End Sub

EDIT

If in reality you just want to loop through every cell in an area of the spreadsheet then use something like this:

Sub loopThroughCells()

'=============
'this is the starting point
Dim rwMin As Integer
Dim colMin As Integer
rwMin = 2
colMin = 2
'=============

'=============
'this is the ending point
Dim rwMax As Integer
Dim colMax As Integer
rwMax = 10
colMax = 5
'=============

'=============
'iterator
Dim rwIndex As Integer
Dim colIndex As Integer
'=============

For rwIndex = rwMin To rwMax
        For colIndex = colMin To colMax
            Cells(rwIndex, colIndex).Select
        Next colIndex
Next rwIndex

End Sub

answered Dec 21, 2012 at 8:04

whytheq's user avatar

whytheqwhytheq

34k64 gold badges170 silver badges265 bronze badges

2

Just use the Cells function and loop thru columns.
Cells(Row,Column)

answered Oct 29, 2020 at 14:19

user14543082's user avatar

 

Здравствуйте, подскажите, пожалуйста, как можно сделать цикл с перебором столбцов и выход в том случае, если столбец пуст??? То есть можно ли как-то узнать по порядковому номеру столбца его букву??  
Спасибо!

 

Перебор столбцов в использованной области активного листа:  

  For each st in ActiveSheet.UsedRange.Columns  
   Debug.Print st.Column  
Next st  

  перебор с выходом если столбец пуст:  

  For each st in ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 then    
       Debug.Print st.Column  
       Exit For  
   End if  
Next st  

  перебор с выходом и определением буквы столбца (бесполезная для VBA информация):  

  For Each st In ActiveSheet.UsedRange.Columns  
   If WorksheetFunction.CountA(st) = 0 Then  
       Debug.Print Replace(Split(st.EntireColumn.Address, «:»)(0), «$», «»)  
       Exit For  
   End If  
Next st

 

Спасибо, конечно, но как-то можно проще сделать мне кажется. Сейчас пробую с помощью    

    Worksheets(«Лист1»).Cells(k, I).Value  

  И вот такой вопрос. Поставила условие проверки пустоты ячейки:  

  If IsNull(Worksheets(«Лист1»).Cells(k, I).Value) Then  

  А почему-то если ячейка пустая, то это условие становится в False, хотя должно в True. Можете подсказать почему?  
Впринципе можно использовать IsEmpty…Но это же аналогично..  
И еще почему-то не срабатывает условие  

  If IsDate(Worksheets(«Лист1»).Cells(k, I).Value) Then  

  Не пойму в чем проблема. Подскажите, пожалуйста!!!

 

оно, конечно, аналогично, но не идентично..  
IsNull Function  

          Returns a Boolean value that indicates whether an expression contains no valid data (Null).  

  Syntax  

  IsNull(expression)  

  The required expression argument is a Variant containing a numeric expression or string expression.  

  Remarks  

  IsNull returns True if expression is Null; otherwise, IsNull returns False. If expression consists of more than one variable, Null in any constituent variable causes True to be returned for the entire expression.  

  The Null value indicates that the Variant contains no valid data.    

      Null is not the same as Empty!!!  

    , which indicates that a variable has not yet been initialized. It is also not the same as a zero-length string («»), which is sometimes referred to as a null string.  

  Important   Use the IsNull function to determine whether an expression contains a Null value. Expressions that you might expect to evaluate to True under some circumstances, such as If Var = Null and If Var <> Null, are always False. This is because any expression containing a Null is itself Null and, therefore, False.

 

{quote}{login=slan}{date=29.01.2008 01:20}{thema=}{post}оно, конечно, аналогично, но не идентично..  
IsNull Function{/post}{/quote}  
А если не секрет, откуда такая информация? Я тоже хочу почитать :)  

  И все-таки, а что с IsDate не то?

 

есть такая кнопка… f1 :)

 

{quote}{login=slan}{date=29.01.2008 02:01}{thema=}{post}есть такая кнопка… f1 :){/post}{/quote}  

  Но почему-то у меня меньше там написано :(  
Вопрос с IsDate остался не решен :(

 

Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?

 

{quote}{login=Sonia}{date=29.01.2008 04:19}{thema=}{post}Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же IsDate должна проверить и если можно перевести в дату, значит True. Я правильно поняла?{/post}{/quote}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? «1» в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(«Лист1»).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.

 

{quote}{login=}{date=29.01.2008 06:55}{thema=Re: }{post}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? «1» в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений  
А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(«Лист1»).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.{/post}{/quote}  

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

 

А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.

 

{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют

 

{quote}{login=Sonia}{date=30.01.2008 09:39}  
Впринципе можно как-то маску использовать, можете подсказать функцию проверки на сооветствие данных ячейки конкретной маске???{/post}{/quote}  

  может это подойдёт  
If (CStr(Range(«A30»).Offset(0, K)) Like «*.*.*») then  
НомерСтолбцаДаты = K+1  
end if

 

{quote}{login=Sonia}{date=30.01.2008 11:44}{thema=Re: }{post}{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.  
Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил — он все сам нашел.{/post}{/quote}  
Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют{/post}{/quote}Форма екселевская, в том же файле?  
Может пример прикрепите?

 

{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  

  Форма на том же листе. Выкладываю пример.

 

{quote}{login=Sonia}{date=30.01.2008 02:10}{thema=Re: Re: Re: }{post}{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле?  
Может пример прикрепите?{/post}{/quote}  

  Форма на том же листе. Выкладываю пример.{/post}{/quote}  

  А где пример? Почему то не подцепился…

 

Ой, сорри, подцепился. Макрос там же.

 

Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  

    k = 20 ‘ Начало со столбца T  
   Do  
   ‘ Сделано для корректного переноса Примечаний, включающих символ «;»  
     If Worksheets(«Лист1»).Cells(I, k).Value Like «??.??.*» Then  
              Range(«I» + CStr(I)) = Worksheets(«Лист1»).Cells(I, k).Value  
     Else  
        If Not (Worksheets(«Лист1»).Cells(I, k).Value = «») Then  
           Range(«H» + CStr(I)) = Range(«H» + CStr(I)) + «;» + Worksheets(«Лист1»).Cells(I, k).Value  
        End If  
        ‘Range(«I» + CStr(I)) = Worksheets(«Лист1»).Cells(k + 1, I).Value  
     End If  

               ‘Worksheets(«Лист1»).Cells(I, k).Value = Empty  

             k = k + 1  

         Loop Until Worksheets(«Лист1»).Cells(I, k).Value = «»

 

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

  Вопрос Последняя значащая ячейка в строке обязательно дата?  
и кроме нее в обрабатываемом участке строки дат нет?

 

{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  

  Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  

  Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа.

 

{quote}{login=ДЛ}  
If Worksheets(«Лист1»).Cells(I, k).Value Like «??.??.*» Then  
{/post}{/quote}  
А разве маска так пишется??? Я думала, что-то типа: «dd.mm.yyyy»??

 

«dd.mm.yyyy» — это формат  
А маска — это определенные символы (в Вашем случае точки) и «?» как любой один символ, а «*» как любые символы.

 

{quote}{login=Sonia}{date=30.01.2008 04:57}{thema=Re: }{post}{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже  
И будет вам счастье, хоть и маленькое  
{/post}{/quote}  

  Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами??  

  Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа.{/post}{/quote}  

  Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  

   Worksheets(«Лист1»).Cells(I, k).Address  
Worksheets(«Лист1»).Cells(k, I).Address  

  Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  

  Но всё таки поробавпли заменить или нет?  
Если заменили работает?

 

{quote}  
Про cells(i,k)  
Пробегите ваш код из редактора VBA Exsel (нажимая F8)  
В окно Watch : View/Watch Window в сплывающем окне по правой  
кнопке мыши добавьте  

   Worksheets(«Лист1»).Cells(I, k).Address  
Worksheets(«Лист1»).Cells(k, I).Address  

  Это адреса ячеек которые вы перебираете, думаю всё станет ясно.  

  Но всё таки поробавпли заменить или нет?  
Если заменили работает?{/post}{/quote}  

  Да, заменила. Спасибо большое!!!! Все работает!! :) Сейчас еще пошагово пробегусь и Watch посмотрю, чтобы окончательно разобраться ;)

 

{quote}{login=}{date=31.01.2008 07:42}{thema=Re: Re:}{post}  
Worksheets(«Лист1»).Cells(I, k).Address  
{/post}{/quote}  

  Хм…а я считала, что в Cells сначала указывается столбец, а потом строка…оказалось наоборот. Ладно, буду знать :)

 

cross

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

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

Решил что эта тема подходит к моему вопросу.  
Вопрос-    
Как в екселе заменить пустоту «» на null? т.е. есть ячайки без данных но не пустые

 

Вы, видимо, хотите очистить ячейки?  

  if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование  

  if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование

 

cross

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

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

{quote}{login=Казанский}{date=24.01.2011 11:21}{thema=Cross}{post}Вы, видимо, хотите очистить ячейки?  

  if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование  

  if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование{/post}{/quote}  
Очень похоже на правду. только не понял как его правильно использывать. через поиск или объявлением таблици. Я в ВБА полный нуб, только осваиваюсь. Начинаю с простого «запись макроса». стоп макрос. потом смотрю код и начинаю его оптимизировать — так и развиваюсь…((

 

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

  Sub Cross()  
Dim MyCell As Range  
For Each MyCell In Selection ‘то же, что Selection.Cells  
   If MyCell = «» Then MyCell.ClearContents  
Next ‘ то же, что Next MyCell  
End Sub

 

Юрий М

Модератор

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

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

#30

24.01.2011 12:53:38

{quote}{login=Cross}{date=24.01.2011 11:12}{thema=}{post}Решил что эта тема подходит к моему вопросу. Вопрос- Как в екселе заменить пустоту «» на null? т.е. есть ячайки без данных но не пустые{/post}{/quote}  
Перечитал название темы — «Цикл по перебору столбцов». Что,- действительно подходит?

Содержание

  • 1 Оператор цикла «For» в Visual Basic
    • 1.1 Цикл «For … Next»
    • 1.2 Цикл «For Each»
    • 1.3 Оператор прерывания цикла «Exit For»
  • 2 Цикл «Do While» в Visual Basic
  • 3 Цикл «Do Until» в Visual Basic

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

Excel

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

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

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

как сделать цикл в excel

В открывшемся окне активируем соответствующий флажок:

как сделать цикл в excel

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

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

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

Впишите в ячейку А1 формулу:

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

как сделать цикл в excel

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

как сделать цикл в excel

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

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

!Дополнительные ссылки:

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

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

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

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

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

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

Цикл «For … Next»

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

For i = 1 To 10     Total = Total + iArray(i)  Next i

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

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

For d = 0 To 10 Step 0.1     dTotal = dTotal + d  Next d

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

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

For i = 10 To 1 Step -1     iArray(i) = i  Next i

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

Цикл «For Each»

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

Dim wSheet As Worksheet    For Each wSheet in Worksheets     MsgBox "Найден лист: " & wSheet.Name  Next wSheet

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

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

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

For i = 1 To 100     If dValues(i) = dVal Then        IndexVal = i        Exit For     End If  Next i

Цикл «Do While» в Visual Basic

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

'Процедура Sub выводит числа Фибоначчи, не превышающие 1000  Sub Fibonacci()     Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности     Dim iFib As Integer 'хранит текущее значение последовательности     Dim iFib_Next As Integer 'хранит следующее значение последовательности     Dim iStep As Integer 'хранит размер следующего приращения       'инициализируем переменные i и iFib_Next     i = 1     iFib_Next = 0     'цикл Do While будет выполняться до тех пор, пока значение     'текущего числа Фибоначчи не превысит 1000       Do While iFib_Next < 1000        If i = 1 Then           'особый случай для первого элемента последовательности           iStep = 1           iFib = 0        Else           'сохраняем размер следующего приращения перед тем, как перезаписать           'текущее значение последовательности           iStep = iFib           iFib = iFib_Next        End If          'выводим текущее число Фибоначчи в столбце A активного рабочего листа        'в строке с индексом i        Cells(i, 1).Value = iFib        'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1        iFib_Next = iFib + iStep        i = i + 1     Loop    End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

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

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do  ...  Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

iRow = 1  Do Until IsEmpty(Cells(iRow, 1))     'Значение текущей ячейки сохраняется в массиве dCellValues     dCellValues(iRow) = Cells(iRow, 1).Value     iRow = iRow + 1  Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

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

Do  ...  Loop Until IsEmpty(Cells(iRow, 1))

Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов

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

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

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

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

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

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

Здравствуйте!! С наступающим!!! ;)

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

ЦитироватьFor s=»A» to F
s=s+1
Next s

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

Цитироватьa= Range(«A1»).value
b=Range(«B1»).value
b=Range(«c1»).value

прописывать предъидущим способом уже устал…ибо у меня эти значения уже достигли порядка 400…)))


Постараюсь пояснить пример цикла на пальцах.
X = 3 ‘ переменная для ввода в ячейку столбцов (для примера)
For s = 2 to 10 ‘s — переменная цикла, значение которой с каждым циклом увеличивается на 1. И так, цикл начался с 2-ки и продлится пока s не станет равно 10.
Cells(1, s) = X ‘ в ячейку находящуюся в строке 1 и столбце s, вносим значение Х
X = X * 2 ‘ для примера,  в следующий столбец значение Х множим на 2
Next  ‘ следующий цикл
И так, в ячейки на первой строке со 2-го столбца по 10-й, будут внесены значения Х-а с каждым циклом уноженным на 2.
Полный код

Sub primer()
   X = 3
   For s = 2 to 10
        Cells(1, s) = X
        X = X * 2
   Next
End Sub
Надеюсь скопировать в модуль и назначить кнопку, сможешь.

А вот, откуда берутся 20 значений и куда прописываются, надо выложить примерчик на листах экселя- как есть и как хочу.

Может и я на что сгожусь … Если сгодился, можете меня по+благодарить+.



И это все? А я разогнался  ;D

Может и я на что сгожусь … Если сгодился, можете меня по+благодарить+.


Всех с Наступающим! Здоровья и удачи!

Если позволите, внесу свои предложения. Дело в том что, вот так организованный код:

Sub primer()
    X = 3
    For s = 2 to 10
         Cells(1, s) = X
         X = X * 2
    Next
End Sub
запаисанный в стандартный модуль будет работать на любом листе с которого он будет запущен.
А бывает нужно, что бы сей код отрабатывался только на определенном листе:

Sub primer()
    X = 3
    For s = 2 to 10
         With Thisworkbook. Worksheets("MySheet")
               .Cells(1, s) = X
         End With
         X = X * 2
    Next
End Sub
— вот его модернизация. Если же вместо Thisworkbook написать Workbooks(«MyBook»), т.е. задать не текущую активную книгу, а определенную, угодную Вам, то и работать код будет только в этой книге!

Может быть Вам уже эти приемы известны?!  ;)

Путей к вершине — множество. Этот один из многих!


И от меня наилучшие пожелания и поздравления с наступающим.

Цитата: GWolf от 27.12.2010, 08:38
запаисанный в стандартный модуль будет работать на любом листе с которого он будет запущен.

Ув. GWolf. Насколько я понимаю, процедура SUB, (в данном случае с именем «primer») сама не запустится, её должен запустить какой-то объект, кнопка, другая поцедура и т.д.
Автоматически запускаются поцедуры только с определенными именами и на определенные действия в книге, листе, ячейке.

Цитата: GWolf от 27.12.2010, 08:38
А бывает нужно, что бы сей код отрабатывался только на определенном листе:

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

Может и я на что сгожусь … Если сгодился, можете меня по+благодарить+.


Цитата: Wasilic от 28.12.2010, 16:23
… процедура SUB, (в данном случае с именем «primer») сама не запустится, её должен запустить какой-то объект, кнопка, другая поцедура и т.д.
Автоматически запускаются поцедуры только с определенными именами и на определенные действия в книге, листе, ячейке.

совершенно верно. Было несколько раз: — продвинутый пользователь жмет Alt+F8 и вуа ля! Макрос запускает, а он для другого листа … Вот что бы таких казусов не было я и применяю конструкцию

         With Thisworkbook. Worksheets(«MySheet»)
               …
         End With

так спокойнее. Может перестраховываюсь? Как считаешь?

[/quote]Вот, для этого кнопку запуска этой процедуры достаточно установить только на этом определенном листе. И с другого листа эту кнопку уже не нажмешь.
Или я ошибаюсь?
[/quote]

Ты прав, но не всегда удобно запускать кнопкой. Если запуск макроса из меню, или из другой функции записанной в стандартный модуль, то безопаснее и читабельнее все же указать МЕСТО ДЕЙСТВИЯ. Или я не прав?

Путей к вершине — множество. Этот один из многих!


Цитата: GWolf от 27.12.2010, 08:38
Всех с Наступающим! Здоровья и удачи!

Всех с Наступившим! Здоровья и удачи!

Думаю, что здесь проблема не столько в том, чтобы скакать по столбцам, сколько в том, чтобы облегчить процесс создания правильно работающего кода. В принципе, изначальный вариант типа
a= Range(«A1»).value
b=Range(«B1»).value
b=Range(«c1»).value
от BloodNickА конечно же тоже будет работать только создавать его муторно.
В классике программирования для таких вещей были предусмотрены генераторы кода типа препроцессоры.

Я такими приемчиками очень активно пользуюсь в Excel, благо его возможности неисчерпаемы, а голь (это я про себя) на выдумки хитра. Мне приходилось обрабатывать плоскую БазуДанных с более, чем 150 столбиками. И наиболее правильным в том случае был именно вариант с индивидуальным вытаскиванием значения из каждого столбца (без цикла по столбцам). Потому, как основной цикл по строкам БД, и если при этом еще сделать цикл по столбцам, то программа (типа Макрос) становится совершенно не понятной и возврат к ней через месяцы и годы обернется кошмаром… Где в массиве реквизитов какое значение потом искать никогда и ни за что не угадаешь.

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


Цикл 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.


Понравилась статья? Поделить с друзьями:
  • Цикл в формуле excel если
  • Цикл в excel с помощью формулы
  • Цикл foreach vba excel
  • Цикл for с шагом в vba excel
  • Цикл for макрос excel