By TomWhiteJnr v neděli 08. října 2017
Publikováno v vynikat
Odpovědi 0
záliby 0
Zobrazení 3.1
Hlasy 0
Mám list v sešitu obsahující přes 400 řádků, 8 sloupců a 160 sloučených rozsahů a pokazil jsem jeho vzhled. Hledal jsem na internetu VBA Autofit Merged Cells. Žádná z adres URL není příliš užitečná. Makro na tomto webu je na správné cestě, ale: -
1) Musel bych ručně identifikovat a zadat 160 sloučených rozsahů.
Přidal jsem vyhledávání sloučených rozsahů buněk.
2) Používá řádek 1 k provádění výpočtů sloučených buněk (buňka ZZ1). Používám mnohem větší písmo na buňku AXNUMX (nadpis), což má za následek chyby při výpočtu požadované sloučené výšky automatického přizpůsobení.
Používám buňku 1 sloupec vpravo a 1 řádek pod daty. (Ctrl+Shift+End, nenajde tuto buňku)
3) Přepočítá všechny sloučené buňky, takže sníží výšku dvou řádků obsahujících sloučené i normální buňky, čímž se normální buňky stanou nečitelnými.
Výšku řádku změním pouze tehdy, když požadovaná sloučená výška překročí stávající výšku.
4) Metoda pro kopírování dat ve sloučených oblastech do buňky ZZ1 je nesprávná, je založena pouze na textu ve sloučeném rozsahu, ale nebere v úvahu různé velikosti písma v různých sloučených buňkách.
Opravil jsem způsob kopírování.
5) Makro je pomalé: asi 15+ sekund na mém listu.
Vypnutím obnovení obrazovky a jejím opětovným zapnutím na konci makra se to zkrátí na 2 sekundy.

Podařilo se mi najít další otravnou chybu. Automaticky přizpůsobit list (před opravou sloučených rozsahů) a zdeformoval několik řádků. Některé buňky „Normal“, nastavené na zalomené, měly zvýšenou výšku a zobrazovaly se jako řádek (nebo dva řádky) textu s prázdným řádkem pod textem. Vyhledávání na internetu ukázalo, že je to způsobeno tím, že Excel upravil zobrazení tak, aby vyhovoval písmům tiskárny. Našel jsem „obcházení“, přidal jsem do makra:
Zvětšit šířku sloupců o malé procento.
Automaticky přizpůsobit všechny řádky na listu.
Proveďte opravy výšky řádku tak, aby vyhovovaly sloučeným rozsahům.
Vrátit šířku sloupce na původní velikosti.
Tím se to vyřešilo, prázdné řádky se již nezobrazují!

Myslel jsem, že je nyní vše v pořádku, ale pak jsem objevil další problém. Pokud sešit zavřu a znovu jej otevřu, prázdné řádky jsou opět zpět. Podíval jsem se na Soubor/Možnosti a hledal jsem na internetu způsob, jak zabránit tomu, aby sešit bez úspěchu aktualizoval zobrazení obrazovky při zavření/otevření sešitu. Musel jsem přidat Private Sub Workbook_Open() na kartu „ThisWorkbook“ s voláním pro spuštění makra při otevření sešitu.


Možnost explicitní

Sub Look4Merged()
Dim WSN As String 'Worksheet Name
Dim sht As Worksheet 'Used by "Set"
Dim LastRow As Long 'Poslední řádek ve všech sloupcích s daty
Dim LastRowCC As Long 'Poslední řádek v aktuálním sloupci s daty
Dim LastColumn As Integer 'Počet posledního sloupce ve všech řádcích s daty
Dim CurrCol As Integer 'Číslo aktuálního sloupce
Dim Letter As String 'Převést CurrCol číslo na řetězec
Dim ILetter As String 'Indexový sloupec jedna vpravo od posledního sloupce
Dim ICell As String 'Buňka o jeden sloupec vpravo a o řádek dolů frpm datová oblast. Používá se k výpočtu požadované sloučené výšky
Dim CRow As Long 'Aktuální číslo řádku
Dim TwN As Long 'Zpracování chyb
Dim TwD As String 'Zpracování chyb
Dim Mgd As Boolean 'True/False test, zda je buňka sloučena
Dim MgdCellAddr As String 'Obsahuje sloučený rozsah jako řetězec
Dim MgdCellStart As String 'Počáteční písmeno sloučeného rozsahu buněk Používá se např. při kontrole sloučených buněk ve sloupci B, ignoruje všechny sloučené buňky začínající ve sloupci A, které zasahuje do sloupce B (již vyhodnoceno)
Dim MgdCellStart1 As String 'používá se k výpočtu MgdCellStart
Dim MgdCellStart2 As String 'používá se k výpočtu MgdCellStart
Dim OldHeight As Single 'Existující výška všech řádků ve sloučeném rozsahu
Dim P1 As Integer 'Počet smyček/ukazatel
Dim OldWidth As Single 'Existující šířka buněk ve sloučeném rozsahu
Dim NewHeight As Single 'Požadovaná výška všech řádků ve sloučeném rozsahu. Aktualizujte jednotlivé řádky proporcionálně, pokud překračuje OldHeight
Dim C1 As Integer 'Počet sloupců smyčky
Dim R1 As Long 'Loop Row count/pointer
Dim Tweak As Single 'Malé zvětšení šířky sloupce k překonání problému s prázdným řádkem
Dim oranžová jako rozsah
Při chybě GoTo TomsHandler

