Неділю, 08 жовтня 2017
  0 відповіді
  3.1 тис. Відвідувань
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() на вкладку «This Workbook» із викликом для запуску макросу, коли книга відкрита.


Варіант явний

Sub Look4Merged()
Dim WSN As String 'Worksheet Name
Dim sht As Worksheet 'Використовується "Set"
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 'Істина/Неправда перевірте, чи об’єднана клітинка
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 'Невелике збільшення ширини стовпця для подолання проблеми з порожнім рядком
Dim orange As Range
Помилка GoTo TomsHandler

Application.ScreenUpdating = False 'НАБАГАТО швидше на 15 секунд, якщо екран оновлено лише на 2 секунди вимкнено.
Налаштування = 1.04 'Збільште ширину стовпця на 4% перед автопідгонкою всіх рядків.
WSN = ActiveSheet.Name
Columns("A:A").EntireRow.Hidden = False

«Знайти останній активний рядок і стовпець у всьому аркуші з даними
За допомогою ActiveSheet.UsedRange
Останній стовпець = Діапазон(Діапазон("A1"), Комірки(Рядків.Кільк., Стовпців.Кільк.)).Знайти(Що:="*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Останній рядок = Діапазон(Діапазон("A1"), Ячейки(Рядки.Кількість, Стовпці.Кількість)).Знайти(Що:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Рядок
Кінець з
CurrCol = Last Column + 1 ', тобто праворуч від останнього стовпця
Якщо CurrCol < 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 До останнього стовпця
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Налаштуйте 'збільште ширину стовпця на невелику кількість, щоб вилікувати помилку
ActiveCell.Offset(0, 1).Range("A1").Select ' перемістити на одну клітинку вправо
МАЙБУТНІ

'Autofit Rows (ігнорує об'єднані рядки) з шириною стовпця на 4% більше, щоб запобігти помилці пустих рядків у деяких рядках обтікання
Клітинки. Виберіть
Вибір.Рядки.Автопідбір
Установіть sht = Worksheets(WSN) 'потрібні для пошуку останнього запису в стовпці з даними

Для CurrCol = 1 To Last Column
'перетворити поточний номер стовпця на альфа-букву (одну або подвійну літеру)
Якщо CurrCol < 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
Діапазон (літера та ворона). Виберіть
Mgd = ActiveCell.MergeCells 'Це комірка в об'єднаному діапазоні
Якщо Mgd = True Тоді 'Якщо True, то це так
'Що таке адреса об'єднаного діапазону? витягнути одну/подвійну цифру для початку діапазону
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Середина (MgdCellAddr, 2, 1)
MgdCellStart2 = Середина (MgdCellAddr, 3, 1)
Якщо MgdCellStart2 = "$", Тоді
MgdCellStart = MgdCellStart1
Ще
MgdCellStart = MgdCellStart1 і MgdCellStart2
End If
Якщо MgdCellStart = Letter, то 'Чи перший стовпець об'єднаної клітинки дорівнює поточному стовпцю
З аркушами (WSN)
OldWidth = 0
Set oRange = Range(MgdCellAddr) 'встановити для oRange значення об’єднаного діапазону.
Для C1 = 1 To oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Накопичувати ширину стовпців для діапазону комірок (з додаванням 4%)
МАЙБУТНІ
OldHeight = 0
Для R1 = 1 To oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Накопичувати висоту наявного рядка для діапазону комірок
МАЙБУТНІ
oRange.MergeCells = False
.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
«Чи перевищує нова необхідна висота стару існуючу висоту
Якщо NewHeight > OldHeight Тоді
Для R1 = CRow To CRow + oRange.Rows.Count - 1
'Пропорційно збільшуйте кожен рядок у діапазоні
Діапазон(ILetter & R1).RowHeight = Діапазон(ILetter & R1).RowHeight * NewHeight / OldHeight
МАЙБУТНІ
Ще
'достатньо місця в об'єднаній комірці
End If
CRow = CRow + oRange.Rows.Count - 1 'інакше в багаторядковому діапазоні, опуститься до 2-го рядка діапазону та повторить обчислення, коли прибудете до "Далі"
.Range(ICell).Clear 'Zap ICell готовий до наступного обчислення
.Range(ICell).ColumnWidth = 8.1 'Упорядкувати ширину стовпця
Кінець з
End If
End If
МАЙБУТНІ
МАЙБУТНІ

"Скинути ширину стовпця, видаливши 4% доданих (потрібно для усунення помилки обтікання)
Діапазон("A" & LastRow + 1).Виберіть
Для C1 = 1 До останнього стовпця
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'зменшити ширину стовпця до початкової
ActiveCell.Offset(0, 1).Range("A1").Виберіть ' одну клітинку праворуч
МАЙБУТНІ
Діапазон ("A1"). Виберіть

Application.ScreenUpdating = True 'увімкнути оновлення
Exit Sub

TomsHandler:
Application.ScreenUpdating = True 'увімкнути оновлення
TwN = номер помилки
TwD = Опис помилки
MsgBox "Потрібно обробити помилку " & TwN & " " & TwD
Стоп
Резюме
End Sub

Чи можна заборонити Excel змінювати вигляд екрана під час закриття/повторного відкриття книги?
На цю посаду ще немає відповідей.