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
50.8k13 gold badges104 silver badges142 bronze badges
asked Dec 21, 2012 at 6:03
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
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
33.8k49 gold badges179 silver badges316 bronze badges
answered Dec 21, 2012 at 8:40
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
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
Здравствуйте, подскажите, пожалуйста, как можно сделать цикл с перебором столбцов и выход в том случае, если столбец пуст??? То есть можно ли как-то узнать по порядковому номеру столбца его букву?? |
|
Перебор столбцов в использованной области активного листа: For each st in ActiveSheet.UsedRange.Columns перебор с выходом если столбец пуст: For each st in ActiveSheet.UsedRange.Columns перебор с выходом и определением буквы столбца (бесполезная для VBA информация): For Each st In ActiveSheet.UsedRange.Columns |
|
Спасибо, конечно, но как-то можно проще сделать мне кажется. Сейчас пробую с помощью Worksheets(«Лист1»).Cells(k, I).Value И вот такой вопрос. Поставила условие проверки пустоты ячейки: If IsNull(Worksheets(«Лист1»).Cells(k, I).Value) Then А почему-то если ячейка пустая, то это условие становится в False, хотя должно в True. Можете подсказать почему? If IsDate(Worksheets(«Лист1»).Cells(k, I).Value) Then Не пойму в чем проблема. Подскажите, пожалуйста!!! |
|
оно, конечно, аналогично, но не идентично.. 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}оно, конечно, аналогично, но не идентично.. И все-таки, а что с IsDate не то? |
|
есть такая кнопка… f1 |
|
{quote}{login=slan}{date=29.01.2008 02:01}{thema=}{post}есть такая кнопка… f1 :){/post}{/quote} Но почему-то у меня меньше там написано |
|
Кстати, а может ли это быть из-за того, что формат у ячейки стоит общий???? Ну по идеи же 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, кроме отрицательных выражений |
|
{quote}{login=}{date=29.01.2008 06:55}{thema=Re: }{post}Общий формат вам возвращает значение 39475 вместо 28.01.2008. Откуда функция IsDate, получив значение 39475, должна проверить, что его можно перевести в дату? «1» в общем формате тоже переводится в дату 01.01.1900. По Вашей логике IsDate всегда бы возвращала True, кроме отрицательных выражений Дело в том, что я не знаю в каком столбце у меня будет дата изначально. Данные выгружаются в Excel из программы и может получиться разное количество столбцов (так вот криво работают вместе эта программа и Excel). А я пишу макрос, который переписывает нужные данные в соответствующие поля, а остальные затирает. Так вот, мне надо узнать, если в столбце сожержится дата, то переписать ее в столбец с датой. Впринципе можно как-то маску использовать, можете подсказать функцию проверки на сооветствие данных ячейки конкретной маске??? |
|
А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу. |
|
{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу. |
|
{quote}{login=Sonia}{date=30.01.2008 09:39} может это подойдёт |
|
{quote}{login=Sonia}{date=30.01.2008 11:44}{thema=Re: }{post}{quote}{login=Лузер}{date=30.01.2008 11:22}{thema=}{post}А столбцы/строки имеют заголовки? Можно искать заголовок, затем смещаться к нужной строке/столбцу. |
|
{quote}{login=Лузер}{date=30.01.2008 01:26}{login=Лузер}{post}Форма екселевская, в том же файле? Форма на том же листе. Выкладываю пример. |
|
{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} А где пример? Почему то не подцепился… |
|
Ой, сорри, подцепился. Макрос там же. |
|
Исправьте кусок кода на то что приведено ниже k = 20 ‘ Начало со столбца T ‘Worksheets(«Лист1»).Cells(I, k).Value = Empty k = k + 1 Loop Until Worksheets(«Лист1»).Cells(I, k).Value = «» |
|
Насколько я понял задача заключается в следующем Вопрос Последняя значащая ячейка в строке обязательно дата? |
|
{quote}{login=ДЛ}{date=30.01.2008 03:53}{thema=}{post}Исправьте кусок кода на то что приведено ниже Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами?? Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа. |
|
{quote}{login=ДЛ} |
|
«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}Исправьте кусок кода на то что приведено ниже Почему маленькое??? И почему в некоторых строчках в Cells I и k поменяны местами?? Да, последняя значащая ячейка обязательно дата. Кроме нее есть в строке еще дата (2 столбец) — дата документа.{/post}{/quote} Про cells(i,k) Worksheets(«Лист1»).Cells(I, k).Address Это адреса ячеек которые вы перебираете, думаю всё станет ясно. Но всё таки поробавпли заменить или нет? |
|
{quote} Worksheets(«Лист1»).Cells(I, k).Address Это адреса ячеек которые вы перебираете, думаю всё станет ясно. Но всё таки поробавпли заменить или нет? Да, заменила. Спасибо большое!!!! Все работает!! |
|
{quote}{login=}{date=31.01.2008 07:42}{thema=Re: Re:}{post} Хм…а я считала, что в Cells сначала указывается столбец, а потом строка…оказалось наоборот. Ладно, буду знать |
|
cross Пользователь Сообщений: 89 |
Решил что эта тема подходит к моему вопросу. |
Вы, видимо, хотите очистить ячейки? if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование |
|
cross Пользователь Сообщений: 89 |
{quote}{login=Казанский}{date=24.01.2011 11:21}{thema=Cross}{post}Вы, видимо, хотите очистить ячейки? if MyCell=»» then MyCell.ClearContents ‘очистить содержимое, сохранить форматирование if MyCell=»» then MyCell.Clear ‘очистить содержимое и форматирование{/post}{/quote} |
Попробуйте — обработка выделенного диапазона, очистка пустых на вид ячеек, которые содержат «» как значение формулы либо полученные копированием-вставкой значения таких ячеек. Sub Cross() |
|
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
#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 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?
Здравствуйте!! С наступающим!!!
Вот такая проблемка:
возможно ли реализовать в 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 значений и куда прописываются, надо выложить примерчик на листах экселя- как есть и как хочу.
Может и я на что сгожусь … Если сгодился, можете меня по+благодарить+.
И это все? А я разогнался
Может и я на что сгожусь … Если сгодился, можете меня по+благодарить+.
Всех с Наступающим! Здоровья и удачи!
Если позволите, внесу свои предложения. Дело в том что, вот так организованный код:
Sub primer()
запаисанный в стандартный модуль будет работать на любом листе с которого он будет запущен.
X = 3
For s = 2 to 10
Cells(1, s) = X
X = X * 2
Next
End Sub
А бывает нужно, что бы сей код отрабатывался только на определенном листе:
Sub primer()
— вот его модернизация. Если же вместо Thisworkbook написать Workbooks(«MyBook»), т.е. задать не текущую активную книгу, а определенную, угодную Вам, то и работать код будет только в этой книге!
X = 3
For s = 2 to 10
With Thisworkbook. Worksheets("MySheet")
.Cells(1, s) = X
End With
X = X * 2
Next
End Sub
Может быть Вам уже эти приемы известны?!
Путей к вершине — множество. Этот один из многих!
И от меня наилучшие пожелания и поздравления с наступающим.
Цитата: 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
Такие данные на активном листе 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.