Application.ScreenUpdating = False 'MNOHEM rychlejší 15 sekund, pokud je obrazovka aktualizována pouze 2 sekundy vypnutá.
Tweak = 1.04 'Zvětšit šířku sloupce o 4 % před automatickým přizpůsobením všech řádků.
WSN = ActiveSheet.Name
Columns("A:A").EntireRow.Hidden = False

'Najít poslední aktivní řádek a sloupec v celém listu s daty
S 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
Konec s
CurrCol = LastColumn + 1 'tj. vpravo od posledního sloupce
Pokud CurrCol < 27 Then
ILetter = Chr$(CurrCol + 64) 'Sloupec indexu
Jiný
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Sloupec indexu, pokud je dvouciferný. S trojitým písmenem jsem se neobtěžoval
End If

„Icell se nachází vpravo a pod údaji. Buňka se používá k výpočtu výšky potřebné k přizpůsobení sloučeného rozsahu
ICell = ILetter & LastRow + 1

'Zvětšete šířku sloupce o malé množství, abyste vyřešili chybu zalamování prázdných řádků.
Range("A" & LastRow + 1).Vyberte
Pro C1 = 1 To LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak 'zvýšení šířky sloupce o malé množství, aby se vyléčila chyba
ActiveCell.Offset(0, 1).Range("A1").Vybrat ' přesun o jednu buňku doprava
další

'Automaticky přizpůsobit řádky (ignoruje sloučené řádky) s šířkou sloupce o 4 % navíc, aby se zabránilo chybě prázdných řádků u některých obtékajících řádků
Vyberte buňky
Selection.Rows.AutoFit
Set sht = Worksheets(WSN) 'potřebné k nalezení poslední položky ve sloupci s daty

Pro CurrCol = 1 To LastColumn
'převést aktuální číslo sloupce na alfa (buď jedno nebo dvoupísmenné)
Pokud CurrCol < 27 Then
Písmeno = Chr$(CurrCol + 64)
Jiný
Písmeno = 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 'najít poslední řádek v aktuálním sloupci

Pro CRow = 1 To LastRowCC
Rozsah (písmeno & CRow). Vyberte
Mgd = ActiveCell.MergeCells 'Je buňka ve sloučeném rozsahu
If Mgd = True Then 'If True, pak to je
„Jaká je adresa sloučeného rozsahu? extrahujte jednu/dvojitou číslici pro začátek rozsahu
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
Pokud MgdCellStart2 = "$" Pak
MgdCellStart = MgdCellStart1
Jiný
MgdCellStart = MgdCellStart1 & MgdCellStart2
End If
If MgdCellStart = Letter Then 'Je sloučený první sloupec buňky roven aktuálnímu sloupci
S listy (WSN)
Stará šířka = 0
Set oRange = Range(MgdCellAddr) 'set oRange na Sloučený rozsah zjištěn
Pro C1 = 1 To oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Shromáždit šířky sloupců pro rozsah buněk (s přidáním 4 %)
další
Stará výška = 0
Pro R1 = 1 To oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Akumulovat existující výšku řádku pro rozsah buněk
další
oRange.MergeCells = False
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Kopíruje text A velikost písma, nikoli pouze hodnoty
.Range(ICell).WrapText = True 'zabalit ICell
.Columns(ILetter).ColumnWidth = OldWidth 'změnit šířku sloupce obsahujícího ICell tak, aby napodoboval existující rozsah
.Rows(LastRow + 1).EntireRow.AutoFit 'Automaticky přizpůsobit řádek ICell, připraven změřit požadovanou sloučenou výšku
oRange.MergeCells = True 'Obnovit sloučený rozsah zpět na sloučený
oRange.WrapText = True 'a zalomení
'Změřte požadovanou výšku pro sloučený rozsah
NewHeight = .Rows(LastRow + 1).RowHeight
„Přesahuje nová požadovaná výška starou stávající výšku?
If NewHeight > OldHeight Then
Pro R1 = CRow To CRow + oRange.Rows.Count - 1
'Zvyšte každý řádek v rozsahu pro rata
Rozsah(ILetter & R1).RowHeight = Range(ILetter & R1).RowHeight * NewHeight / OldHeight
další
Jiný
'dostatečný prostor ve sloučené cele
End If
CRow = CRow + oRange.Rows.Count - 1 'jinak na víceřádkovém rozsahu, klesne dolů na 2. řádek rozsahu a výpočet se opakuje, když dorazí na "Další"
.Rozsah (ICell). Clear 'Zap ICell připraven pro další výpočet
.Range(ICell).ColumnWidth = 8.1 'Uklidit šířku sloupce
Konec s
End If
End If
další
další

'Resetovat šířku sloupce odstraněním 4 % přidáno (potřebné k vyřešení chyby zalamování)
Range("A" & LastRow + 1).Vyberte
Pro C1 = 1 To LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'zmenšit šířku sloupce na původní
ActiveCell.Offset(0, 1).Range("A1").Vyberte ' o jednu buňku vpravo
další
Rozsah("A1").Vyberte

Application.ScreenUpdating = True 'znovu zapněte aktualizaci
Konec Sub

TomsHandler:
Application.ScreenUpdating = True 'znovu zapněte aktualizaci
TwN = Err.Number
TwD = Err.Description
MsgBox "Need to handle error " & TwN & " " & TwD
Stop
Pokračovat
End Sub

Je možné zabránit Excelu ve změně vzhledu obrazovky při zavření/znovu otevření sešitu?
Zobrazit celý příspěvek