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

Здравствуйте, подскажите, пожалуйста, как можно сделать цикл с перебором столбцов и выход в том случае, если столбец пуст??? То есть можно ли как-то узнать по порядковому номеру столбца его букву?? Спасибо! |
Перебор столбцов в использованной области активного листа: 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
например. Кому решение нужно – тот пример и рисует. | ||
LVL Пользователь Сообщений: 903 Регистрация: 01.01.1970 | #3 04.02.2015 10:36:53 так и реализуется…
| ||
SerArtur Пользователь Сообщений: 163 Регистрация: 22.12.2014 | #4 04.02.2015 10:56:33
Набросал в яйчейках D и Е данныe должно расчитываться так если А2 = 0 то D3= A3, D4=A4 если А2 <> 0 то D3= A3-А3*0.1667, D4=A4-А4*0.1667 Прикрепленные файлы
Изменено: 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
для такого задания цикл не нужен
файл не смотрел. Изменено: 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, 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 Спасибо за отвтеы сделал так
| |||
Источник
Пару недель назад передо мной встала проблема разработки электронной таблицы, просчитывающую диапазоны рабочего времени в зависимости от рабочего графика и производственного календаря. С первого взгляда задача нетрудная, но в ходе проектирования я понял, что избежать использования циклов не удастся. Особую специфику здесь придавало условие заказчика, что готовый продукт должен быть именно
Excel
таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).
Стандартный набор функций Excel не поддерживает ничего похожего на циклы, однако выход нашелся – использование циклических ссылок и итераций.
Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:
В открывшемся окне активируем соответствующий флажок:
Так же обратите внимание на поле «Предельное число итераций» – оно определяет, сколько раз будет проходить вычисление по всем циклическим ссылкам, если вы сами не поставите ограничение.
!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».
Рассмотрим пример использования итеративных вычислений в виде цикла.
Впишите в ячейку А1 формулу:
Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:
Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:
Как видите, каждый этап итерации (новое значение А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?
Источник