By TomWhiteJnr 08. október 2017-án, vasárnap
Csatlakozik a következő témákhoz: Excel
Válaszok 0
Kedvencek 0
Nézetek 3.1K
Szavazatok 0
Van egy munkalapom egy munkafüzetben, amely több mint 400 sort, 8 oszlopot és 160 egyesített tartományt tartalmaz, és elrontottam a megjelenését. Rákerestem az interneten a VBA Autofit Merged Cells-re. Egyik URL sem nagyon használható. A makró ezen a webhelyen jó úton halad, de: -
1) Manuálisan kellene azonosítanom és beírnom a 160 egyesített tartományt.
Hozzáadtam az egyesített cellatartományok keresését.
2) Az első sort használja az egyesített cellaszámításokhoz (ZZ1 cella). Sokkal nagyobb betűtípust használok az A1 (Cím) cellában, ami hibákat eredményez a szükséges egyesített automatikus illeszkedési magasság kiszámításakor.
1. cella oszlopot használok jobbra és 1 sort az adatok alatt. (Ctrl+Shift+End, nem találja ezt a cellát)
3) Újraszámítja az összes összevont cellát, így csökkentette az egyesített és normál cellákat egyaránt tartalmazó két sor magasságát, így a normál cellák olvashatatlanná váltak.
Csak akkor módosítom a sormagasságot, ha a szükséges egyesített magasság meghaladja a meglévő magasságot.
4) Az egyesített tartományokban lévő adatok ZZ1 cellába másolásának módszere helytelen, csak az egyesített tartományban lévő szövegen alapul, de nem veszi figyelembe a különböző egyesített cellák eltérő betűméretét.
Javítottam a másolási módot.
5) A makró lassú: kb. 15+ másodperc a munkalapomon.
A képernyőfrissítés kikapcsolása, majd visszakapcsolása a makró végén 2 másodpercre csökkenti ezt.

Sikerült még egy bosszantó hibát találnom. A munkalap automatikus illesztése (az egyesített tartományok javítása előtt) több sort torzított. Egyes „Normál” cellák, amelyek burkolt állapotba kerültek, megnövelték a magasságukat, és egy sor (vagy két sor) szövegként jelentek meg, a szöveg alatt egy üres sorral. Az internetes keresés azt mutatta, hogy ezt az okozta, hogy az Excel megváltoztatta a kijelzőt a nyomtató betűtípusainak megfelelően. Találtam egy „megkerülést”, hozzáadtam a makróhoz:
Növelje az oszlopok szélességét kis százalékkal.
A munkalap összes sorának automatikus igazítása.
Végezze el a sormagasság korrekcióit az egyesített tartományokhoz.
Állítsa vissza az oszlopszélességet az eredeti méretre.
Ez megoldotta, most már nem jelennek meg üres sorok!

Azt hittem, most már minden rendben van, de aztán felfedeztem egy újabb problémát. Ha bezárom a munkafüzetet, majd újra megnyitom, az üres sorok újra megjelennek. Megnéztem a Fájl/Opciók menüpontot, és kerestem az interneten egy módszert, amellyel megakadályozható, hogy a munkafüzet sikertelenül frissítse a képernyőt a munkafüzet bezárásakor/nyitásakor. Hozzá kellett adnom a Private Sub Workbook_Open() függvényt a „ThisWorkbook” laphoz, és a makró futtatására kellett hívnom a munkafüzet megnyitásakor.


Explicit lehetőség

