Перебирать значения в excel

Skip to content

Как сделать перебор диапазона ячеек

На чтение 2 мин. Просмотров 14.1k.

Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

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

Код макроса

Sub PereborDiapazonaYacheek()
'Шаг 1: Объявить переменные
Dim MyRange As Range
Dim MyCell As Range
'Шаг 2: Определение целевого диапазона.
Set MyRange = Range("D6:D17")
'Шаг 3: Запуск цикла через диапазон.
For Each MyCell In MyRange
'Шаг 4: Какое-либо действие с каждой ячейкой.
If MyCell.Value > 3000 Then
MyCell.Font.Bold = True
End If
'Шаг 5: Перейти к следующей ячейке в диапазоне
Next MyCell
End Sub

Как этот код работает

  1. Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
  2. На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
  4. После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
  5. На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.

Как использовать

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

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

Содержание

  1. Как сделать перебор диапазона ячеек
  2. Как макрос работает
  3. Код макроса
  4. Как этот код работает
  5. Как использовать
  6. Excel функция перебора значений
  7. Excel функция перебора значений
  8. Использование операторов For Each. Next
  9. Проход по диапазону ячеек
  10. Выход из цикла For Each. Next до его завершения
  11. Использование цикла For Each. Next для итерации в классе VBA
  12. См. также
  13. Поддержка и обратная связь

Как сделать перебор диапазона ячеек

Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.

Как макрос работает

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

Код макроса

Как этот код работает

  1. Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
  2. На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
  4. После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
  5. На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.

Как использовать

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

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

Источник

Excel функция перебора значений

«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке.

«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. dog144

Сообщение «=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.

Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. Автор — dog144
Дата добавления — 14.09.2014 в 18:08

Источник

Excel функция перебора значений

Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.

Заранее благодарен за ответ !

Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.

Заранее благодарен за ответ ! Rafting

Сообщение Добрый день ! Подскажите если знаете. )

Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.

Заранее благодарен за ответ ! Автор — Rafting
Дата добавления — 10.04.2017 в 15:08

sboy Дата: Понедельник, 10.04.2017, 15:52 | Сообщение № 2
Rafting Дата: Вторник, 11.04.2017, 12:49 | Сообщение № 3
_Boroda_ Дата: Вторник, 11.04.2017, 13:28 | Сообщение № 4
Скажи мне, кудесник, любимец ба’гов.
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Ответить

Gustav Дата: Вторник, 11.04.2017, 13:33 | Сообщение № 5

Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов.

Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов. Gustav

Сообщение Да сделайте обыкновенную «таблицу умножения»: в ячейки B1:SF1 с шагом 0,01 протяните 499 значений от 587,01 до 591,99 (колонки), в ячейки A2:A3100 — 3099 значений от 3170,01 до 3200,99. В ячейку B2 — формулу =$A2*B$1 и протяните на весь диапазон B2:SF3100. Дальше обычный Поиск (по Ctrl+F) и ищем значение 1886000.

Показал бы в файле, но файл получился 23 мегабайта. Но в принципе я всё и так рассказал.

P.S. Можно подсветить результаты условным форматированием с формулой: =ЦЕЛОЕ(B2)=1886000 . У меня поиском по кнопке «Найти все» нашлась 51 ячейка (в одной, правда, чуть меньше 1885999,9964, но поскольку отображалась как искомая строка, то тоже поучаствовала). Это было при ширине колонок 80 пикселей. А если увеличить ширину до, скажем, 100 пикселей (при этом в ячейках будут видны 3 знака после запятой), то останутся 50 честных вариантов. Автор — Gustav
Дата добавления — 11.04.2017 в 13:33

Rafting Дата: Вторник, 11.04.2017, 14:05 | Сообщение № 6

Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ.

Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ. Rafting

Сообщение Я уже делал как предлагает Gustav в итоге тратится очень много времени.

Конкретное описание хотелки:

