By ТомУайтМладший в воскресенье, 08 октября 2017 г.
Опубликовано в Excel
Ответы 0
Лайк 0
Просмотры 3.2K
Голосов 0
У меня есть рабочий лист в книге, содержащий более 400 строк, 8 столбцов и 160 объединенных диапазонов, и я испортил его внешний вид. Я искал в Интернете объединенные ячейки VBA Autofit. Ни один из URL-адресов не используется. Макрос на этом сайте находится на правильном пути, но: -
1) Мне пришлось бы вручную идентифицировать и ввести 160 объединенных диапазонов.
Я добавил поиск объединенных диапазонов ячеек.
2) Он использует первую строку для вычисления объединенных ячеек (ячейка ZZ1). Я использую гораздо более крупный шрифт в ячейке A1 (заголовок), что приводит к ошибкам при вычислении требуемой высоты объединенного автоподбора.
Я использую столбец ячейки 1 справа и 1 строку ниже данных. (Ctrl+Shift+End, не находит эту ячейку)
3) Он пересчитывает все объединенные ячейки, поэтому он уменьшает высоту двух строк, содержащих как объединенные, так и нормальные ячейки, что делает нормальные ячейки нечитаемыми.
Я изменяю высоту строки только тогда, когда требуемая объединенная высота превышает существующую высоту.
4) Метод копирования данных из объединенных диапазонов в ячейку ZZ1 неверен, основан только на тексте в объединенном диапазоне, но не учитывает разный размер шрифта в разных объединенных ячейках.
Поправил метод копирования.
5) Макрос медленный: около 15+ секунд на моем листе.
Отключение обновления экрана и повторное включение в конце макроса сокращает это время до 2 секунд.

Мне удалось найти еще один раздражающий недостаток. Автоматически подогнать рабочий лист (перед исправлением объединенных диапазонов), и он исказил несколько строк. Высота некоторых «обычных» ячеек, настроенных на перенос, была увеличена, и они отображались в виде строки (или двух строк) текста с пустой строкой под текстом. Поиск в Интернете показал, что это вызвано тем, что Excel изменяет отображение для размещения шрифтов принтера. Нашел обходной путь, добавил в макрос:
Увеличьте ширину столбцов на небольшой процент.
Автоподбор всех строк на листе.
Внесите исправления в высоту строки, чтобы учесть объединенные диапазоны.
Вернуть ширину столбца к исходным размерам.
Это исправило проблему, теперь пустые строки больше не появляются!

Думал, что теперь все правильно, но потом обнаружил еще одну проблему. Если я закрою книгу и снова открою ее, пустые строки снова вернутся. Посмотрел файл/параметры, и я безуспешно искал в Интернете метод предотвращения обновления экрана рабочей книги при закрытии/открытии рабочей книги. Мне пришлось добавить Private Sub Workbook_Open() на вкладку «ThisWorkbook» с вызовом для запуска макроса при открытии книги.


Вариант Явный

Sub Look4Merge()
Dim WSN As String 'Имя рабочего листа
Dim sht As Worksheet «Используется «Набором»
Dim LastRow As Long 'Последняя строка во всех столбцах с данными
Dim LastRowCC As Long 'Последняя строка в текущем столбце с данными
Dim LastColumn As Integer 'Номер последнего столбца во всех строках с данными
Dim CurrCol As Integer 'Номер текущего столбца
Dim Letter As String 'Преобразовать число CurrCol в строку
Dim ILetter As String 'Индекс столбца один справа от последнего столбца
Dim ICell As String 'Ячейка на один столбец вправо и на одну строку вниз от области данных frpm. Используется для расчета требуемой объединенной высоты
Dim CRow As Long 'Номер текущей строки
Dim TwN As Long 'Обработка ошибок
Dim TwD As String 'Обработка ошибок
Dim Mgd As Boolean 'True/False тест, если ячейка объединена
Dim MgdCellAddr As String 'Содержит объединенный диапазон в виде строки
Dim MgdCellStart As String 'Начальная буква объединенного диапазона ячеек Используется, например, при проверке столбца B на наличие объединенных ячеек, игнорирует любые объединенные ячейки, начинающиеся в столбце A и заканчивающиеся столбцом B (уже оценено)
Dim MgdCellStart1 As String 'используется для вычисления MgdCellStart
Dim MgdCellStart2 As String 'используется для вычисления MgdCellStart
Dim OldHeight As Single 'Существующая высота всех строк в объединенном диапазоне
Dim P1 As Integer 'Счетчик циклов/указатель
Dim OldWidth As Single 'Существующая ширина ячеек в объединенном диапазоне
Dim NewHeight As Single 'Требуемая высота всех строк в объединенном диапазоне. Обновлять отдельные строки пропорционально, если они превышают OldHeight.
Dim C1 As Integer 'Количество столбцов цикла
Dim R1 As Long 'Количество строк/указатель цикла
Dim Tweak As Single 'Небольшое увеличение ширины столбца для решения проблемы с пустой строкой
Тусклый оранжевый как диапазон
При ошибке Перейти к TomsHandler

