Excel vba как снять объединение ячеек

Объединение диапазона ячеек в одну или построчно с помощью кода VBA Excel. Метод Range.Merge и свойство MergeCells. Отмена объединения ячеек. Примеры.

Метод Range.Merge

Метод Merge объекта Range объединяет ячейки заданного диапазона в одну или построчно из кода VBA Excel.

Синтаксис метода:

  1. Expression — выражение, возвращающее объект Range.
  2. Across — логическое значение, определяющее характер объединения ячеек:
    • True — ячейки объединяются построчно: каждая строка заданного диапазона преобразуется в одну ячейку.
    • False — весь диапазон преобразуется в одну ячейку. False является значением по умолчанию.

Преимущество метода Range.Merge перед свойством MergeCells заключается в возможности построчного объединения ячеек заданного диапазона без использования цикла.

Свойство MergeCells

Свойство MergeCells объекта Range применяется как для объединения ячеек, так и для его отмены.

Синтаксис свойства с присвоением значения:

Expression.MergeCells = Boolean

  1. Expression — выражение, представляющее объект Range.
  2. Boolean — логическое значение, определяющее необходимость объединения ячеек или его отмены:
    • True — объединение ячеек заданного диапазона.
    • False — отмена объединения ячеек.

С помощью свойства MergeCells можно из кода VBA Excel проверять диапазон (отдельную ячейку), входит ли он (она) в объединенную ячейку (True) или нет (False). Если проверяемый диапазон окажется комбинированным, то есть содержащим объединенные и необъединенные ячейки, компилятор сгенерирует ошибку.

Переменная Expression для отмены объединения ячеек с помощью свойства Range.MergeCells может представлять одну любую ячейку, входящую в объединенный диапазон.

Метод Range.UnMerge

Метод UnMerge объекта Range разделяет объединенную область на отдельные ячейки из кода VBA Excel.

Синтаксис метода:

Expression — выражение, возвращающее объект Range.

Переменная Expression для отмены объединения ячеек методом UnMerge может представлять одну любую ячейку, входящую в объединенный диапазон.

Примеры объединения ячеек и его отмены

Пример 1
Наблюдаем, как происходит объединение ячеек при разных значениях параметра Across:

Sub Primer1()

‘Объединяем ячейки диапазона «A1:D4» построчно

   Range(«A1:D4»).Merge (True)

‘Объединяем диапазон «A5:D8» в одну ячейку

‘Across принимает значение False по умолчанию

   Range(«A5:D8»).Merge

End Sub

Не забываем, что логическое выражение True можно заменить единичкой, а False — нулем.

Пример 2
Отменяем объединение ячеек в диапазонах из первого примера:

Sub Primer2()

   Range(«A1:D8»).MergeCells = False

End Sub

Пример 3
Предполагается, что перед этим примером отменено объединение ячеек кодом из предыдущего примера.

Sub Primer3()

‘Объединяем ячейки диапазона «A1:D4»

   Range(«A1:D4»).MergeCells = 1

‘Проверяем принадлежность диапазона

‘объединенной ячейке*

   MsgBox Range(«A1:C2»).MergeCells

   MsgBox Range(«A6:C7»).MergeCells

‘Ячейки диапазона «A5:D8»

‘можно объединить и так

   Cells(5, 1).Resize(4, 4).Merge

End Sub

*Если проверяемый диапазон окажется комбинированным, VBA Excel сгенерирует ошибку.
Пример 4
Отмена объединения ячеек с помощью метода Range.UnMerge:

Sub Primer4()

‘Объединяем ячейки диапазона «A1:C4»

    Range(«A1:C4»).Merge

    MsgBox «Ячейки диапазона ««A1:C4»» объединены»

‘Смотрим адрес диапазона, входящего в объединенную ячейку

    MsgBox Range(«A2»).MergeArea.Address

‘Отменяем объединение ячеек диапазона «A1:C4»

    Range(«B3»).UnMerge  ‘или: Range(«B3»).MergeArea.UnMerge

    MsgBox «Объединение ячеек диапазона ««A1:C4»» отменено»

End Sub

Предупреждение перед объединением

Если объединяемые ячейки не являются пустыми, пред их объединением появится предупреждающее диалоговое окно с сообщением: «В объединенной ячейке сохраняется только значение из верхней левой ячейки диапазона. Остальные значения будут потеряны.»