Получаю смету на определенную сумму 1 886 000
Площадь работ по смете 3200 кв.м
Когда заношу данные в электронную систему, система выводит цену за 1 кв.метр равную 1 886 000/3200 = 589,38 (цифра округляется, реальный же результат 589,375. Система выводит значение до сотых) В дальнейшем система начинает ругаться на то что 3200*589,38 не равно 1 886 000. Допустимо менять значения 3200 и 589,38 в небольшом диапазоне. Главное что бы при умножении двух значений получался конкретный результат 1 886 000.
Так как задача регулярная, ищу способ как задать excel цифру которую нужно получить путем умножения числа X на Y. где X — это диапазон значений от 3100,00 до 3300,00 с шагом 0,01 а Y — это диапазон значений от 560,00 до 600,00 с шагом 0,01
Надеюсь понятно объяснил. Заранее благодарю за ответ. Автор — Rafting
Дата добавления — 11.04.2017 в 14:05

Источник

Использование операторов For Each. Next

Операторы For Each. Next повторяют блок операторов для каждого объекта в коллекции или каждого элемента массива. Visual Basic автоматически присваивает переменную при каждом выполнении цикла. Например, следующая процедура добавляет 10 к значению каждой ячейки в диапазоне от A1 до A10.

Указанный ниже код перебирает все элементы массива и устанавливает для каждого из них значение переменной-счетчика I.

Проход по диапазону ячеек

Цикл For Each. Next можно использовать для прохода по диапазону ячеек. Приведенная ниже процедура проходит по диапазону ячеек A1:D10 на листе Sheet1 и присваивает каждой ячейке, абсолютное значение которой меньше 0,01, значение 0 (ноль).

Выход из цикла For Each. Next до его завершения

Из цикла For Each. Next можно выйти с помощью оператора Exit For. Например, при возникновении ошибки можно использовать оператор Exit For в блоке True оператора If. Then. Else или оператора Select Case, который используется непосредственно для проверки ошибок. Если ошибка не возникает, оператор If…Then…Else получает значение False, и цикл продолжает работу.

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

Использование цикла For Each. Next для итерации в классе VBA

Для каждого. Следующие циклы не только итерируют массивы и экземпляры объекта Collection . Они также могут выполнять итерацию в созданном вами классе VBA.

Ниже приведен пример, в котором показано, как это сделать.

Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection. cc1

Вставьте следующий код в только что созданный модуль.

Экспортируйте этот модуль в файл и сохраните его в локальном расположении. cc2

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

Используя текстовый редактор, удалите знак ‘ из первой строки под текстом Property Get NewEnum() As IUnknown в файле. Сохраните измененный файл.

В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса. cc3

Импортируйте файл, из которого вы удалили знак ‘ , назад в VBE. cc4

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

Сноски Описание
[cc1] Вы можете создать модуль класса, выбрав Class Module (Модуль класса) в меню Insert (Вставка). Вы можете переименовать модуль класса, изменив его свойства в окне Properties (Свойства).
[cc2] Вы можете активировать диалоговое окно Экспорт файла, выбрав Export File (Экспорт файла) в меню File (Файл).
[cc3] Вы можете удалить модуль класса из VBE, выбрав Remove Item (Удалить элемент) в меню File (Файл).
[cc4] Вы можете импортировать файл внешнего модуля класса, запустив диалоговое окно Импорт файла (выберите Import File (Импорт файла) в меню File (Файл)).

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Adblock
detector

Содержание

  • 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?

 

Кэтти-бри

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

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

Добрый вечер, уважаемые гуру Excel. Учусь работать в Экселе, изучая разные задачки. Столкнулась вот с одной запаркой, может кто поможет:

Итак, есть две колонки. Например
А                  B
Вася             Иванов
Гена             Петров
Петя              Сидоров

Вопрос. Задать формулами в колонки C и D алгоритм, чтобы перебирались все возможные сочетания (при этом не повторяясь)
Т.е. должны получиться 9 комбинаций, Вася Иванов, Вася Петров…. Петя Сидоров. При этом подразумевается, чтобы формула работала с большой исходной таблицей (например, сорок фамилий и семь имён, всего будет 280 комбинаций, или меньше если какие-то из значений исходника повторяются), при этом чтобы если в исходнике несколько раз встречается одно и то же имяфамилия, то в результате повторов не было, т.е. не было двух Васей Ивановых. Надеюсь, понятно объяснила. Макросом или сводной таблицей всё решается, меня интересует можно ли достичь решения формулами, и если можно, то как это будет выглядеть. Спасибо за внимание.  