Application.ScreenUpdating = False 'НАМНОГО быстрее 15 секунд, если экран обновляется всего 2 секунды выключен.
Tweak = 1.04 'Увеличить ширину столбца на 4% перед автоподбором всех строк.
WSN = ActiveSheet.Имя
Столбцы("A:A").EntireRow.Hidden = False

'Найти последнюю активную строку и столбец во всем рабочем листе с данными
С ActiveSheet.UsedRange
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Конец с
CurrCol = LastColumn + 1 'т.е. справа от последнего столбца
Если КуррКол < 27 Тогда
ILetter = Chr$(CurrCol + 64) 'Индекс столбца
Еще
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Индексный столбец, если двойная цифра. Не беспокойтесь о тройной букве
End If

«Icell расположен справа и ниже данных. Ячейка используется для расчета высоты, необходимой для соответствия объединенному диапазону
ICell = ILetter и LastRow + 1

'Небольшое увеличение ширины столбца, чтобы устранить ошибку переноса пустых строк.
Диапазон ("A" и LastRow + 1).Выбрать
Для C1 = 1 до LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak 'увеличить ширину столбца на небольшую величину, чтобы исправить ошибку
ActiveCell.Offset(0, 1).Range("A1").Select ' переместиться на одну ячейку вправо
Следующая

'Autofit Rows (игнорирует объединенные строки) с шириной столбца на 4% больше, чтобы предотвратить ошибку пустых строк в некоторых строках переноса
Cells.Select
Выбор.Строки.Автоподбор
Установите sht = Worksheets (WSN) 'необходим для поиска последней записи в столбце с данными

Для CurrCol = 1 до LastColumn
'конвертировать номер текущего столбца в альфа-канал (одинарную или двойную букву)
Если КуррКол < 27 Тогда
Буква = Chr$(CurrCol + 64)
Еще
Буква = Chr$(Int((CurrCol - 1) / 26) + 64)
Letter = Letter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
End If
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'найти последнюю строку в текущем столбце

Для CRow = 1 в LastRowCC
Диапазон (буква и CRow). Выберите
Mgd = ActiveCell.MergeCells 'Ячейка в объединенном диапазоне
If Mgd = True Then 'Если True, то это
'Какой адрес объединенного диапазона? извлечь одинарную/двузначную цифру для начала диапазона
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
Если MgdCellStart2 = "$" Тогда
МгдСеллСтарт = МгдСеллСтарт1
Еще
MgdCellStart = MgdCellStart1 и MgdCellStart2
End If
If MgdCellStart = Letter Then 'Является ли первый столбец объединенной ячейки равным текущему столбцу
С листами (WSN)
Старая ширина = 0
Установить oRange = Range(MgdCellAddr) 'установить oRange для обнаружения объединённого диапазона
Для C1 = 1 Для oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Накопить ширину столбца для диапазона ячеек (с добавлением 4%)
Следующая
Старая высота = 0
Для R1 = 1 в oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Накопить существующую высоту строки для диапазона ячеек
Следующая
oRange.MergeCells = Ложь
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Копирует текст И размер шрифта, а не только значения
.Range(ICell).WrapText = True 'обернуть ICell
.Columns(ILetter).ColumnWidth = OldWidth 'изменить ширину столбца, содержащего ICell, чтобы имитировать существующий диапазон
.Rows(LastRow + 1).EntireRow.AutoFit 'Автоподгонка строки ICell, готовая к измерению требуемой объединенной высоты
oRange.MergeCells = True 'Сбросить объединенный диапазон обратно в объединенный
oRange.WrapText = True 'и перенос
'Измерить необходимую высоту для объединенного диапазона
NewHeight = .Rows(LastRow + 1).RowHeight
'Превышает ли Новая требуемая высота Старую существующую высоту
Если НоваяВысота > СтараяВысота Тогда
Для R1 = CRow To CRow + oRange.Rows.Count - 1
'Увеличить каждую строку в диапазоне пропорционально
Диапазон (ILetter и R1).RowHeight = Диапазон (ILetter и R1).RowHeight * NewHeight / OldHeight
Следующая
Еще
'достаточно места в объединенной ячейке
End If
CRow = CRow + oRange.Rows.Count - 1 'else в многорядном диапазоне, упадет до 2-й строки диапазона и повторит расчет при достижении "Далее"
.Range(ICell).Clear 'Zap ICell готов к следующему расчету
.Range(ICell).ColumnWidth = 8.1 'Подчистить ширину столбца
Конец с
End If
End If
Следующая
Следующая

'Сбросить ширину столбца, удалив добавленные 4% (необходимо для устранения ошибки переноса)
Диапазон ("A" и LastRow + 1).Выбрать
Для C1 = 1 до LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'уменьшить ширину столбца до исходной
ActiveCell.Offset(0, 1).Range("A1").Выберите ' одну ячейку вправо
Следующая
Диапазон ("A1"). Выбрать

Application.ScreenUpdating = True 'включить обновление обратно
Exit Sub

ТомсХэндлер:
Application.ScreenUpdating = True 'включить обновление обратно
TwN = число ошибок
TwD = Описание ошибки
MsgBox "Необходимо обработать ошибку" & TwN & " " & TwD
Stop
Продолжить
End Sub

Можно ли запретить Excel изменять внешний вид экрана при закрытии/повторном открытии книги?
Посмотреть сообщение полностью