Söndag, 08 oktober 2017
  0 svar
  3.1K besök
0
Röster
Ångra
Jag har ett kalkylblad i en arbetsbok som innehåller över 400 rader, 8 kolumner och 160 sammanslagna intervall och jag förstörde dess utseende. Jag sökte på internet efter VBA Autofit Merged Cells. Ingen av webbadresserna är mycket användbar. Makrot på den här webbplatsen är på rätt spår men: -
1) Jag måste manuellt identifiera och skriva in de 160 sammanslagna intervallen.
Jag lade till en sökning efter sammanslagna cellområden.
2) Den använder rad ett för att göra sammanslagna cellberäkningar (Cell ZZ1). Jag använder ett mycket större teckensnitt på cell A1 (Titel) vilket resulterar i fel vid beräkning av den erforderliga sammanslagna autofithöjden.
Jag använder en cell 1 kolumn höger och 1 rad under data. (Ctrl+Skift+End, hittar inte den här cellen)
3) Den räknar om alla sammanslagna celler så att den minskade höjden på två rader som innehåller både sammanslagna och normala celler, vilket gör de normala cellerna oläsliga.
Jag ändrar radhöjden endast när den erforderliga sammanslagna höjden överstiger befintlig höjd.
4) Metoden för att kopiera data i sammanslagna intervall till cell ZZ1 är felaktig, endast baserad på text i det sammanslagna intervallet men inte med hänsyn till olika teckenstorlekar i olika sammanslagna celler.
Jag korrigerade kopieringsmetoden.
5) Makrot är långsamt: cirka 15+ sekunder på mitt kalkylblad.
Om du stänger av skärmuppdateringen och slår på den igen vid slutet av makrot minskar detta till 2 sekunder.

Jag lyckades hitta ett annat irriterande fel. Anpassa kalkylbladet automatiskt (innan de sammanslagna intervallen korrigerades) och det förvrängde flera rader. Vissa "normala" celler, inställda på radbrytande, fick sin höjd ökad och visades som en rad (eller två rader) med text med en tom rad under texten. Internetsökning visade att det orsakades av att Excel ändrade displayen så att den passar skrivarteckensnitt. Hittade ett "work around", jag la till makrot:
Öka kolumnbredden med en liten procentandel.
Autopassa alla rader på kalkylbladet.
Utför korrigeringar av radhöjden för att tillgodose sammanslagna intervall.
Återställ kolumnbredden till originalstorlekar.
Det fixade det, tomma rader visas inte längre!

Trodde att allt nu var korrekt men jag upptäckte sedan ytterligare ett problem. Om jag stänger arbetsboken och öppnar den igen, är de tomma raderna tillbaka igen. Tittade på Arkiv/Alternativ och jag har sökt på Internet efter en metod för att förhindra att arbetsboken uppdaterar skärmvisningen vid stängning/öppning av arbetsboken utan framgång. Jag var tvungen att lägga till Private Sub Workbook_Open() på fliken "ThisWorkbook" med ett anrop för att köra makrot när arbetsboken öppnas.


Explicit alternativ

Sub Look4Merged()
Dim WSN As String 'Arbetsbladsnamn
Dim sht Som arbetsblad 'Används av "Set"
Dim LastRow As Long 'Sista raden i alla kolumner med data
Dim LastRowCC As Long 'Sista raden i aktuell kolumn med data
Dim LastColumn As Integer 'Antal sista kolumn i alla rader med data
Dim CurrCol As Heltal 'Antal aktuell kolumn
Dim bokstav som sträng 'Konvertera CurrCol-nummer till sträng
Dim ILetter As String 'Index kolumn ett till höger om sista kolumnen
Dim ICell As String 'Cell en kolumn höger & en rad ner frpm dataområde. Används för att beräkna erforderlig sammanfogad höjd
Dim Crow As Long 'Aktuellt radnummer
Dim TwN As Long 'Felhantering
Dim TwD As String 'Felhantering
Dim Mgd As Boolean 'True/False testa om cellen är sammanfogad
Dim MgdCellAddr As String 'Innehåller sammanslagna intervall som en sträng
Dim MgdCellStart As String 'Startbokstav för sammanslaget cellområde Används t.ex. inspektera kolumn B för sammanslagna celler, ignorera alla sammanslagna celler som börjar i kolumn A som sträcker sig till kolumn B (redan utvärderad)
Dim MgdCellStart1 As String 'används för att beräkna MgdCellStart
Dim MgdCellStart2 As String 'används för att beräkna MgdCellStart
Dim OldHeight As Single 'Befintlig höjd på alla rader i det sammanslagna området
Dim P1 Som heltal 'Slingantal/pekare
Dim OldWidth As Single 'Befintlig bredd på celler i sammanslaget område
Dim NewHeight As Single 'Obligatorisk höjd på alla rader i det sammanslagna området. Uppdatera enskilda rader proportionellt om den överskrider OldHeight
Dim C1 Som heltal 'Loop Kolumnantal
Dim R1 As Long 'Loop Radantal/pekare
Dim Tweak As Single 'Liten ökning av kolumnbredden för att övervinna problem med tomma rader
Dim eller Range As Range
Vid fel GoTo TomsHandler