Изменено: Кэтти-бри28.02.2017 16:59:42

 

Кэтти-бри

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

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

Догадываюсь, что надо использовать формулу массива, но что-то не получается — видимо навыка не хватает, и где-то ошибаюсь.

 

Кэтти-бри

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

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

Вот перечитывала, поняла, что неверно сформулировала задачу. Значения должны переноситься не в одну колонку, а в две, т.е. перебор девяти значений как в примере должен происходить в колонках C и D соответственно. т.е. — первые три в C — Вася-Вася-Вася, а в D соответствующие им разные фамилии.

 

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

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

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

#4

28.02.2017 17:06:22

Код
=ИНДЕКС(C1;ЦЕЛОЕ((СТРОКА()-1)/СЧЁТЗ(C2))+1)&" "&ИНДЕКС(C2;ОСТАТ(СТРОКА()-1;3)+1)

обошлось обычным ИНДЕКС, без формул массива

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

  • Книга5.xlsx (8.56 КБ)

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

 

Кэтти-бри

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

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

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

 

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

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

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

#6

28.02.2017 17:23:46

в формуле явно видно один ИНДЕКС для имени а второй — для фамилии
а что, самостоятельно разбить формулу на 2 части — никак? возможно Excel — это не Ваше

Цитата
Плюс при растягивании формула ведёт себя не очень корректно

формула ведет себя так, как в ней написано
Вы же прекрасно посчитали, что в случае 3 имени, 3 фамилии будет 9 вариантов сочетаний, а семь имен и 40 фамилий = 280…
не растягивайте формулу за пределы количества сочетаний — и все будет нормально))
или поправьте немного, чтобы «за пределами» формула возвращала пустую строку
удачи!

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

 

Кэтти-бри

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

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

#7

28.02.2017 17:27:24

Цитата
Ігор Гончаренко написал:
в формуле явно видно один ИНДЕКС для имени а второй — для фамилии
а что, самостоятельно разбить формулу на 2 части — никак? возможно Excel — это не Ваше

Уже сделала всё, спасибо большое за помощь. Я просто сказала что должно быть в идеале, вдруг вы любите всё делать идеально. Без Вашей подсказки не справилась бы.

 

Кэтти-бри

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

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

Кстати, проблема всё равно не решена, потому в решении, предложенном пользователем

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

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

 

а если исключить ввод «кривых» значений в данные?

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

 

Кэтти-бри

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

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

#10

28.02.2017 17:56:34

Цитата
Ігор Гончаренко написал:
а если исключить ввод «кривых» значений в данные?

Так вопрос не в «кривых» значениях. Допустим, в этих же колонках например не имя и фамилия, а фамилия и наименование товара. Ну, что продал. Ну скажем:
А_____________________________В
Пупкин_______________________Стиральная машина
Губкин________________________Магнитофон
Пупкин________________________Магнитофон
Губкин_________________________Магнитофон
Канарейкина_____________________вездеход
Тогда в итоге должно получиться
C___________________________________D
Пупкин_______________________________Стиральная машина (в третьей колонке например количество, но как его посчитать даже мне понятно, оно в рамках данной задачи не интересно)
Пупкин________________________________Магнитофон
Пупкин___________________________________вездеход
Губкин____________________________________Стиральная машина…. (и т.д.)
При этом второй раз строки Пупкин — Стиральная машина нам не надо, потому что нам одной строчки достаточно чтобы узнать, сколько он их продал.

 

_Igor_61

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

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

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

Изменено: _Igor_6128.02.2017 22:57:01

 

Кэтти-бри

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

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

Добрый день,

_Igor_61

