Zondag, oktober 08 2017
  0 Antwoorden
  3.1K bezoeken
Ik heb een werkblad in een werkmap met meer dan 400 rijen, 8 kolommen en 160 samengevoegde bereiken en ik heb het uiterlijk verknoeid. Ik zocht op internet naar VBA Autofit Merged Cells. Geen van de URL's heeft veel nut. De macro op deze website is op de goede weg maar: -
1) Ik zou de 160 samengevoegde reeksen handmatig moeten identificeren en typen.
Ik heb een zoekopdracht toegevoegd voor samengevoegde celbereiken.
2) Het gebruikt rij één om samengevoegde celberekeningen uit te voeren (cel ZZ1). Ik gebruik een veel groter lettertype op cel A1 (Titel), wat resulteert in fouten bij het berekenen van de vereiste samengevoegde autofit-hoogte.
Ik gebruik een cel 1 kolom rechts en 1 rij onder gegevens. (Ctrl+Shift+End, vindt deze cel niet)
3) Het berekent alle samengevoegde cellen opnieuw, zodat de hoogte van twee rijen met zowel samengevoegde als normale cellen wordt verkleind, waardoor de normale cellen onleesbaar worden.
Ik wijzig de rijhoogte alleen als de vereiste samengevoegde hoogte de bestaande hoogte overschrijdt.
4) De methode voor het kopiëren van gegevens in samengevoegde bereiken naar cel ZZ1 is onjuist, alleen gebaseerd op tekst in het samengevoegde bereik, maar houdt geen rekening met verschillende lettergroottes in verschillende samengevoegde cellen.
Ik heb de kopieermethode gecorrigeerd.
5) De macro is traag: ongeveer 15+ seconden op mijn werkblad.
Door schermvernieuwing uit te schakelen en aan het einde van de macro weer in te schakelen, wordt dit teruggebracht tot 2 seconden.

Ik heb nog een irritante fout gevonden. Autofit het werkblad (voordat de samengevoegde bereiken werden gecorrigeerd) en het vervormde verschillende rijen. Sommige "normale" cellen, ingesteld op omwikkeld, hadden een grotere hoogte en werden weergegeven als een regel (of twee regels) tekst met een lege rij onder de tekst. Zoeken op internet gaf aan dat het wordt veroorzaakt doordat Excel de weergave aanpast aan printerlettertypen. Ik heb een "work around" gevonden, die ik aan de macro heb toegevoegd:
Vergroot de kolombreedte met een klein percentage.
Autofit alle rijen op werkblad.
Voer correcties uit op de rijhoogte om samengevoegde bereiken te accommoderen.
Zet de kolombreedte terug naar de oorspronkelijke grootte.
Dat loste het op, lege rijen verschijnen nu niet meer!

Dacht dat alles nu correct was, maar ik ontdekte toen een ander probleem. Als ik de werkmap sluit en weer open, zijn de lege rijen weer terug. Gekeken naar Bestand/Opties en ik heb op internet gezocht naar een methode om te voorkomen dat de werkmap de schermweergave bij het sluiten/openen van de werkmap zonder succes bijwerkt. Ik moest Private Sub Workbook_Open() toevoegen aan het tabblad "ThisWorkbook" met een oproep om de macro uit te voeren wanneer de werkmap wordt geopend.


Optie Expliciet

