Макрос всех комбинаций в excel

 

SanShiney

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

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

Друзья,

Появилась задача, которую я не могу корректно сформулировать в коде VBA.
ДАНО:
Есть диапазон в колонке А. Диапазон содержит нули.

Высота колнки А может меняться. Для примера, я сделал 3 ячейки.
В этих 3х ячейках надо по очереди перебрать все возможные варианты комбинации единиц и нулей.
Для данного примера, это 8 возможных вариантом.

Но если высота данных 10, 20, 30 то задача усложняется.

И я не могу этот алгоритм написать в VBA.
Может кто это уже делал?
Помогите с кодом на перебор.

Поиском пользовался. Но запрос сложно унифицировать в поиске, поэтому, я не нашел того что искал… =(
Заранее благодарен.

 

МатросНаЗебре

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

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

#2

27.09.2016 17:15:09

Цитата
SanShiney написал:
Но если высота данных 10, 20, 30 то задача усложняется.

Вы даже не представляете насколько задача усложняется.

2 в степени 30 это 1 073 741 824.
А в Excel только 16 384 столбца (2 в 14-й степени).

 

SanShiney

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

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

#3

27.09.2016 17:18:36

Цитата
МатросНаЗебре написал: А в Excel только 16 384 столбца (2 в 14-й степени).

Согласен!
Это большая цифра. Я понимаю, что это должно делаться в VBA массиве.
Там это возможно.
Но, всё же, я не могу понять, как это корректно реализовать.

 

Зачем вам такой перебор? Надо выводить каждый разряд в отдельную ячейку или нет?
Вроде все просто — в цикле переводите десятичное число от 0 до 2^n в двоичное, где n-ваше начальное кол-во нулей.

Изменено: Сергей Беляев27.09.2016 17:32:20

 

тут

файл на 19

знакомест
524288 вариантов (он довольно тяжелый)

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

 

МатросНаЗебре

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

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

#6

27.09.2016 17:46:57

Цитата
SanShiney написал: это должно делаться в VBA массиве.

Подумайте, куда Вы хотите результат вывести.
В столбцы, как Вы указали, не получится.

 

SanShiney

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

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

#7

27.09.2016 17:55:51

Цитата
Сергей Беляев написал: Зачем вам такой перебор? Надо выводить каждый разряд в отдельную ячейку или нет?

Надо каждый вариант подставить в колонку A.
На примере, вариант в колонке C подставить в колонку А, затем D в А, E в А и т.д.

Цитата
Сергей Беляев написал: в цикле переводите десятичное число от 0 до 2^n в двоичное, где n-ваше начальное кол-во нулей.

Я понял, что через цикл надо. Иначе никак. Но про десятичное число — не понял… =(

 

SanShiney

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

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

#8

27.09.2016 17:59:16

Цитата
МатросНаЗебре написал:
В столбцы, как Вы указали, не получится.

Как сказал чуть выше, хочу вывести каждый результат в колонку А. Затем затереть его следующим.
Говоря проще, хочу перебрать возможные варианты. Начиная с 1 до последнего.

Сама по себе задача кажется безсмысленной. Но это часть большей задачи. А её целиком приводить не вижу смысла. Хотя, финальным результатом заделюсь. Думаю, он может быть полезен.

 

SanShiney

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

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

vikttur, извиняюсь.
с телеофна писал. не туда щёлкнул, видимо…

 

vikttur

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

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

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

 

файл см. сообщение #5
отмечаете по 16 тыс. строк и специальной вставкой (с транспонированием) копируете в другой файл, потом удаляете 1 -ю колонку все будет сдвигаться не ее место
и так 33 раза…
20 и более результаты нужно выводить напрямую в файл, в Еxcel — не влезут(((
а с 21, кажется, и массив такого размера уже не получиться обьявить — только прямо в файл))

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

 

SanShiney

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

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

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

Файл рабочего примера в приложении.

Изменено: SanShiney27.09.2016 18:20:11
(Забыл приложения)

 

SanShiney

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

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

Ігор Гончаренко,
Вышел домой. =) Дома гляну, первым делом.

 

vikttur

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

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

#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 8) 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» и выбираем пункт «Параметры…».

Нажимаем сюда, чтобы вызвать панель с дополнительными параметрами Excel в macOS
Скриншот: 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
Узнать больше

Понравилась статья? Поделить с друзьями:
  • Макрос верстка текста книжкой word 2010
  • Макрос верстка книжки в word
  • Макрос ввода данных в таблицу excel
  • Макрос в текстовом редакторе word
  • Макрос в программе excel это