Sub Look4Merged()
Dim WSN As String 'munkalap neve
Dim sht munkalapként 'A "Set" használja
Dim LastRow As Long 'Utolsó sor az összes adatot tartalmazó oszlopban
Dim LastRowCC As Long 'Az aktuális oszlop utolsó sora adatokkal
Dim LastColumn As Integer 'Az utolsó oszlop száma az összes adatot tartalmazó sorban
Dim CurrCol As Integer 'Az aktuális oszlop száma
Dim Letter As String 'A CurrCol számot karakterláncsá alakítja
Dim ILetter As String 'Index oszlop az utolsó oszloptól jobbra
Dim ICell As String 'Cella egy oszlopot jobbra és egy sorral lefelé az frpm adatterületet. A szükséges egyesített magasság kiszámítására szolgál
Dim Crow As Long 'Aktuális sorszám
Dim TwN As Long 'Hibakezelés
Dim TwD As String 'Hibakezelés
Dim Mgd Boolean 'Igaz/Hamis teszt, ha cella egyesül
Dim MgdCellAddr As String 'Egyesített tartományt tartalmaz karakterláncként
Dim MgdCellStart As String 'Összevont cellatartomány kezdőbetűje Használható pl. a B oszlop ellenőrzéséhez az egyesített cellákhoz, figyelmen kívül hagyja az A oszlopban kezdődő egyesített cellákat, amelyek a B oszlopig terjednek (már kiértékelve)
Dim MgdCellStart1 As String, amelyet az MgdCellStart kiszámításához használnak
Dim MgdCellStart2 As String, amelyet az MgdCellStart kiszámításához használnak
Dim OldHeight As Single 'Az egyesített tartomány összes sorának meglévő magassága
Dim P1 As Integer 'Hurokszámláló/mutató
Dim OldWidth As Single 'A cellák meglévő szélessége az egyesített tartományban
Dim NewHeight As Single 'Az egyesített tartomány összes sorának szükséges magassága. Frissítse az egyes sorokat arányosan, ha meghaladja az OldHeight értéket
Dim C1 As Integer 'Loop Oszlopszám
Dim R1 As Long 'Loop Sorszám/mutató
Dim Tweak As Single 'Az oszlopszélesség kismértékű növelése az üres sorok problémájának megoldására
Dim Orange As Range
Hiba esetén Ugrás a TomsHandlerhez

Application.ScreenUpdating = Hamis 'SOKKAL 15 másodperccel gyorsabb, ha a képernyő frissítése csak 2 másodpercig van kikapcsolva.
Tweak = 1.04 'Növelje meg az oszlop szélességét 4%-kal az összes sor automatikus igazítása előtt.
WSN = ActiveSheet.Name
Columns("A:A").EntireRow.Hidden = False