! Извините, что долго не отвечала, сейчас прикреплю вариант исходника, основанный на вашем же примере. Ваш вариант куда ближе к правде, но он некорректно работает, когда количество заполненных строк и столбцов неодинаково. Я чуть поменяла исходные данные, вот что получилось.
А вообще исходник тоже прикреплю. Вдруг вам так понятнее будет.
В исходнике — первые два листа пишутся от руки, лист Звонки приходит и на его основании автоматически должен формироваться лист Отчёт. Вся загвоздка в правой таблице, а именно в столбцах G и H, не понимаю как сделать чтобы они формировались автоматически путём перебора всех вариантов
направлений из первого листа и сотрудников из второго, исходя из того что и к направлениям, и к фамилиям могут добавляться новые, и тогда количество строк будет изменяться. В присланном примере на листе Отчёт столбцы G и H набиты вручную.

 

Юрий М

Модератор

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

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

Файлы удалил: превышен максимально допустимый размер.

 

_Igor_61

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

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

Уфф… Чем дальше в лес… Кэтти-бри, а Вы не могли бы сформулировать итоговую задачу — что в итоге должно получиться? Нужно посчитать кол-во звонков по каждому сотруднику по каждому направлению, или общее время звонков по каждому сотруднику или что-то еще? Понимаю, что Вам наверное интересно сделать перебор формулой, но тот ли это способ для решения задачи?
 

 

Кэтти-бри

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

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

_Igor_61

, если вы успели скачать удалённый администрацией файл, то должно получиться следующее:
Трёхколоночная таблица списка всех сотрудников, где для каждого из них по каждому направлению (направлению, а не коду оператора, это важно), посчитано суммарное время вызова, при этом она должна растягиваться при добавлении ещё одного сотрудника либо направления. При этом задача элементарно решается при помощи сводной таблицы, или не так элементарно — при помощи макроса. Но задача стоит именно решить только с помощью базовых формул. При этом можно создать энное кол-во вспомогательных листов, если они нужны, или промежуточных операций.

 

Кэтти-бри

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

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

_Igor_61

Ну т.е. исходя из вашей формулировки — по общее время звонка по каждому сотруднику по каждому направлению.

 

_Igor_61

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

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

 

Кэтти-бри

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

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

Фантастика. Всё правильно, всё работает. Огромное спасибо. Пошла разбираться как Вы этого добились.

 

_Igor_61

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

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

:)

 

Андрей VG

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

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

Excel 2016, 365

#20

01.03.2017 15:04:25

Доброе время суток.
Не прошло и суток, чтобы понять что

чукча

Кэтти хочет :)
Вариант на Power Pivot.

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

  • Кто-куда звонил.zip (89.22 КБ)

Изменено: Андрей VG01.03.2017 15:09:38
(Поменял формат, а то суммарная длительность за сутки перевалила :) )

Всем привет! Такой вопрос:
Нужно перебирать значения ячеек от A2 до A1000 сравнивая их с ячейкой B3, пока они совпадают — выдавать результат, как только совпадение прекратилось, останавливать перебор.

Подробно:
Есть 2 вкладки — Работа и ЗП. Во вкладе ‘Работа’ ячейки с датами и именами промоутеров:

Во вкладке ‘ЗП’ список с именами промоутеров:

Мне нужно чтоб при выборе даты (ячейка «B3») во вкладке ‘ЗП’, список ‘Промик’ заполнялся сам. Тоесть, если я выбираю дату 19.04.22, нужно чтоб формула начинала перебор всех дат во вкладе ‘Работа’, и все промоутеры которые выходили в этот день отображались в списке промоутеров во вкладке «ЗП» (в моем случае, имена — Данил (1030), Даниил, Саша).

Надеюсь понятно объяснил :)
Буду очень благодарен, если кто-то поможет разобраться с этим.

Понравилась статья? Поделить с друзьями:
  • Перевести page в word
  • Перевести otd в word онлайн
  • Перевести old в word
  • Перевести jpg в редактируемый word
  • Перевести jpg в word в онлайн конвертер для редактирования