Sub Look4Merged()
Dim WSN As String 'Werkbladnaam
Dim sht als werkblad 'Gebruikt door "Set"
Dim LastRow As Long 'Laatste rij in alle kolommen met gegevens
Dim LastRowCC As Long 'Laatste rij in huidige kolom met gegevens
Dim LastColumn As Integer 'Nummer van de laatste kolom in alle rijen met gegevens
Dim CurrCol As Integer 'Nummer van huidige kolom
Dim Letter As String 'Converteer CurrCol-nummer naar string
Dim ILetter As String 'Indexkolom één rechts van de laatste kolom
Dim ICell As String 'Cel een kolom naar rechts en een rij naar beneden in het gegevensgebied. Wordt gebruikt om de vereiste samengevoegde hoogte te berekenen
Dim CRow As Long 'huidig ​​rijnummer
Dim TwN As Long 'Foutafhandeling
Dim TwD As String 'Foutafhandeling
Dim Mgd As Boolean 'True/False-test als cel is samengevoegd
Dim MgdCellAddr As String 'Bevat samengevoegd bereik als een string
Dim MgdCellStart As String 'Beginletter van samengevoegd celbereik Wordt bijvoorbeeld gebruikt om kolom B te inspecteren op samengevoegde cellen, negeer alle samengevoegde cellen die beginnen in kolom A en zich uitstrekken tot kolom B (reeds beoordeeld)
Dim MgdCellStart1 As String 'gebruikt om MgdCellStart te berekenen
Dim MgdCellStart2 As String 'gebruikt om MgdCellStart te berekenen
Dim OldHeight As Single 'Bestaande hoogte van alle rijen in samengevoegd bereik
Dim P1 As Integer 'Loop count/pointer
Dim OldWidth As Single 'Bestaande breedte van cellen in samengevoegd bereik
Dim NewHeight As Single 'Vereiste hoogte van alle rijen in samengevoegd bereik. Werk individuele rijen proportioneel bij als deze OldHeight overschrijdt
Dim C1 As Integer 'Loop Kolomtelling
Dim R1 As Long 'Loop Rijtelling/aanwijzer
Dim Tweak As Single 'Kleine toename in kolombreedte om het probleem met lege rijen te verhelpen
Dim oRange als bereik
Bij fout Ga naar TomsHandler

Application.ScreenUpdating = False 'VEEL sneller 15 seconden als het scherm slechts 2 seconden is bijgewerkt uitgeschakeld.
Tweak = 1.04 'Verhoog de kolombreedte met 4% voordat alle rijen automatisch worden aangepast.
WSN = ActiveSheet.Naam
Columns("A:A").EntireRow.Hidden = False

