Nedelja, 08 oktober 2017
  0 odgovori
  3.2 tisoč obiskov
0
Glasov
Razveljavi
Imam delovni list v delovnem zvezku, ki vsebuje več kot 400 vrstic, 8 stolpcev in 160 združenih obsegov, in sem pokvaril njegov videz. Na internetu sem iskal VBA Autofit združene celice. Noben od URL-jev ni veliko uporaben. Makro na tem spletnem mestu je na pravi poti, vendar: -
1) Ročno bi moral identificirati in vnesti 160 združenih obsegov.
Dodal sem iskanje za združene obsege celic.
2) Uporablja vrstico ena za izračune združenih celic (celica ZZ1). V celici A1 (Naslov) uporabljam veliko večjo pisavo, kar povzroči napake pri izračunu zahtevane spojene višine samodejnega prilagajanja.
Uporabljam celico 1 stolpec desno in 1 vrstico pod podatki. (Ctrl+Shift+End, ne najde te celice)
3) Ponovno izračuna vse združene celice, tako da je zmanjšal višino dveh vrstic, ki vsebujeta tako spojene kot običajne celice, zaradi česar normalne celice niso berljive.
Višino vrstice spremenim samo, če zahtevana spojena višina presega obstoječo višino.
4) Metoda za kopiranje podatkov v združenih obsegih v celico ZZ1 je napačna, saj temelji le na besedilu v združenem obsegu, ne upošteva pa različnih velikosti pisave v različnih združenih celicah.
Popravil sem način kopiranja.
5) Makro je počasen: približno 15+ sekund na mojem delovnem listu.
Če izklopite osvežitev zaslona in znova vklopite na koncu makra, se to zmanjša na 2 sekundi.

Uspelo mi je najti še eno motečo napako. Samodejno prilagodite delovni list (preden popravite združene obsege) in je popačilo več vrstic. Nekatere »normalne« celice, nastavljene na ovite, so imele povečano višino in so se pojavljale kot vrstica (ali dve vrstici) besedila s prazno vrstico pod besedilom. Internetno iskanje je pokazalo, da je vzrok za to, da je Excel spremenil zaslon tako, da je prilagodil pisave tiskalnika. Našel sem "opravilo", dodal sem makro:
Povečajte širino stolpcev za majhen odstotek.
Samodejno prilagodi vse vrstice na delovnem listu.
Izvedite popravke višine vrstice, da se prilagodijo združenim obsegom.
Vrnite širino stolpca na prvotne velikosti.
To je popravilo, prazne vrstice se zdaj ne pojavljajo več!

Mislil sem, da je zdaj vse pravilno, vendar sem nato odkril nadaljnjo težavo. Če zaprem delovni zvezek in ga znova odprem, so prazne vrstice spet nazaj. Pogledal sem Datoteka/Možnosti in v internetu sem poiskal način, kako preprečiti, da bi delovni zvezek brezuspešno posodabljal zaslonski prikaz ob zapiranju/odpiranju delovnega zvezka. Na zavihku »Ta delovni zvezek« sem moral dodati Private Sub Workbook_Open() s klicem za zagon makra, ko je delovni zvezek odprt.


Option Explicit

Sub Look4Merged()
Dim WSN kot niz 'ime delovnega lista
Dim sht kot delovni list 'Uporablja ga "Set"
Dim LastRow As Long 'Zadnja vrstica v vseh stolpcih s podatki
Dim LastRowCC As Long 'Zadnja vrstica v trenutnem stolpcu s podatki
Dim LastColumn As Integer 'Število zadnjega stolpca v vseh vrsticah s podatki
Dim CurrCol As Integer 'Število trenutnega stolpca
Dim Letter As String 'Pretvori številko CurrCol v niz
Dim ILetter As String 'Indeksni stolpec ena desno od zadnjega stolpca
Dim ICell As String 'Celica en stolpec desno in eno vrstico navzdol frpm podatkovno območje. Uporablja se za izračun zahtevane spojene višine
Dim Crow As Long 'Trenutna številka vrstice
Dim TwN As Long 'Obravnava napak
Dim TwD As String 'Obravnava napak
Dim Mgd As Boolean 'True/False test, če je celica združena
Dim MgdCellAddr As String 'Vsebuje združen obseg kot niz
Dim MgdCellStart As String 'Začetna črka združenega obsega celic Uporablja se npr. pri pregledovanju stolpca B za združene celice, prezrite vse združene celice, ki se začnejo v stolpcu A in segajo do stolpca B (že ocenjeno)
Dim MgdCellStart1 kot niz, ki se uporablja za izračun MgdCellStart
Dim MgdCellStart2 kot niz, ki se uporablja za izračun MgdCellStart
Dim OldHeight As Single 'Obstoječa višina vseh vrstic v združenem obsegu
Dim P1 As Integer 'Število zanke/kazalec
Dim OldWidth As Single 'Obstoječa širina celic v združenem obsegu
Dim NewHeight As Single 'Zahtevana višina vseh vrstic v združenem obsegu. Sorazmerno posodobi posamezne vrstice, če presega OldHeight
Dim C1 As Integer 'Število stolpcev zanke
Dim R1 As Long 'Loop Row count/pointer
Dim Tweak As Single 'Majhno povečanje širine stolpca za premagovanje težave s praznimi vrsticami
Zatemni oranžno kot obseg
Ob napaki Pojdite na TomsHandler

Application.ScreenUpdating = False 'MNOGO hitreje 15 sekund, če je zaslon posodobljen samo 2 sekundi izklopljen.
Tweak = 1.04 'Povečaj širino stolpca za 4 % pred samodejnim prilagajanjem vseh vrstic.
WSN = ActiveSheet.Name
Stolpci("A:A").EntireRow.Hidden = False