Пример 5
Наблюдаем появление предупреждающего окна:

Sub Primer5()

‘Отменяем объединение ячеек в диапазоне «A1:D4»

   Range(«A1:D4»).MergeCells = 0

‘Заполняем ячейки диапазона текстом

   Range(«A1:D4») = «Ячейка не пустая»

‘Объединяем ячейки диапазона «A1:D4»

   Range(«A1:D4»).MergeCells = 1

‘Наблюдаем предупреждающее диалоговое окно

End Sub

Предупреждающее окно перед объединением ячеек

Чтобы избежать появление предупреждающего окна, следует использовать свойство Application.DisplayAlerts, с помощью которого можно отказаться от показа диалоговых окон при работе кода VBA Excel.

Пример 6

Sub Primer6()

‘Отменяем объединение ячеек в диапазоне «A5:D8»

   Range(«A5:D8»).MergeCells = 0

‘Заполняем ячейки диапазона «A5:D8» текстом

   Range(«A5:D8») = «Ячейка не пустая»

Application.DisplayAlerts = False

   Range(«A5:D8»).MergeCells = 1

Application.DisplayAlerts = True

End Sub

Теперь все прошло без появления диалогового окна. Главное, не забывать после объединения ячеек возвращать свойству Application.DisplayAlerts значение True.

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

0 / 0 / 0

Регистрация: 03.05.2010

Сообщений: 141

1

Как программно снять объединение ячеек?

19.10.2010, 09:26. Показов 15410. Ответов 7


Студворк — интернет-сервис помощи студентам

надо на выделенном диапазоне ячеек,если стоит галка на фОРМАТ ЯЧЕЕК -> ОБЪЕДИНЕНИЕ ЯЧЕЕК … убрать ее
т.е. снять объединение ячеек программно
не знаю как написать условие if .MergeCells = True (дает ошибку)
спасибо за ответы



0



natalie

19.10.2010, 09:55

2

Все просто:

Visual Basic
1
If Range('A1:B2').MergeCells Then Range('A1:B2').MergeCells = False

0 / 0 / 0

Регистрация: 11.10.2010

Сообщений: 21

19.10.2010, 11:07

3

а еще один способ снять объединение ячеек — использовать метод unmerge:
selection.unmerge



0



0 / 0 / 0

Регистрация: 03.05.2010

Сообщений: 141

27.10.2010, 11:24

 [ТС]

4

Да,
If Range(‘A1:B2’).MergeCells Then Range(‘A1:B2’).MergeCells = False
срабатывает, если если известно, какие ячейки листа были объединены
А если нужно снять объединение вообще с листа:
пометили все ячейки листа, проверили — есть объединенные ячейки
как снять объединение?
спасибо за ответы



0



natalie

27.10.2010, 11:46

5

могу предложить некрасивый вариант.
на самом деле, если ты хотя бы приблизительно знаешь, на каком диапазоне располагаются данные, то лучше этот диапазон обозначить, а если нет, но объединение снять ну уж очень необходимо, то предлагаю так (правда считаться это будет ну очень долго)

Visual Basic
1
2
3
4
Лист1.Cells.Select
For Each c In Selection.Cells
If c.MergeCells Then c.MergeCells = False
Next

я думаю, есть более короткий вариант, но чем богаты…

0 / 0 / 0

Регистрация: 03.05.2010

Сообщений: 141

27.10.2010, 12:48

 [ТС]

6

вопрос остается в силе: ‘Как снять объединение ячеек, если неизвестно, какие именно ячейки объединены ?’

последний предложенный вариант не только долго работает, но ,как мне показалось, вообще виснет



0



14 / 14 / 2

Регистрация: 23.03.2010

Сообщений: 635

27.10.2010, 15:06

7

Зачем проверять наличие объединённых ячеек — не пойму: по-моему, нужно в любом случае выполнить Cells.MergeCells = False —
если таких ячеек нет, то на листе просто ничего не изменится.



0



0 / 0 / 0

Регистрация: 03.05.2010

Сообщений: 141

27.10.2010, 16:23

 [ТС]

8

конечно-конечно, именно Cells.MergeCells = False дает правильный результат
а снимать объединение нужно, так как когда делаешь программно автофильтр, если есть объединенные ячейки-получаешь непредсказуемый результат, снимаешь объединение-все Ok!