„Utolsó aktív sor és oszlop keresése a teljes munkalapon az adatokkal
Az ActiveSheet.UsedRange segítségével
Utolsó oszlop = Tartomány(Tartomány("A1"), Cells(Sorok.Szám, Oszlopok.Szám)).Find(What:="*", LookIn:=xlÉrtékek, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Oszlop
LastRow = Tartomány(Tartomány("A1"), Cellák(Sorok.Szám, Oszlopok.Szám)).Find(What:="*", LookIn:=xlÉrtékek, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Sor
Vége
CurrCol = LastColumn + 1 'azaz az utolsó oszloptól jobbra
Ha CurrCol < 27 Akkor
ILetter = Chr$(CurrCol + 64) 'Index oszlop
Más
Iletter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Index oszlop, ha kétszámjegyű. nem zavarta a három betű
Ha véget

„Az Icell jobbra és az adatok alatt található. A cella az egyesített tartományhoz szükséges magasság kiszámítására szolgál
ICell = ILetter & LastRow + 1

'Növelje meg kis mértékben az oszlop szélességét, hogy kijavítsa az üres sorok burkolási hibáját.
Tartomány("A" & LastRow + 1).Válassza ki
C1 esetén = 1 - Utolsó oszlop
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Csípés az oszlopszélesség kis mértékben növelése a hiba kiküszöbölése érdekében
ActiveCell.Offset(0, 1).Tartomány("A1").Válassza ki a ' elemet mozgassa egy cellával jobbra
Következő

"Sorok automatikus illesztése (figyelmen kívül hagyja az összevont sorokat) 4% extra oszlopszélességgel, hogy megakadályozza az üres sorok hibáit egyes tördelési sorokban
Cells.Select
Selection.Rows.AutoFit
Set sht = Munkalapok (WSN) 'szükséges az adatokkal rendelkező oszlop utolsó bejegyzésének megtalálásához

CurrCol = 1-től utolsó oszlopig
'az aktuális oszlop számának átalakítása alfa-ba (egy- vagy kétbetűs)
Ha CurrCol < 27 Akkor
Letter = Chr$(CurrCol + 64)
Más
Letter = Chr$(Int((CurrCol - 1) / 26) + 64)
Letter = Letter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
Ha véget
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Sor 'utolsó sor megkeresése az aktuális oszlopban

CRow esetén = 1 - LastRowCC
Tartomány(Letter & Crow).Válassza ki
Mgd = ActiveCell.MergeCells 'A cella egyesített tartományban van
Ha Mgd = igaz, akkor 'Ha igaz, akkor az
„Mi az egyesített tartomány címe? egy-/kétjegyű kivonat a tartomány kezdetéhez
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Közép (MgdCellAddr, 2, 1)
MgdCellStart2 = Közép (MgdCellAddr, 3, 1)
Ha MgdCellStart2 = "$" Akkor
MgdCellStart = MgdCellStart1
Más
MgdCellStart = MgdCellStart1 és MgdCellStart2
Ha véget
Ha MgdCellStart = Letter, akkor 'Az egyesített cella első oszlopa megegyezik az aktuális oszloppal
Táblázatokkal (WSN)
OldWidth = 0
Set oRange = Tartomány(MgdCellAddr) 'Az oRange beállítása egyesített tartományra észlelve
Ha C1 = 1 - Orange.Columns.Count
OldWidth = OldWidth + .Cells(1, orange.Column + C1 - 1).ColumnWidth 'A cellatartomány oszlopszélességeinek összegyűjtése (4%-kal hozzáadva)
Következő
OldHeight = 0
Ha R1 = 1 - oTartomány.Sorok.Szám
OldHeight = OldHeight + .Cells(CRrow, narancssárga.Sor + R1 - 1).SorHeight 'A cellatartomány meglévő sormagasságának összegyűjtése
Következő
oRange.MergeCells = Hamis
.Range(Letter & CRow).Cél másolása:=Tartomány(ICell) 'Szöveget és betűméretet másol, nem csak értékeket
.Range(ICell).WrapText = Igaz 'wrap ICell
.Columns(ILetter).ColumnWidth = OldWidth 'az ICell elemet tartalmazó oszlop szélességének módosítása a meglévő tartomány utánzása érdekében
.Rows(LastRow + 1).EntireRow.AutoFit 'Az ICell sor automatikus illesztése, készen áll a szükséges egyesített magasság mérésére
oRange.MergeCells = Igaz 'Az egyesített tartomány visszaállítása összevont értékre
oRange.WrapText = Igaz és csomagolás
„Mérje meg a szükséges magasságot az egyesített tartományhoz
ÚjMagasság = .Sorok(Utolsó sor + 1).SorMagasság
„Az új szükséges magasság meghaladja-e a régi meglévő magasságot?
Ha NewHeight > OldHeight Akkor
Ha R1 = CROW to CR + narancssárga.Sorok.Szám - 1
„Növelje a tartomány minden sorát arányosan
Tartomány(ILletter & R1).SorMagasság = Tartomány(ILLetter & R1).SorMagasság * ÚjMagasság / Régi Magasság
Következő
Más
'elegendő hely az egyesített cellában
Ha véget
CRow = CROW + narancssárga.Sorok.számlálás - 1 másik a többsoros tartományban, leesik a tartomány 2. sorára, és megismétli a számítást, amikor a "Következő"-hez érkezik.
.Tartomány(ICell).A 'Zap ICell törlése készen áll a következő számításra
.Range(ICell).ColumnWidth = 8.1 'Oszlopszélesség rendbetétele
Vége
Ha véget
Ha véget
Következő
Következő

'Oszlopszélesség visszaállítása a hozzáadott 4% eltávolításával (a burkolási hiba kijavításához szükséges)
Tartomány("A" & LastRow + 1).Válassza ki
C1 esetén = 1 - Utolsó oszlop
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'az oszlop szélességének csökkentése az eredetire
ActiveCell.Offset(0, 1).Tartomány("A1").Jelölje ki a ' egy cellát jobbra
Következő
Tartomány("A1").Válassza ki

Application.ScreenUpdating = Igaz, kapcsolja vissza a frissítést
Exit Sub

TomsHandler:
Application.ScreenUpdating = Igaz, kapcsolja vissza a frissítést
TwN = Hibaszám
TwD = Err.Description
MsgBox "Kezelni kell a hibát " & TwN & " " & TwD
megáll
Folytatás
End Sub

Megakadályozható, hogy az Excel megváltoztassa a képernyő megjelenését a munkafüzet bezárásakor/újranyitásakor?
A teljes hozzászólás megtekintése