Как организовать цикл по столбцам excel

Как организовать цикл по столбцам excel thumbnail

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

Спасибо!

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

For each st in ActiveSheet.UsedRange.Columns

Debug. st.Column

Next st

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

For each st in ActiveSheet.UsedRange.Columns

If Worksheet.CountA(st) = 0 then

Debug. st.Column

Exit For

End if

Next st

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

For Each st In ActiveSheet.UsedRange.Columns

If Worksheet.CountA(st) = 0 Then

Debug. 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 Is(Worksheets(“Лист1”).Cells(k, I).Value) Then

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

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

IsNull

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.

s

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 somes referred to as a null string.

Important Use the IsNull 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}{=29.01.2008 01:20}{thema=}{post}оно, конечно, аналогично, но не идентично..

IsNull {/post}{/quote}

А если не секрет, откуда такая информация? Я тоже хочу почитать 🙂

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

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

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

Но почему-то у меня меньше там написано 🙁

Вопрос с Is остался не решен 🙁

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

{quote}{login=Sonia}{=29.01.2008 04:19}{thema=}{post}Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же Is должна проверить и если можно перевести в дату, значит True. Я правильно поняла?{/post}{/quote}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция Is, получив значение 39475, должна проверить, что его можно перевести в дату? “1” в общем формате тоже переводится в дату 01.01.1900. По Вашей логике Is всегда бы возвращала True, кроме отрицательных выражений

А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(“Лист1”).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.

{quote}{login=}{=29.01.2008 06:55}{thema=Re: }{post}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция Is, получив значение 39475, должна проверить, что его можно перевести в дату? “1” в общем формате тоже переводится в дату 01.01.1900. По Вашей логике Is всегда бы возвращала True, кроме отрицательных выражений

А уж VBA и подавно не знает что там подразумевалось под числом 39475, он просто получает значение ячейки Worksheets(“Лист1”).Cells(k, I).Value. Вот оно будет в формате даты VBA и получит дату.{/post}{/quote}

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

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

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