Уважаемый Vlth, в очередной раз огромное спасибо за поддержку и реальную помощь



0



В программе Excel присутствует кнопка для разъединения объединенных ячеек таблицы на закладке: «ГЛАВНАЯ»-«Выравнивание»-«Отменить объединение ячеек». Но что, если эту операцию нужно выполнять многократно, да еще и после нее заполнять данными ново созданные ячейки. Реализовать данную задачу вручную – это весьма затратное занятие по времени и силам. Здесь рационально воспользоваться макросом.

Макрос для разъединения объединенных ячеек в Excel

Допустим у нас уже имеется вполне читабельная таблица списка заказов, в которой имеются объединенные ячейки в столбце «Год». Пример, такой таблицы изображен ниже на рисунке:

таблица списка заказов.

Но нам необходимо преобразовать данную таблицу в стандартный формат, например, для создания отчета на основе сводной таблицы. Для этого откроем редактор Visual Basic (ALT+F11):

Visual Basic.

И вставим новый стандартный модуль используя инструмент в редакторе: «Insert»-«Module». А после чего запишем в модуль VBA код макроса для разъединения объединенных ячеек:

Sub RazdelitVstavit()
Dim adres As String
adres = ActiveCell.MergeArea.Address
If adres <> ActiveCell.Address Then
  ActiveCell.UnMerge
  ActiveCell.Copy
  ActiveSheet.Paste ActiveSheet.Range(adres)
  Application.CutCopyMode = False
End If
End Sub

модуль VBA код макроса.

Если мы хотим отменить объединение ячеек в столбце «Год» и заполнить созданные ячейки соответствующими значениями (годами), тогда перейдите на одну большую объединенную ячейку B2 и запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«RazdelitVstavit»-«Выполнить».

отменить объединение ячеек.

В данном VBA коде макроса используется только одна переменная. Она хранит в себе адрес диапазона ячеек B2:B15 которые охватывает одна активная объединенная ячейка.

adres = ActiveCell.MergeArea.Address

Адрес активной ячейки отображается в поле «Имя» (напротив строки формул Excel). Но там не отображается полный адрес объединенной ячейки.

Адрес активной ячейки.

Для пользователя в поле «Имя» будет адрес отображаться одинаково, но в макросе их можно различить с помощью методов объекта ActiveCell.MergeArea.Addres. В зависимости какой тип активных ячеек будет возвращен тип адреса – одна ячейка или диапазон. Если активная ячейка не является объединенной, тогда в переменной будет храниться только адрес одной активной ячейки, а не целого диапазона. Далее макрос проверяет является ли текущая активная ячейка – объединенной, с помощью сравнения двух способов получения адреса для одной и той же активной ячейки. Тот способ, который передал адрес в переменную из метода объекта ActiveCell.MergeArea.Addres и обычный – ActiveCell.Addres. Если адрес в переменной и адрес получен обычным способом не совпадает, значит она является объединенной и код выполняется дальше.

С помощью метода объекта ActiveCell.UnMerge выполняется разъединение объединенной активной ячейки. Далее копируется ее содержимое и заполняется диапазон на листе, адрес которого получен из переменной, его же ранее содержала в себе объединенная активная ячейка. После копирования значения для объекта CutCopyMode устанавливается свойство False, чтобы прекратить процесс копирования. В результате таблица листа заказов будет иметь такой же вид как показано ниже на рисунке:

Пример.

Данный макрос позволяет разъединить объединенные ячейки, которые используют любое направление объединения: как по вертикали, так и полгоризонтали. Ее значение будет одинаково вставлено во все ячейки, созданные после разъединения.

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



Как разъединить объединенные ячейки сразу в нескольких диапазонах

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

Dim i As Long

Создадим цикл, который будет перемещаться по всем выделенным объединенным ячейкам:

For i = 1 To Selection.Count

В конце кода не забудем добавить конец цикла:

Next

Вместо ссылки на активную ячейку Active.Cell теперь будем использовать ссылку на очередную по счету ячейку в выделенном диапазоне: Selection.(i). Полная версия усовершенствованного макроса выглядит следующим образом:

Sub RazdelitVstavit()
Dim adres As String
Dim i As Long
For i = 1 To Selection.Count
  adres = Selection(i).MergeArea.Address
  If adres <> Selection(i).Address Then
    Selection(i).UnMerge
    Selection(i).Copy
    ActiveSheet.Paste ActiveSheet.Range(adres)
    Application.CutCopyMode = False
  End If
Next
End Sub

Пример2.

Цикл, который перемещается по каждой объединенной ячейке выделенного диапазона, каждый раз вызывает VBA код макроса для разъединения их диапазона объединения с учетом всех выше описанных условий.

Читайте также: Как объединить ячейки в Excel с помощью кода макроса VBA.

Так же стоит отметить, что выделенный диапазон может содержать необъединенные ячейки, которые будут просто игнорироваться макросом. Если бы мы не усовершенствовали наш макрос, то при выделении нескольких объединенных ячеек – разделилась бы только первая.

 

Marija

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

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

Здравствуйте шановны форумчане помощники.
Очень прошу Вас о помощи в совершенствовании моего макрорекодерного макроса (macro) , который осуществляет разъединение ячеек в диапазоне A2:A25000 файла PST.xls листа Rep — 1 и затем разъединение ячейки наполняются данными, выше.
Пример: A3 разъединяется на A3 и А4. В А3 есть данные (2W 25-26) следовательно в А4 также эти же данные (2W 25-26).
Заранее огромное Вам спасибо и всех благ Вам.

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

  • Pst.xls (43 КБ)

 

kavaka

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

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

#2

07.07.2017 10:54:58

Код
Sub asd()
    Dim xrow As Long
    xrow = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(2, 1), Cells(xrow, 1)).UnMerge
    For i = 2 To xrow
        If Cells(i, 1) = "" Then Cells(i, 1) = Cells(i - 1, 1)
    Next i
End Sub
 

Marija

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

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

kavaka

Супер. Благодарность Вам безмерная.
А как такую штуку сделать не только для колонки А, но и для B,C и D ?

 

Владимир

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

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

#4

07.07.2017 11:18:00

Код
...
xrow = Cells(Rows.Count, 1).End(xlUp).Row
    ActiveSheet.UsedRange.UnMerge
    For i = 2 To xrow
        If Len(Cells(i, 1)) = 0 Then Cells(i, 1) = Cells(i - 1, 1)
        If Len(Cells(i, 2)) = 0 Then Cells(i, 2) = Cells(i - 1, 2)
        ... и т.д.
    Next i
...

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

kuklp

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

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

E-mail и реквизиты в профиле.

#5

07.07.2017 11:20:29

Вариант:

Код
Public Sub UnMergeCells()
    Dim c As Range, s$
    Application.FindFormat.MergeCells = True
    With Intersect(ActiveSheet.UsedRange, ActiveSheet.[a:d])
        Set c = .Find("", [a1], xlFormulas, 2, SearchFormat:=True)
        If Not c Is Nothing Then
            Do
                    s = c.MergeArea.Address: c.UnMerge
                    Range(s).Value = Range(s)(1).Value
                Set c = .Find("", c, xlFormulas, 2, SearchFormat:=True)
            Loop While Not c Is Nothing
        End If
    End With
End Sub

Даже чуть проще:

Код
Public Sub UnMergeCells()
    Dim c As Range
    Application.FindFormat.MergeCells = True
    With Intersect(ActiveSheet.UsedRange, ActiveSheet.[a:d])
        Set c = .Find("", [a1], xlFormulas, 2, SearchFormat:=True)
        If Not c Is Nothing Then
            Do
                    Set c = c.MergeArea: c.UnMerge
                    c.Value = c(1).Value
                Set c = .Find("", c(1), xlFormulas, 2, SearchFormat:=True)
            Loop While Not c Is Nothing
        End If
    End With
End Sub

Изменено: kuklp07.07.2017 11:29:14

Я сам — дурнее всякого примера! …

 

Владимир

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

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

kuklp, после тебя тут нечего делать. ;)  

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

kuklp

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

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

E-mail и реквизиты в профиле.

Да ладно. Есть еще вариант со specialcells(4) и формулой из Приемов заполнения пустых верхними значениями. Не мерял, что быстрей. Да думаю это и не критично :)

Я сам — дурнее всякого примера! …

 