'Zoek de laatste actieve rij en kolom in het hele werkblad met gegevens
Met ActiveSheet.UsedRange
LastColumn = Bereik(Bereik("A1"), Cellen(Rijen.Aantal, Kolommen.Aantal)).Zoeken(Wat:="*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Kolom
LastRow = Range(Range("A1"), Cells(Rijen.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
Zoekvolgorde:=xlByRows, Zoekrichting:=xlPrevious).Rij
Eindigt met
CurrCol = LastColumn + 1 'dwz rechts van de laatste kolom
Als CurrCol < 27 Dan
ILetter = Chr$(CurrCol + 64) 'Indexkolom
Anders
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Indexkolom indien dubbele cijfers. Heb geen moeite gedaan met drievoudige letter
End If

'Icell zit rechts en onder data. Cel wordt gebruikt om de hoogte te berekenen die nodig is om in het samengevoegde bereik te passen
ICell = Iletter & LastRow + 1

'Verhoog de kolombreedte met een kleine hoeveelheid om de bug met het verpakken van lege rijen te verhelpen.
Bereik ("A" & Laatste rij + 1). Selecteren
Voor C1 = 1 tot laatste kolom
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak 'verhoog de kolombreedte met een kleine hoeveelheid om bug te verhelpen
ActiveCell.Offset(0, 1).Range("A1").Selecteer ' één cel naar rechts verplaatsen
Volgende

'Automatisch aanpassen van rijen (negeert samengevoegde rijen) met kolombreedte 4% extra om te voorkomen dat lege rijen op sommige omwikkelde rijen fout gaan
Cells.Select
Selectie.Rijen.AutoAanpassen
Set sht = Worksheets(WSN) 'nodig om laatste invoer in kolom met gegevens te vinden

Voor CurrCol = 1 tot LaatsteKolom
'converteer huidig ​​kolomnummer naar alfa (enkele of dubbele letter)
Als CurrCol < 27 Dan
Letter = Chr$(CurrCol + 64)
Anders
Letter = 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 'zoek laatste rij in huidige kolom

Voor CRow = 1 Naar LastRowCC
Bereik(Letter & CRow).Selecteer
Mgd = ActiveCell.MergeCells 'Is cel in samengevoegd bereik
Als Mgd = Waar Dan 'Als Waar, dan is het zo
'Wat is het samengevoegde bereikadres? extraheer enkele/dubbele cijfers voor het begin van het bereik
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Midden(MgdCellAddr, 2, 1)
MgdCellStart2 = Midden(MgdCellAddr, 3, 1)
Als MgdCellStart2 = "$" Dan
MgdCellStart = MgdCellStart1
Anders
MgdCellStart = MgdCellStart1 & MgdCellStart2
End If
Als MgdCellStart = Letter Then 'Is de eerste kolom van de samengevoegde cel gelijk aan de huidige kolom
Met lakens (WSN)
OudeBreedte = 0
Set oRange = Range(MgdCellAddr) 'zet oRange in op Merged Range gedetecteerd
Voor C1 = 1 tot oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Kolombreedtes verzamelen voor celbereik (met 4% toegevoegd)
Volgende
OudeHoogte = 0
Voor R1 = 1 tot oRange.Rijen.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Accumuleer bestaande rijhoogte voor celbereik
Volgende
oBereik.MergeCells = False
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Kopieert tekst EN lettergrootte, niet alleen waarden
.Range(ICell).WrapText = Waar 'wrap ICell
.Columns(ILetter).ColumnWidth = OldWidth 'Wijzig de breedte van de kolom die ICell bevat om het bestaande bereik na te bootsen
.Rows(LastRow + 1).EntireRow.AutoFit 'Autofit de ICell-rij, klaar om de vereiste samengevoegde hoogte te meten
oRange.MergeCells = True 'Reset het samengevoegde bereik terug naar samengevoegd
oRange.WrapText = True 'en terugloop
'Meet vereiste hoogte voor samengevoegd bereik
NieuweHoogte = .Rijen(LaatsteRij + 1).RijHoogte
'Is de Nieuw gewenste hoogte hoger dan de Oude bestaande hoogte
Als NieuweHoogte > OudeHoogte Dan
Voor R1 = CRow naar CRow + oRange.Rows.Count - 1
'Verhoog elke rij in bereik pro rata
Bereik(ILetter & R1).RowHeight = Bereik(ILetter & R1).RowHeight * NewHeight / OldHeight
Volgende
Anders
'voldoende ruimte in samengevoegde cel
End If
CRow = CRow + oRange.Rows.Count - 1 'else op bereik met meerdere rijen, zakt naar de 2e rij van bereik en herhaalt de berekening wanneer u aankomt bij "Volgende"
.Range(ICell).Clear 'Zap ICell gereed voor volgende berekening
.Range(ICell).ColumnWidth = 8.1 'Ruim de kolombreedte op
Eindigt met
End If
End If
Volgende
Volgende

'Reset de kolombreedte door 4% toegevoegd te verwijderen (nodig om de omslagfout te herstellen)
Bereik ("A" & Laatste rij + 1). Selecteren
Voor C1 = 1 tot laatste kolom
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'kolombreedte verkleinen tot origineel
ActiveCell.Offset(0, 1).Range("A1").Selecteer één cel rechts
Volgende
Bereik ("A1"). Selecteer

Application.ScreUpdating = True 'schakel updaten weer in
Exit Sub

Toms Handler:
Application.ScreUpdating = True 'schakel updaten weer in
TwN = Foutnummer
TwD = Foutbeschrijving
MsgBox "Noodzaak om fout af te handelen " & TwN & " " & TwD
stop
Hervat
End Sub

Is het mogelijk om te voorkomen dat Excel het uiterlijk van de schermweergave verandert bij het sluiten/heropenen van de werkmap?
Er zijn nog geen reacties op dit bericht geplaatst.