{quote}{login=Лузер}{=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.

Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил – он все сам нашел.{/post}{/quote}

Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют

{quote}{login=Sonia}{=30.01.2008 09:39}

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

может это подойдёт

If (CStr(Range(“A30”).Offset(0, K)) Like “*.*.*”) then

НомерСтолбцаДаты = K+1

end if

{quote}{login=Sonia}{=30.01.2008 11:44}{thema=Re: }{post}{quote}{login=Лузер}{=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу.

Я так делаю, когда получаю отчеты из другой организации, они то добавят столбец, то уберут, то еще что-нибудь. А отчетов вагон, а тут макрос запустил – он все сам нашел.{/post}{/quote}

Столбцы имеют заголовки, но только в форме. Выгруженные данные заголовков не имеют{/post}{/quote}Форма екселевская, в том же файле?

Может пример прикрепите?

Читайте также:  Лечение по циклам луны

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

Может пример прикрепите?{/post}{/quote}

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

{quote}{login=Sonia}{=30.01.2008 02:10}{thema=Re: Re: Re: }{post}{quote}{login=Лузер}{=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=ДЛ}{=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}{=30.01.2008 04:57}{thema=Re: }{post}{quote}{login=ДЛ}{=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=}{=31.01.2008 07:42}{thema=Re: Re:}{post}

Worksheets(“Лист1”).Cells(I, k).Address

{/post}{/quote}

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

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

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

Решил что эта тема подходит к моему вопросу.

Вопрос-

Как в екселе заменить пустоту “” на null? т.е. есть ячайки без данных но не пустые

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

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

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

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

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

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

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

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

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

if MyCell=”” then MyCell.Clear ‘очистить содержимое и форматирование{/post}{/quote}

Очень похоже на правду. только не понял как его правильно использывать. через поиск или объявлением таблици. Я в ВБА полный нуб, только осваиваюсь. Начинаю с простого “запись макроса”. стоп макрос. потом смотрю код и начинаю его оптимизировать – так и развиваюсь…((

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

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

Попробуйте – обработка выделенного диапазона, очистка пустых на вид ячеек, которые содержат “” как значение формулы либо полученные копированием-вставкой значения таких ячеек.

После обработки пустые ячейки выделяются по команде F5 – выделить – пустые ячейки.

Sub Cross()

Dim MyCell As Range

For Each MyCell In Selection ‘то же, что Selection.Cells

If MyCell = “” Then MyCell.ClearContents

Next ‘ то же, что Next MyCell

End Sub

Юрий М

Модератор

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

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

#30

24.01.2011 12:53:38

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

Перечитал название темы – “Цикл по перебору столбцов”. Что,- действительно подходит?

Источник

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

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

Как реализовывается цикл по столбцам? Никогда не использовал.

For … To …

Next …

Изменено: SerArtur – 04.02.2015 21:43:57

Пытливый

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

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

#2

04.02.2015 10:36:02

Код
For i=1 to Selection.Columns.Count

например.

Кому решение нужно – тот пример и рисует.

LVL

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

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

#3

04.02.2015 10:36:53

так и реализуется…

Код
For … To … … Next …
SerArtur

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

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

#4

04.02.2015 10:56:33

Код
Sub b() Dim i As Variant For i = 1 To 2 If Cells(2, i) = 0 Then Cells(3, i + 3) = Cells(3, i) Else Cells(3, i + 3) = Cells(2, i) – Cells(2, i) * 0.1667 End If Next i End Sub

Набросал в яйчейках D и Е данныe должно расчитываться так

если А2 = 0 то D3= A3, D4=A4

если А2 <> 0 то D3= A3-А3*0.1667, D4=A4-А4*0.1667

Прикрепленные файлы

  • FOR.xltm (23.27 КБ)

Изменено: SerArtur – 04.02.2015 10:56:51

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

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

Это маленький цикл. Надо до 26 столбцов проверять и через 26 столбцов расчитывать скажем от A:до Z и расчеты ввести с AA до AZ

Изменено: SerArtur – 04.02.2015 11:03:20

Читайте также:  Список книг стивена кинга из цикла темная башня

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

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

У Вас, кмк, ошибка в адресации ячеек – судя по описанию, надо чтобы менялись значения ячеек D3, D4, а в коде ссылки на D3, E3

Вам надо всегда только А2 проверять? Зачем тогда цикл?

Кому решение нужно – тот пример и рисует.

V

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

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

#7

04.02.2015 11:08:25

Цитата
SerArtur пишет:

если А2 = 0 то D3= A3, D4=A4

если А2 <> 0 то D3= A3-А3*0.1667, D4=A4-А4*0.1667

для такого задания цикл не нужен

Код
If Cells(2, 1) = 0 Then Cells(3, 4) = Cells(3, 1) Cells(4, 4) = Cells(4, 1) Else Cells(3, 4) = Cells(3,1) – Cells(3, 1) * 0.1667 Cells(4, 4) = Cells(4,1) – Cells(4, 1) * 0.1667 End If

файл не смотрел.

Изменено: V – 04.02.2015 11:10:51

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

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

Дорогой Вы мой друг для n столбцов надо. Я без Cells могу свойством Range. Нужен цикл

Изменено: SerArtur – 04.02.2015 11:37:19

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

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

в примере из поста #4 мало понятного, нужен пример с 26 столбцами

Изменено: Ёк-Мок – 04.02.2015 11:35:55

Конь, просто конь.

Удивление есть начало познания © Surprise me!

И да пребудет с нами сила ВПР.

SerArtur

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

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

#10

04.02.2015 11:38:13

Цитата
Пытливый пишет: Вам надо всегда только А2 проверять?

нет не А2, a от А2, …Z2

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

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

а с А4 что то делать нужно? в файле примере в ней есть значение.

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

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

Чего-то не очень понятно, что надо в итоге.

В столбцах как данные исходные располагаются? Всегда на 2 строке?

Куда выводятся результаты? на строку вниз на 3 столбца вправо от исходной?

Кому решение нужно – тот пример и рисует.

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

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

1 Если А2 =0

То D3=A3, D4=A4, Dn-e=An-e

Иначе А2=1

То D3=A3-A3*0,1667, D4=A4-A4*0,1667, Dn-e=An-e – An-e * 0.1667

2 Если B2 =0

То E3=B3, E4=B4, En-e=Bn-e

Иначе B2=1

То E3=B3-B3*0,1667, E4=B4-B4*0,1667, En-e=Bn-e – Bn-e * 0.1667

и так далее до Z

Изменено: SerArtur – 04.02.2015 11:54:32

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

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

Все равно не ясно. Сами пишете – если А2=0 то D3=A3.

А в примере у вас чего?

Кому решение нужно – тот пример и рисует.

SerArtur

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

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

#15

04.02.2015 12:10:01

Спасибо за отвтеы сделал так

Код
Sub b() For n = 3 To 5 For m = 1 To 2 If Cells(2, m) = 0 Then Cells(n, m + 3) = Cells(n, m) ‘Cells(4, 4) = Cells(4, 1) Else Cells(n, m + 3) = Cells(n, m) – Cells(n, m) * 0.1667 ‘Cells(4, 4) = Cells(4, 1) – Cells(4, 1) * 0.1667 End If Next m Next n End Sub

Источник

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

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?

Источник

Читайте также:  Цикл повестей невский проспект