»Poišči zadnjo aktivno vrstico in stolpec v celotnem delovnem listu s podatki
Z ActiveSheet.UsedRange
Zadnji stolpec = Obseg(Obseg("A1"), Celice(Število vrstic, Število stolpcev)).Najdi(Kaj:="*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Stolpec
Zadnja vrstica = Obseg(Razpon("A1"), Celice(Število vrstic, Število stolpcev)).Najdi(Kaj:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Končaj s
CurrCol = Zadnji stolpec + 1 'tj. desno od zadnjega stolpca
Če je CurrCol < 27 Potem
ILetter = Chr$(CurrCol + 64) 'Indeksni stolpec
Else
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Indeksni stolpec, če je dvomestna. se niste trudili s trojnimi črkami
Konec Če

»Icell se nahaja desno in pod podatki. Celica se uporablja za izračun višine, potrebne za prileganje združenemu obsegu
ICell = ILetter & LastRow + 1

'Povečajte širino stolpca za majhno količino, da odpravite napako pri zavijanju praznih vrstic.
Obseg("A" & Zadnja vrstica + 1).Izberi
Za C1 = 1 do zadnjega stolpca
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak 'povečaj širino stolpca za majhno količino, da odpravi napako
ActiveCell.Offset(0, 1).Range("A1").Izberi ' premakni eno celico desno
Naslednji

»Samodejno prilagajanje vrstic (prezri združene vrstice) s širino stolpca za 4 % več, da preprečimo napako praznih vrstic na nekaterih vrsticah za ovijanje
Celice.Izberi
Selection.Rows.AutoFit
Nastavite sht = Delovni listi (WSN) 'potrebni za iskanje zadnjega vnosa v stolpcu s podatki

Za CurrCol = 1 do zadnjega stolpca
'pretvori trenutno številko stolpca v alfa (eno- ali dvojno črko)
Če je CurrCol < 27 Potem
Črka = Chr$(CurrCol + 64)
Else
Črka = Chr$(Int((CurrCol - 1) / 26) + 64)
Črka = črka & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
Konec Če
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'poišči zadnjo vrstico v trenutnem stolpcu

Za CRow = 1 Za LastRowCC
Obseg (črka & CRow).Izberi
Mgd = ActiveCell.MergeCells 'Je celica v združenem obsegu
Če je Mgd = True, potem 'Če je res, potem je
»Kakšen je naslov združenega obsega? izvleči eno/dvomestno številko za začetek obsega
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
Če je MgdCellStart2 = "$" Potem
MgdCellStart = MgdCellStart1
Else
MgdCellStart = MgdCellStart1 & MgdCellStart2
Konec Če
Če je MgdCellStart = Letter, potem je 'Ali je prvi stolpec spojene celice enak trenutnemu stolpcu
Z listi (WSN)
Stara širina = 0
Nastavi oRange = Range(MgdCellAddr) 'nastavi oRange na zaznan združeni obseg
Za C1 = 1 To oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Akumuliraj širine stolpcev za obseg celic (z dodanimi 4 %)
Naslednji
Stara višina = 0
Za R1 = 1 do oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Akumuliraj obstoječo višino vrstice za obseg celic
Naslednji
oRange.MergeCells = False
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Kopira besedilo IN velikost pisave, ne samo vrednosti
.Range(ICell).WrapText = True 'wrap ICell
.Columns(ILetter).ColumnWidth = OldWidth 'spremeni širino stolpca, ki vsebuje ICell, da posnema obstoječi obseg
.Rows(LastRow + 1).EntireRow.AutoFit 'Samodejno prilagajanje vrstice ICell, pripravljeno za merjenje zahtevane spojene višine
oRange.MergeCells = True 'Ponastavi združeni obseg nazaj na spojen
oRange.WrapText = True 'in ovijanje
'Izmerite zahtevano višino za združeni obseg
NewHeight = .Rows(LastRow + 1).RowHeight
„Ali nova zahtevana višina presega staro obstoječo višino
Če NewHeight > OldHeight Potem
Za R1 = Crow Do Crow + oRange.Rows.Count - 1
»Povečaj vsako vrstico v obsegu sorazmerno
Obseg(ILetter & R1).RowHeight = Obseg(ILetter & R1).RowHeight * NewHeight / OldHeight
Naslednji
Else
'dovolj prostora v združeni celici
Konec Če
CRow = CRow + oRange.Rows.Count - 1 'drugo v večvrstnem obsegu, se bo spustilo navzdol na 2. vrstico obsega in ponovilo izračun, ko prispete na "Naprej"
.Range(ICell).Počisti 'Zap ICell pripravljen za naslednji izračun
.Range(ICell).ColumnWidth = 8.1 'Popravi širino stolpca
Končaj s
Konec Če
Konec Če
Naslednji
Naslednji

»Ponastavi širino stolpca z odstranitvijo dodanih 4 % (potrebno za odpravo napake pri previjanju)
Obseg("A" & Zadnja vrstica + 1).Izberi
Za C1 = 1 do zadnjega stolpca
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'zmanjša širino stolpca na izvirno
ActiveCell.Offset(0, 1).Range("A1").Izberi ' eno celico desno
Naslednji
Obseg("A1").Izberi

Application.ScreenUpdating = True 'vklop posodabljanja
Exit Sub

TomsHandler:
Application.ScreenUpdating = True 'vklop posodabljanja
TwN = številka napake
TwD = Opis napake
MsgBox "Treba obravnavati napako " & TwN & " " & TwD
stop
Resume
End Sub

Ali je mogoče preprečiti, da bi Excel spremenil videz zaslona ob zapiranju/ponovnem odpiranju delovnega zvezka?
Za to objavo še ni odgovorov.