SanShiney Пользователь Сообщений: 101 |
Друзья, Появилась задача, которую я не могу корректно сформулировать в коде VBA. Высота колнки А может меняться. Для примера, я сделал 3 ячейки. Но если высота данных 10, 20, 30 то задача усложняется. И я не могу этот алгоритм написать в VBA. Поиском пользовался. Но запрос сложно унифицировать в поиске, поэтому, я не нашел того что искал… =( |
МатросНаЗебре Пользователь Сообщений: 5516 |
#2 27.09.2016 17:15:09
Вы даже не представляете насколько задача усложняется. 2 в степени 30 это 1 073 741 824. |
||
SanShiney Пользователь Сообщений: 101 |
#3 27.09.2016 17:18:36
Согласен! |
||
Зачем вам такой перебор? Надо выводить каждый разряд в отдельную ячейку или нет? Изменено: Сергей Беляев — 27.09.2016 17:32:20 |
|
тут файл на 19 знакомест Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
МатросНаЗебре Пользователь Сообщений: 5516 |
#6 27.09.2016 17:46:57
Подумайте, куда Вы хотите результат вывести. |
||
SanShiney Пользователь Сообщений: 101 |
#7 27.09.2016 17:55:51
Надо каждый вариант подставить в колонку A.
Я понял, что через цикл надо. Иначе никак. Но про десятичное число — не понял… =( |
||||
SanShiney Пользователь Сообщений: 101 |
#8 27.09.2016 17:59:16
Как сказал чуть выше, хочу вывести каждый результат в колонку А. Затем затереть его следующим. Сама по себе задача кажется безсмысленной. Но это часть большей задачи. А её целиком приводить не вижу смысла. Хотя, финальным результатом заделюсь. Думаю, он может быть полезен. |
||
SanShiney Пользователь Сообщений: 101 |
vikttur, извиняюсь. |
vikttur Пользователь Сообщений: 47199 |
Какой смысл выводить результат, если его сразу же затирать? Если будете прятать свою задумку, то и помощь получите соответствующую. Непонятно ведь. |
файл см. сообщение #5 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
SanShiney Пользователь Сообщений: 101 |
Смысл в следующем: Файл рабочего примера в приложении. Изменено: SanShiney — 27.09.2016 18:20:11 |
SanShiney Пользователь Сообщений: 101 |
Ігор Гончаренко, |
vikttur Пользователь Сообщений: 47199 |
#14 27.09.2016 18:48:38 Подбор суммы |
Задача: Есть набор целых чисел (числа не повторяются)
Необходимо в Excel написать макрос, который выводит на лист «Результат» все комбинации чисел из набора, дающие в сумме 40. Каждое число можно использовать один раз. Полный перебор комбинаций нежелателен.
Дано: Книга Excel, сотоящая из двух листов. На первом листе (sh1) во второй строке располагается набор целых чисел, а в четвертой строке – необходимая сумма. На втором листе (sh2) будут хранится временные массивы и итоговый результат.
Решение: нижеследующий код из двух процедур находит нужные комбинации не прибегая к полному перебору:
Private Sub Main() sh2.Cells.ClearContents lastCol = sh1.Cells(2, sh1.Columns.Count).End(xlToLeft).Column sSum = sh1.Cells(4, 1).Value '"Сумма для подбора" '"Временный массив исходных чисел". Заполняем нулями sh2.Range(sh2.Cells(1, 1), sh2.Cells(1, sSum)).Value = Evaluate("=0") '"Временный массив с решением". Заполняем нулями sh2.Range(sh2.Cells(2, 1), sh2.Cells(2, sSum)).Value = Evaluate("=0") For i = 1 To lastCol 'Заполнение массива исходных чисел nNum = sh1.Cells(2, i).Value If nNum <= sSum Then '"Временный массив исходных чисел". 'Количество элементов равно значению Суммы для подбора 'На места, номера которых соответствуют значениям 'из набора чисел для суммирования, ставятся единицы sh2.Cells(1, nNum) = 1 End If Next i sh2.Cells(3, 1).Value = "Результат:" Call PoiskComb(sSum, sSum) 'Поиск решений sh2.Rows("1:1").Delete Shift:=xlUp sh2.Rows("1:1").Delete Shift:=xlUp sh2.Activate sh2.Range("A1").Select End Sub
'Поиск комбинаций чисел из "Временног массива решений" '(максимальное не больше Ni), дающих в сумме N Sub PoiskComb(N, Ni) For i = Ni To 1 Step -1 If sh2.Cells(1, i) = 1 Then N1 = N - i If N1 = 0 Then 'Запись подходящей комбинации '--- 'Поиск послденей строки на листе с Результатом k = sh2.Cells(sh2.Rows.Count, 2).End(xlUp).Row + 1 'Добавляем последнее число из комбинации 'во "Временный массив с решением" sh2.Cells(2, i) = 1 lastColSol = sh2.Cells(2, sh2.Columns.Count).End(xlToLeft).Column For j = 1 To lastColSol 'Запись очередного решения If sh2.Cells(2, j) = 1 Then lastColI = sh2.Cells(k, sh2.Columns.Count). _ End(xlToLeft).Column sh2.Cells(k, lastColI + 1) = j End If Next j 'Убираем последнее число из комбинации 'из "Временного массива с решением" для поиска других 'возможных решений sh2.Cells(2, i) = 0 ElseIf N1 > 0 Then 'Если сумма выбранных чисел всё ещё меньше, 'чем "Сумма для подбора", то ищем числа, в сумме 'дающие недостающий остаток '--- 'Добавляем во "Временный массив с решением" последнее выбранное 'число и убираем его из "Временного массива исходных чисел" sh2.Cells(2, i) = 1 sh2.Cells(1, i) = 0 Call PoiskComb(N1, i) 'Возвращаем это же число во "Временный массив исходных чисел" 'и удаляем его из "Временного массива с решением" sh2.Cells(2, i) = 0 sh2.Cells(1, i) = 1 End If End If Next i End Sub
Итог: на выходе алгоритма имеем следующие комбинации на листе «Результат» (каждая строка – новая комбинация):
1 9 30 2 8 30 3 7 30 1 2 7 30 2 3 5 30 1 3 11 25 1 5 9 25 1 2 3 9 25 7 8 25 2 5 8 25 3 5 7 25 1 2 5 7 25 5 7 8 9 11 2 3 7 8 9 11
Комментировать
получение всех комбинаций заданных чисел
Автор Marine, 09.11.2008, 01:02
« назад — далее »
Всем добрый день!
Помогите решить такую задачу — нужно получить все комбинации из заданного диапазона чисел, например, мы имеем 4 числа: 20, 10, 5, 3 -должны получиться следующие наборы: 1) 20 2) 20, 10 3) 20, 10, 5 4) 20, 10, 5, 3 5) 10 6) 10, 20 7) 10, 5, 3 10, 5, 3, 20 и т.д.
Цитата: Marine от 09.11.2008, 01:02
Всем добрый день!
Нужно получить все комбинации из заданного диапазона чисел.
Добрый день, Marine. Ловите свежеиспечённый код.
Sub SHpetsBrute()
Dim Flag As Boolean 'признак повтора числа
Dim CVal As Byte 'кол-во чисел
Dim n As Byte 'счётчик степени числа
Dim Komb As Single 'кол-во всех комбинаций
Dim i As Single 'счётчик комбинаций
Dim m As Single 'текущая комбинация
Dim numb As Single 'следующая цифра
Dim Chislo As String 'число в соответствующей системе исчисления
Dim smv As Byte 'текущий знак комбинации
Dim tmp As String 'строка для вывода на лист
Dim nex As Long 'счётчик строк
'------------------- Защита "от дураков" ------------------------------------------
If Not TypeName(Selection) = "Range" Then Exit Sub 'СТОП, если выделен не диапазон
If Selection.Columns.Count > 1 Then
MsgBox "Числа должны располагаться вертикально!", 16, "Ошибка!"
Exit Sub
ElseIf Selection.Count < 8 Then
MVal = Application.Transpose(Selection) 'переносим числа в массив VBA
CVal = UBound(MVal) 'и сколько же их?
Else
MsgBox "Количество чисел не должно превышать 7-ми!", 16, "Внимание!"
Exit Sub
End If
'-----------------------------------------------------------------------------------
For n = 1 To CVal 'определяем кол-во комбинаций
Komb = Komb + CVal ^ n
Next
Application.ScreenUpdating = False 'обновление экрана: выкл.
For i = 1 To Komb 'перелистываем комбинации
m = i 'работаем с копией
While m <> 0 'преобразуем число из десятичной системы в требуемую
numb = m - Int((m - 1) / CVal) * CVal 'определяем цифру текущей значности
If InStr(1, Chislo, numb) = 0 Then 'проверяем: уникально ли число в наборе
Chislo = numb & Chislo 'собираем число в набор
m = Int((m - 1) / CVal) 'переходим к следующей значности
Else
Flag = True 'получившийся набор неподходящий
m = 0 'преждевременный выход из цикла
End If
Wend
If Not Flag Then 'если число подходящее
For smv = 1 To Len(Chislo) 'расставляем исходные числа в полученной последовательности
tmp = tmp & "[" & MVal(Mid(Chislo, smv, 1)) & "]" 'заключаем числа к кв. скобки
Next
ActiveCell.Offset(nex, 1) = tmp 'выводим на лист
nex = nex + 1 'номер следующей строки
End If
Chislo = "": tmp = "": Flag = False 'очищаем переменные для след. цикла
Next
Application.ScreenUpdating = True 'обновление экрана: вкл.
End Sub
Инструкция: нужно выделить столбец с числами (или текстом) и выполнить макрос.
PS: Постарался сделать максимально удобно и понятно, но если что не так – обращайтесь.
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли
Спасибо, огромное, вы мне очень помогли!
подправье код, чтобы все полученные цифры в комбинации суммироавлись между собой.
Спасибо.
Вот правка для вывода сумм:
'...
For smv = 1 To Len(Chislo)
dig = MVal(Mid(Chislo, smv, 1)): s = s + dig
tmp = tmp & "[" & dig & "]" 'заключаем числа к кв. скобки
Next
ActiveCell.Offset(nex, 2) = s: s = 0
ActiveCell.Offset(nex, 1) = tmp 'выводим на лист
nex = nex + 1 'номер следующей строки
'...
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли
Спасибо огромное.
Извините за беспокойство. Но можно то же самое но для 16 цифр и без перестановки цифр местами а только чтобы по одной сумме на один набор? чтобы один результат не повторялся а был вывод только количества результатов без возможных перестановок одних и тех же цифр. где и что мне нужно поменять?
Спасибо еще раз
ЦитироватьНо можно то же самое но для 16 цифр и без перестановки цифр местами а только чтобы по одной сумме на один набор? чтобы один результат не повторялся а был вывод только количества результатов без возможных перестановок одних и тех же цифр. где и что мне нужно поменять?
Обязательно макросом нужно? формулами не подойдет? (хотя макрос не сложный)
Количество возможных сочетаний 16 чисел (без их перестановок): 2^16-1 = 65535
Вообще желательно макросом для простоты и скорости. И редактировать легче.
Спасибо за файл.
Но там должны подсчитываться комбинации дробных чисел. а тут только целые.
Цитата: radist108 от 24.08.2011, 15:22
Вообще желательно макросом для простоты и скорости. И редактировать легче.
Спасибо за файл.
Но там должны подсчитываться комбинации дробных чисел. а тут только целые.
Приложите свой пример, что есть и что хотите получить.
Дальнейшая цель какая? что нужно в итоге?
Нужно вывести по одной сумме каждого набора 16 чисел цисел. от суммы первого и второго до всех 16-ти чисел целиком.
примерно как в примере ниже. только этот скрипт рассчитан на 7 цифр и он выдает сумму всей комбинации каждого набора. А от перемены мест слагаемых сумма не меняется. Так что нужо всего по одной сумме на комплект.
Немного попаразитировал на макросе Шпеца Докапыча (взял обвязку)
Само тело макроса не сложное:
Komb = 2 ^ CVal - 1
For i = 1 To Komb
m = i
tmp = "": s = 0
For j = 1 To CVal
If m Mod 2 Then tmp = tmp & "[" & MVal(j) & "]": s = s + MVal(j)
m = m 2: If m = 0 Then Exit For
Next j
ActiveCell.Offset(nex, 2) = s: ActiveCell.Offset(nex, 1) = tmp
nex = nex + 1
Next i
Спасибо огромное!
А как теперь сделать чтобы ограничение было не на 7 цифр а гораздо больше? Нарпимер 18
Цитата: radist108 от 25.08.2011, 00:00
А как теперь сделать чтобы ограничение было не на 7 цифр а гораздо больше? Нарпимер 18
radist108, Вы файл «пример комбинаций.xls» из моего предыдущего поста смотрели? там ограничение 16 чисел,
Ограничение задается в строке:
ElseIf Selection.Count <= 16 Then
При данном выводе на экран не рекомендую делать свыше 20 чисел (для 2007/2010 офиса) и свыше 16 (для 2003).
А может задача шире? Нужно найти все комбинации сложения чисел для подгонки под нужную сумму?
еще раз спасибо.
Ну вообще да. Это было бы замечательно. Хотябы чтобы выводил ближайшее значение +/-. Просто неловко напрягать вас
Немного подправил макрос, выдает все комбинации, точно соответствующие нужной сумме
если чисел больше 20-25, то на то что-бы перебрать все комбинации уйдет очень много времени
Реализация подобной задачи на формулах, если не находится нужная сумма, то подберет ближайшее значение.
В 2003 офисе смог реализовать перебор из 12 чисел (из-за ограничений функций МУМНОЖ и СТРОКА), в 2007/2010 можно реализовать перебор из 19 чисел.
Очень хорошо! Спасибо
Только этот скрипт не на все вводимые числа реагирует. Он допервого или до второго знака вычисляет?
Можно чтобы программа выдавала приближонное значение, если нет требуемой суммы? (Подбор под нужную сумму.xls)
Хорошо. Мне нравится. Но если выделить все цифры и начать подбор с запростом 1,8 с откролонением 0,1 то он пишет что требуемая сумма не найдена.
Вы итак много сделали. И если я вам порядком надоел то наверное не буду больше докучать. Спасибо большое
Цитата: radist108 от 25.08.2011, 23:03
Но если выделить все цифры и начать подбор с запростом 1,8 с откролонением 0,1 то он пишет что требуемая сумма не найдена.
Наберите в поисковике — IEEE 754.
Это проблема не только Excel, но и других программ, использующих данный стандарт представления чисел с плавающей точкой.
Чтобы нейтрализовать данную проблему, поправте в макросе строчку:
If Abs(s - nS) <= dopusk + 0.000001 Then
Спасибо большое. Больше не буду донимать. Этого более чем достаточно
а что поменять в макросе чтобы вместо цифр выводил все комбинации заданных слов?
Сергей Шабалов, Вы про какой макрос говорите? если про последний, то он делает подбор слагаемых под нужную сумму и для слов его не переделаешь.
Нужны перестановки слов? или все возможные сочетания слов включая повторы? или еще что нибудь?
Опишите подробнее задачу, что нужно, а лучше приложите xls файл.
Добрый день, коллеги
Критически необходима ваша помощь. Разрабатываю сейчас модель, которая позволит существенно сократить затраты на покупку углей для составления шихты. Весь механизм проработан, единственное нужно, чтобы кто-то помог с реализацией точечной задачи
Есть массив данных, который сформирован благодаря дозированию компонентов в шихту, нужно чтобы из этого массива перечислить все возможные комбинации, которые бы удовлетворяли условию, при котором сумма компонентов в шихтовке не превышала 100%+-0,1%.
Если это не под силу программе, то в скрытом листе полный пример, в котором указаны дополнительные условия, которые должны соблюдаться. Это должно существенно сократить массив комбинаций. Если не получится, прошу рассмотреть пример в скрытом листе. Заранее очень благодарен.
Здравствуйте ! Мне надо получить набор уникальных комбинаций 4 из 20 ( то есть четыре различных номера из двадцати чисел , без повторений к примеру что бы не было так 12345 и 23451 по тому что одно и то же ) . И можно ли это сделать через pascal abc или другую программу ?
- Профессиональные приемы работы в Microsoft Excel
-
►
Обмен опытом -
►
Microsoft Excel -
►
получение всех комбинаций заданных чисел
В Excel есть множество функций, позволяющих получить очень полезные результаты в математике и финансах, если назвать всего две категории. По этой причине мы рекомендуем вам установить Microsoft Office и прочтите эту статью, из которой вы узнаете чтобы перечислить все комбинации с функцией КОМБИНАТ в Excel
Что такое комбинация?
Вероятно, комбинация — это метод подсчета, используемый для получить количество групп элементов что можно взять из набора. Важно отметить, что элементы не повторяются, порядок не имеет значения, можно использовать числовые значения или символы, что выражается формулой C n, k = n! / (нк)! * к!
Функция COMBINATE в Excel
Функция КОМБИНАТ — это формула Excel, которая позволяет получить количество комбинаций для набора элементов. Таким образом, функция COMBINATE в Excel предоставляет общее количество групп, которые могут быть созданы из определенного количества элементов.
Функция COMBINAT в Excel поддерживает только числовые значения, и если некоторый текст включен в ячейки, которые будут аргументами формулы, будет получен усеченный результат, а на выходе #VALUE! Если один из аргументов содержит значение меньше 0, функция возвращает ошибку # ЧИСЛО!
Как перечислить все комбинации с функцией COMBINATE в Excel
Если вы хотите перечислить все комбинации с функцией COMBINATE в Excel, необходимо знать синтаксис требуется эту формулу и применить дополнительную процедуру в случае, если список групп включает текст вместо числовых значений.
Каков синтаксис функции КОМБИНАТ в Excel?
Синтаксис функции КОМБИНАТ в Excel имеет два аргумента. Первый аргумент относится к общему количеству элементов, а второй — к количеству элементов, разрешенных в каждой комбинации. Оба аргумента обязательны и выражаются так: = КОМБИНАТ (число, размер)
Перечислите количество возможных комбинаций с функцией КОМБИНАТ в Excel
Чтобы перечислить количество возможных комбинаций с помощью функции COMBINATE в Excel, вам необходимо вставить список предметов который будет использоваться как диапазон ячеек. Предположим, у вас есть список из восьми учеников, и вы хотите сгруппировать их в пары. Чтобы увидеть список всех возможных комбинаций, нам понадобится функция COMBINAT.
Напишите имя каждого ученика от A1 до A8. Для этого вы можете создать сводную таблицу . Перейдите к строке формул и выберите категорию «Математика и тригонометрия». Найдите функцию COMBINAT и нажмите «ОК». В «Число» нажмите значок красной стрелки, чтобы выбрать диапазон A1: A8, а в «Размер» введите 2 и нажмите «ОК».
Список всех комбинаций с функцией COMBINATE в Excel
Если вам нужно перечислить все комбинации с Функция COMBINATE в Excel, это необходимо создать макрос для выполнения процедуры. Для этого разделите имена на два столбца (A и B) и нажмите «Alt + F11». Таким образом вы получите доступ к редактору Visual Basic. Затем нажмите «Вставить» и «Модуль».
Вставьте следующие строки кода, чтобы вы могли видеть комбинации (вы должны помнить, что точки в начале каждой строки не входят в код):
- Под комбайном ()
- Dim i как целое, j как целое, LastRA как целое, LastRB как целое, Aux как целое
- Вспомогательный = 1
- LastRA = Диапазон («A4»). Конец (xlUp) .Row
- LastRB = Диапазон («B4»). Конец (xlUp) .Row
- Для i = 1 ТБ LastRA
- Для j = 1 ТБ LastRB
- Диапазон («C» & Aux) = Range («A» & i) & Range («B» & j)
- Вспомогательный = Вспомогательный + 1
- Следующий j
- Затем я
- End Sub
Как работает макрос для выполнения слияния
Чтобы комбинация была проведена, вы должны указать, что из всего «n» элементов (8 имен учащихся) возможно получить группы элементов без повторения и независимо от порядка, в котором они появляются.
При выборе диапазона или всех элементов столбец «C» получит возможные комбинации посредством поворота в два цикла для столбцов A и B. Удобно отметить, что если вы решите загрузите и установите LibreOffice на вашем компьютере вы не сможете разработать макрос, потому что это программное обеспечение несовместимо с приложениями Visual Basic.
#Руководства
- 23 май 2022
-
0
Как с помощью макросов автоматизировать рутинные задачи в Excel? Какие команды они выполняют? Как создать макрос новичку? Разбираемся на примере.
Иллюстрация: Meery Mary для Skillbox Media
Рассказывает просто о сложных вещах из мира бизнеса и управления. До редактуры — пять лет в банке и три — в оценке имущества. Разбирается в Excel, финансах и корпоративной жизни.
Макрос (или макрокоманда) в Excel — алгоритм действий в программе, который объединён в одну команду. С помощью макроса можно выполнить несколько шагов в Excel, нажав на одну кнопку в меню или на сочетание клавиш.
Обычно макросы используют для автоматизации рутинной работы — вместо того чтобы выполнять десяток повторяющихся действий, пользователь записывает одну команду и затем запускает её, когда нужно совершить эти действия снова.
Например, если нужно добавить название компании в несколько десятков документов и отформатировать его вид под корпоративный дизайн, можно делать это в каждом документе отдельно, а можно записать ход действий при создании первого документа в макрос — и затем применить его ко всем остальным. Второй вариант будет гораздо проще и быстрее.
В статье разберёмся:
- как работают макросы и как с их помощью избавиться от рутины в Excel;
- какие способы создания макросов существуют и как подготовиться к их записи;
- как записать и запустить макрос начинающим пользователям — на примере со скриншотами.
Общий принцип работы макросов такой:
- Пользователь записывает последовательность действий, которые нужно выполнить в Excel, — о том, как это сделать, поговорим ниже.
- Excel обрабатывает эти действия и создаёт для них одну общую команду. Получается макрос.
- Пользователь запускает этот макрос, когда ему нужно выполнить эту же последовательность действий ещё раз. При записи макроса можно задать комбинацию клавиш или создать новую кнопку на главной панели Excel — если нажать на них, макрос запустится автоматически.
Макросы могут выполнять любые действия, которые в них запишет пользователь. Вот некоторые команды, которые они умеют делать в Excel:
- Автоматизировать повторяющиеся процедуры.
Например, если пользователю нужно каждый месяц собирать отчёты из нескольких файлов в один, а порядок действий каждый раз один и тот же, можно записать макрос и запускать его ежемесячно.
- Объединять работу нескольких программ Microsoft Office.
Например, с помощью одного макроса можно создать таблицу в Excel, вставить и сохранить её в документе Word и затем отправить в письме по Outlook.
- Искать ячейки с данными и переносить их в другие файлы.
Этот макрос пригодится, когда нужно найти информацию в нескольких объёмных документах. Макрос самостоятельно отыщет её и принесёт в заданный файл за несколько секунд.
- Форматировать таблицы и заполнять их текстом.
Например, если нужно привести несколько таблиц к одному виду и дополнить их новыми данными, можно записать макрос при форматировании первой таблицы и потом применить его ко всем остальным.
- Создавать шаблоны для ввода данных.
Команда подойдёт, когда, например, нужно создать анкету для сбора данных от сотрудников. С помощью макроса можно сформировать такой шаблон и разослать его по корпоративной почте.
- Создавать новые функции Excel.
Если пользователю понадобятся дополнительные функции, которых ещё нет в Excel, он сможет записать их самостоятельно. Все базовые функции Excel — это тоже макросы.
Все перечисленные команды, а также любые другие команды пользователя можно комбинировать друг с другом и на их основе создавать макросы под свои потребности.
В Excel и других программах Microsoft Office макросы создаются в виде кода на языке программирования VBA (Visual Basic for Applications). Этот язык разработан в Microsoft специально для программ компании — он представляет собой упрощённую версию языка Visual Basic. Но это не значит, что для записи макроса нужно уметь кодить.
Есть два способа создания макроса в Excel:
- Написать макрос вручную.
Это способ для продвинутых пользователей. Предполагается, что они откроют окно Visual Basic в Еxcel и самостоятельно напишут последовательность действий для макроса в виде кода.
- Записать макрос с помощью кнопки меню Excel.
Способ подойдёт новичкам. В этом варианте Excel запишет программный код вместо пользователя. Нужно нажать кнопку записи и выполнить все действия, которые планируется включить в макрос, и после этого остановить запись — Excel переведёт каждое действие и выдаст алгоритм на языке VBA.
Разберёмся на примере, как создать макрос с помощью второго способа.
Допустим, специальный сервис автосалона выгрузил отчёт по продажам за три месяца первого квартала в формате таблиц Excel. Эти таблицы содержат всю необходимую информацию, но при этом никак не отформатированы: колонки слиплись друг с другом и не видны полностью, шапка таблицы не выделена и сливается с другими строками, часть данных не отображается.
Скриншот: Skillbox Media
Пользоваться таким отчётом неудобно — нужно сделать его наглядным. Запишем макрос при форматировании таблицы с продажами за январь и затем применим его к двум другим таблицам.
Готовимся к записи макроса
Кнопки для работы с макросами в Excel находятся во вкладке «Разработчик». Эта вкладка по умолчанию скрыта, поэтому для начала разблокируем её.
В операционной системе Windows это делается так: переходим во вкладку «Файл» и выбираем пункты «Параметры» → «Настройка ленты». В открывшемся окне в разделе «Основные вкладки» находим пункт «Разработчик», отмечаем его галочкой и нажимаем кнопку «ОК» → в основном меню Excel появляется новая вкладка «Разработчик».
В операционной системе macOS это нужно делать по-другому. В самом верхнем меню нажимаем на вкладку «Excel» и выбираем пункт «Параметры…».
Скриншот: Skillbox Media
В появившемся окне нажимаем кнопку «Лента и панель».
Скриншот: Skillbox Media
Затем в правой панели «Настроить ленту» ищем пункт «Разработчик» и отмечаем его галочкой. Нажимаем «Сохранить».
Скриншот: Skillbox Media
Готово — вкладка «Разработчик» появилась на основной панели Excel.
Скриншот: Skillbox Media
Чтобы Excel смог сохранить и в дальнейшем использовать макрос, нужно пересохранить документ в формате, который поддерживает макросы. Это делается через команду «Сохранить как» на главной панели. В появившемся меню нужно выбрать формат «Книга Excel с поддержкой макросов».
Скриншот: Skillbox Media
Перед началом записи макроса важно знать об особенностях его работы:
- Макрос записывает все действия пользователя.
После старта записи макрос начнёт регистрировать все клики мышки и все нажатия клавиш. Поэтому перед записью последовательности лучше хорошо отработать её, чтобы не добавлять лишних действий и не удлинять код. Если требуется записать длинную последовательность задач — лучше разбить её на несколько коротких и записать несколько макросов.
- Работу макроса нельзя отменить.
Все действия, которые выполняет запущенный макрос, остаются в файле навсегда. Поэтому перед тем, как запускать макрос в первый раз, лучше создать копию всего файла. Если что-то пойдёт не так, можно будет просто закрыть его и переписать макрос в созданной копии.
- Макрос выполняет свой алгоритм только для записанного диапазона таблиц.
Если при записи макроса пользователь выбирал диапазон таблицы, то и при запуске макроса в другом месте он выполнит свой алгоритм только в рамках этого диапазона. Если добавить новую строку, макрос к ней применяться не будет. Поэтому при записи макроса можно сразу выбирать большее количество строк — как это сделать, показываем ниже.
Для начала записи макроса перейдём на вкладку «Разработчик» и нажмём кнопку «Записать макрос».
Скриншот: Skillbox Media
Появляется окно для заполнения параметров макроса. Нужно заполнить поля: «Имя макроса», «Сохранить в», «Сочетание клавиш», «Описание».
Скриншот: Skillbox Media
«Имя макроса» — здесь нужно придумать и ввести название для макроса. Лучше сделать его логически понятным, чтобы в дальнейшем можно было быстро его найти.
Первым символом в названии обязательно должна быть буква. Другие символы могут быть буквами или цифрами. Важно не использовать пробелы в названии — их можно заменить символом подчёркивания.
«Сохранить в» — здесь нужно выбрать книгу, в которую макрос сохранится после записи.
Если выбрать параметр «Эта книга», макрос будет доступен при работе только в этом файле Excel. Чтобы макрос был доступен всегда, нужно выбрать параметр «Личная книга макросов» — Excel создаст личную книгу макросов и сохранит новый макрос в неё.
«Сочетание клавиш» — здесь к уже выбранным двум клавишам (Ctrl + Shift в системе Windows и Option + Cmd в системе macOS) нужно добавить третью клавишу. Это должна быть строчная или прописная буква, которую ещё не используют в других быстрых командах компьютера или программы Excel.
В дальнейшем при нажатии этих трёх клавиш записанный макрос будет запускаться автоматически.
«Описание» — необязательное поле, но лучше его заполнять. Например, можно ввести туда последовательность действий, которые планируется записать в этом макросе. Так не придётся вспоминать, какие именно команды выполнит этот макрос, если нужно будет запустить его позже. Плюс будет проще ориентироваться среди других макросов.
В нашем случае с форматированием таблицы заполним поля записи макроса следующим образом и нажмём «ОК».
Скриншот: Skillbox Media
После этого начнётся запись макроса — в нижнем левом углу окна Excel появится значок записи.
Скриншот: Skillbox Media
Пока идёт запись, форматируем таблицу с продажами за январь: меняем ширину всех столбцов, данные во всех ячейках располагаем по центру, выделяем шапку таблицы цветом и жирным шрифтом, рисуем границы.
Важно: в нашем случае у таблиц продаж за январь, февраль и март одинаковое количество столбцов, но разное количество строк. Чтобы в случае со второй и третьей таблицей макрос сработал корректно, при форматировании выделим диапазон так, чтобы в него попали не только строки самой таблицы, но и строки ниже неё. Для этого нужно выделить столбцы в строке с их буквенным обозначением A–G, как на рисунке ниже.
Скриншот: Skillbox Media
Если выбрать диапазон только в рамках первой таблицы, то после запуска макроса в таблице с большим количеством строк она отформатируется только частично.
Скриншот: Skillbox Media
После всех манипуляций с оформлением таблица примет такой вид:
Скриншот: Skillbox Media
Проверяем, все ли действия с таблицей мы выполнили, и останавливаем запись макроса. Сделать это можно двумя способами:
- Нажать на кнопку записи в нижнем левом углу.
- Перейти во вкладку «Разработчик» и нажать кнопку «Остановить запись».
Скриншот: Skillbox Media
Готово — мы создали макрос для форматирования таблиц в границах столбцов A–G. Теперь его можно применить к другим таблицам.
Запускаем макрос
Перейдём в лист со второй таблицей «Февраль_2022». В первоначальном виде она такая же нечитаемая, как и первая таблица до форматирования.
Скриншот: Skillbox Media
Отформатируем её с помощью записанного макроса. Запустить макрос можно двумя способами:
- Нажать комбинацию клавиш, которую выбрали при заполнении параметров макроса — в нашем случае Option + Cmd + Ф.
- Перейти во вкладку «Разработчик» и нажать кнопку «Макросы».
Скриншот: Skillbox Media
Появляется окно — там выбираем макрос, который нужно запустить. В нашем случае он один — «Форматирование_таблицы». Под ним отображается описание того, какие действия он включает. Нажимаем «Выполнить».
Скриншот: Skillbox Media
Готово — вторая таблица с помощью макроса форматируется так же, как и первая.
Скриншот: Skillbox Media
То же самое можно сделать и на третьем листе для таблицы продаж за март. Более того, этот же макрос можно будет запустить и в следующем квартале, когда сервис автосалона выгрузит таблицы с новыми данными.
Научитесь: Excel + Google Таблицы с нуля до PRO
Узнать больше