Application.ScreenUpdating = False 'MYCKET snabbare 15 sekunder om skärmen uppdateras endast 2 sekunder avstängd.
Tweak = 1.04 'Öka kolumnbredden med 4% innan Autopassa alla rader.
WSN = ActiveSheet.Name
Kolumner("A:A").EntireRow.Hidden = False

'Hitta senaste aktiva rad och kolumn i hela arbetsbladet med data
Med 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:=xlFöregående). Rad
Sluta med
CurrCol = LastColumn + 1 'dvs till höger om sista kolumnen
Om CurrCol < 27 Då
ILetter = Chr$(CurrCol + 64) 'Indexkolumn
annars
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Indexkolumn om tvåsiffrigt. har inte brytt sig om trippelbokstav
End If

'Icell ligger till höger och under data. Cell används för att beräkna den höjd som krävs för att passa sammanslaget område
ICell = ILetter & LastRow + 1

'Öka kolumnbredden med en liten mängd för att bota omslagsfel för tomma rader.
Range("A" & LastRow + 1). Välj
För C1 = 1 till sista kolumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak 'öka kolumnbredden med en liten mängd för att bota fel
ActiveCell.Offset(0, 1). Range("A1"). Välj ' flytta en cell åt höger
Nästa

"Autofit Rows (ignorerar sammanslagna rader) med kolumnbredd 4% extra för att förhindra tomma rader bugg på vissa rader rader
Cells.Select
Selection.Rows.AutoFit
Set sht = Worksheets(WSN) 'behövde för att hitta Senaste posten i kolumn med data

För CurrCol = 1 Till LastColumn
'konvertera nuvarande kolumnnummer till alfa (antingen enkel eller dubbelbokstav)
Om CurrCol < 27 Då
Bokstav = Chr$(CurrCol + 64)
annars
Bokstav = Chr$(Int((CurrCol - 1) / 26) + 64)
Bokstav = Bokstav & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
End If
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'hitta sista raden i aktuell kolumn

För Crow = 1 Till LastRowCC
Räckvidd (bokstav & CRow). Välj
Mgd = ActiveCell.MergeCells 'Är cellen i sammanslaget område
Om Mgd = True Sedan 'Om sant, så är det
"Vad är den sammanslagna intervalladressen? extrahera en-/dubbelsiffrig för start av intervall
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
Om MgdCellStart2 = "$" Då
MgdCellStart = MgdCellStart1
annars
MgdCellStart = MgdCellStart1 & MgdCellStart2
End If
Om MgdCellStart = Bokstav Då 'Är den sammanslagna cellens första kolumn lika med den aktuella kolumnen
Med ark (WSN)
OldWidth = 0
Set oRange = Range(MgdCellAddr) 'ställ oRange till Merged Range upptäckt
För C1 = 1 Till orRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Ackumulera kolumnbredder för cellintervall (med 4 % tillagda)
Nästa
OldHeight = 0
För R1 = 1 Till orRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, orRange.Row + R1 - 1). RowHeight 'Ackumulera befintlig radhöjd för cellintervall
Nästa
oRange.MergeCells = Falskt
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Kopierar text OCH teckenstorlek, inte bara värden
.Range(ICell).WrapText = True 'wrap ICell
.Columns(ILetter).ColumnWidth = OldWidth 'ändra bredden på kolumn som innehåller ICell för att efterlikna befintligt intervall
.Rows(Last Row + 1).EntireRow.AutoFit 'Autopassa ICell-raden, redo att mäta den erforderliga sammanslagna höjden
oRange.MergeCells = Sant 'Återställ det sammanslagna området till sammanslaget
oRange.WrapText = Sant 'och omslag
'Mät erforderlig höjd för sammanslagen räckvidd
NewHeight = .Rows(Last Row + 1).RowHeight
"Överskrider den nya erforderliga höjden den gamla befintliga höjden
Om NewHeight > OldHeight Då
För R1 = CROW To CRow + oRange.Rows.Count - 1
'Öka varje rad i intervallet pro rata
Range(ILetter & R1).RadHeight = Range(ILetter & R1).RowHeight * NewHeight / OldHeight
Nästa
annars
'tillräckligt utrymme i sammanslagen cell
End If
CRow = CRow + oRange.Rows.Count - 1 'annan på flerradsintervall, kommer att falla ner till 2:a raden i intervallet och upprepa beräkningen när du kommer till "Nästa"
.Range(ICell). Rensa 'Zap ICell redo för nästa beräkning
.Range(ICell).ColumnWidth = 8.1 'Rädda kolumnbredden
Sluta med
End If
End If
Nästa
Nästa

"Återställ kolumnbredden och ta bort 4 % tillagda (behövs för att åtgärda inpackningsfel)
Range("A" & LastRow + 1). Välj
För C1 = 1 till sista kolumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'minska kolumnbredden till originalet
ActiveCell.Offset(0, 1).Range("A1").Välj ' en cell höger
Nästa
Range("A1"). Välj

Application.ScreenUpdating = True 'slå på uppdatering igen
Exit Sub

TomsHandler:
Application.ScreenUpdating = True 'slå på uppdatering igen
TwN = Err.Number
TwD = Err.Description
MsgBox "Behöver hantera fel" & TwN & " " & TwD
Sluta
CV
End Sub

Är det möjligt att förhindra att Excel ändrar skärmvisningens utseende när du stänger/öppnar arbetsboken igen?
Det finns inga svar på det här inlägget än.