Marija

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

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

Вы все просто безграничные молодцы. Всего Вам хорошего. Огромное Вам спасибо.

 

Kuzmich

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

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

#9

07.07.2017 11:37:26

kuklp, написал

Цитата
Есть еще вариант со specialcells(4) и формулой из Приемов заполнения пустых верхними значениями

Пробовал, но почему-то формулой .FormulaR1C1 =»=R[-1]C»  заполняет только столбец D,
в остальных столбцах не видит пустых ячеек?

 

Владимир

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

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

Владимир, там псевдопустые ячейки есть.
Проверь  Isempty(cells(..))

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Kuzmich

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

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

Владимир,
Это я вижу, но почему в столбце D их нет, а в других есть?

 

Владимир

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

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

#12

07.07.2017 11:48:41

Кто его знает? В столбец А тоже не во всех есть.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

Разъединить объединенную ячейку и заполнить данными.

Aleksej

Дата: Вторник, 16.08.2016, 07:22 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Всем доброго времени суток! :)

Нужна помощь знатоков VBA в написании макроса!

Задача:
1. Имеется файл Excel с объединенными ячейками (см. приложение)
2. Необходим макрос который находит объединенную ячейку, разъединяет её и во все получившиеся после разъединения ячейки записывает значение, которое было в объединенной ячейке. %)
3. В примере файла Excel: на листе1 исходные данные, на листе 2 как должно быть после применения макроса.

Спасибо! :)

К сообщению приложен файл:

3333333.xls
(49.5 Kb)

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 07:30 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Последовательность действий такая:
— выделяем нужный диапазон (в примере А3:G29)
— снимаем объединение ячеек
— нажимаем F5 — Выделить — Пустые ячейки — ОК
— нажимаем на клавиатуре = и стрелку вверх. В строке формул должно получиться =A3
— нажимаем на клавиатуре сочетание Ctrl+Enter

Если нужен именно макрос, запишите действия макрорекодером
На эту тему можно посмотреть видео http://www.excelworld.ru/video….n_range


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:39 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Pelena,

Цитата

Если нужен именно макрос, запишите действия макрорекодером

Это если несколько ячеек то можно и так, а если их сотни или тысячи в файле, как сделать чтоб макрос нашел все и преобразовал? %)

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 07:43 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Какая разница? Выделите весь диапазон с данными (Ctrl+*)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:44 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Pelena,

Цитата

Какая разница? Выделите весь диапазон с данными (Ctrl+*)

Сори, все разобрался. Спасибо за помощь. :)

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:53 |
Сообщение № 6

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Pelena,

Цитата

Выделите весь диапазон с данными

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

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 08:07 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Тогда приведите более реальный пример


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

nilem

Дата: Вторник, 16.08.2016, 08:15 |
Сообщение № 8

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

можно так попробовать
[vba]

Код

Sub ertert()
Dim r As Range
For Each r In Range(«A3:G» & Cells(Rows.Count, 1).End(xlUp).Row)
    If r.MergeCells Then
        With r.MergeArea
            .UnMerge
            .Value = r.Value
        End With
    End If
Next r
End Sub

[/vba]
правда, на тысячах ячеек будет, видимо, тормозить


Яндекс.Деньги 4100159601573

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 08:27 |
Сообщение № 9

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Pelena,

Цитата

приведите более реальный пример

Изменил исходный файл — ЛИСТ1.
Возможно, чтоб макрос сам находил только объединенные ячейки, разъединял и заполнял их? :(
Потому что реальный исходный файл, там тысячи строк. Выложить настоящий не могу по понятным причинам.

К сообщению приложен файл:

0557251.xls
(45.5 Kb)

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 08:33 |
Сообщение № 10

Группа: Пользователи

Ранг: Участник

Сообщений: 69


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

nilem,

Цитата

можно так попробовать

Спасибо, вроде работает. :) На ошибки не проверял, но на первый взгляд все правильно. yes

Цитата

на тысячах ячеек будет, видимо, тормозит

Конечно не мгновенно, но это и не требуется. Ещё раз спасибо. :)

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Excel vba как снять защиту листа в excel
  • Excel vba как снять выделение с ячейки
  • Excel vba как скрыть книгу
  • Excel vba как скрывать строки
  • Excel vba как скопировать строку с листа на лист