By Tom WhiteJnr w niedzielę 08r
Opublikowany w przewyższać
Odpowiedzi 0
Lubi 0
odwiedzajacy 3.1 tysięcy
Głosów 0
Mam arkusz w skoroszycie zawierającym ponad 400 wierszy, 8 kolumn i 160 połączonych zakresów i zepsułem jego wygląd. Przeszukałem Internet w poszukiwaniu VBA Autofit Merged Cells. Żaden z adresów URL nie jest zbyt użyteczny. Makro na tej stronie jest na dobrej drodze, ale: -
1) Musiałbym ręcznie zidentyfikować i wpisać 160 połączonych zakresów.
Dodałem wyszukiwanie dla scalonych zakresów komórek.
2) Używa pierwszego wiersza do obliczeń połączonych komórek (Komórka ZZ1). Używam znacznie większej czcionki w komórce A1 (tytuł), co powoduje błędy w obliczaniu wymaganej scalonej wysokości autodopasowania.
Używam komórki 1 kolumny w prawo i 1 wiersz poniżej danych. (Ctrl+Shift+End, nie znajduje tej komórki)
3) Ponownie oblicza wszystkie połączone komórki, zmniejszając wysokość dwóch wierszy zawierających zarówno połączone, jak i normalne komórki, przez co normalne komórki są nieczytelne.
Zmieniam wysokość wiersza tylko wtedy, gdy wymagana połączona wysokość przekracza istniejącą wysokość.
4) Metoda kopiowania danych ze scalonych zakresów do komórki ZZ1 jest błędna, oparta wyłącznie na tekście w scalonym zakresie bez uwzględnienia różnej wielkości czcionek w różnych scalonych komórkach.
Poprawiłem metodę kopiowania.
5) Makro działa wolno: około 15+ sekund w moim arkuszu.
Wyłączenie i ponowne włączenie odświeżania ekranu na końcu makra skraca ten czas do 2 sekund.

Udało mi się znaleźć jeszcze jedną irytującą wadę. Automatyczne dopasowanie arkusza (przed poprawieniem scalonych zakresów) i zniekształcenie kilku wierszy. Niektóre „normalne” komórki ustawione na zawijanie miały zwiększoną wysokość i pojawiały się jako linia (lub dwie linie) tekstu z pustym wierszem pod tekstem. Wyszukiwanie w Internecie wykazało, że jest to spowodowane tym, że program Excel zmienia sposób wyświetlania w celu uwzględnienia czcionek drukarki. Znalazłem „obejście”, dodałem do makra:
Zwiększ szerokość kolumn o niewielki procent.
Dopasuj automatycznie wszystkie wiersze w arkuszu.
Wprowadź poprawki do wysokości wiersza, aby uwzględnić połączone zakresy.
Przywróć szerokość kolumny do oryginalnych rozmiarów.
To naprawiło, puste wiersze już się nie pojawiają!

Myślałem, że wszystko jest już w porządku, ale potem odkryłem kolejny problem. Jeśli zamknę skoroszyt i ponownie go otworzę, puste wiersze znów się pojawią. Spojrzałem na Plik/Opcje i przeszukałem Internet w poszukiwaniu metody zapobiegania aktualizowaniu skoroszytu podczas zamykania/otwierania skoroszytu bez powodzenia. Musiałem dodać Private Sub Workbook_Open() na karcie „ThisWorkbook” z wywołaniem uruchomienia makra po otwarciu skoroszytu.


Opcja Jawna

Sub Look4Merged()
Dim WSN jako ciąg „Nazwa arkusza roboczego
Dim sht As Worksheet „Używany przez „Set”
Dim LastRow As Long 'Ostatni wiersz we wszystkich kolumnach z danymi
Dim LastRowCC As Long 'Ostatni wiersz w bieżącej kolumnie z danymi
Dim LastColumn As Integer 'Liczba ostatniej kolumny we wszystkich wierszach z danymi
Dim CurrCol As Integer 'Numer bieżącej kolumny
Dim Letter As String 'Konwertuj numer CurrCol na łańcuch
Dim ILetter As String 'Indeksuj kolumnę pierwszą na prawo od ostatniej kolumny
Dim ICell As String 'Komórka o jedną kolumnę w prawo i jeden wiersz w dół obszar danych fpm. Służy do obliczania wymaganej połączonej wysokości
Dim CRow As Long „Bieżący numer wiersza
Dim TwN As Long 'Obsługa błędów
Dim TwD As String 'Obsługa błędów
Dim Mgd As Boolean 'True/False test, czy komórka jest scalona
Dim MgdCellAddr As String 'Zawiera scalony zakres jako łańcuch
Dim MgdCellStart As String 'Litera początkowa scalonego zakresu komórek Stosowana np. przy sprawdzaniu kolumny B pod kątem scalonych komórek, ignorowanie wszelkich scalonych komórek rozpoczynających się w kolumnie A i sięgających do kolumny B (już ocenione)
Dim MgdCellStart1 As String 'używany do obliczenia MgdCellStart
Dim MgdCellStart2 As String 'używany do obliczenia MgdCellStart
Dim OldHeight As Single 'Istniejąca wysokość wszystkich wierszy w scalonym zakresie
Dim P1 As Integer 'Licznik/wskaźnik pętli
Dim OldWidth As Single 'Istniejąca szerokość komórek w scalonym zakresie
Dim NewHeight As Single 'Wymagana wysokość wszystkich wierszy w scalonym zakresie. Aktualizuj poszczególne wiersze proporcjonalnie, jeśli przekracza wartość OldHeight
Dim C1 As Integer 'Liczba kolumn w pętli
Dim R1 As Long 'Liczba wierszy/wskaźnik pętli
Dim Tweak As Single 'Niewielkie zwiększenie szerokości kolumny w celu rozwiązania problemu z pustymi wierszami
Przyciemnij pomarańczowy Zakres jako zakres
W przypadku błędu Przejdź do TomsHandler

Application.ScreenUpdating = False 'DUŻO szybciej 15 sekund, jeśli ekran aktualizowany tylko przez 2 sekundy jest wyłączony.
Tweak = 1.04 „Zwiększ szerokość kolumny o 4% przed automatycznym dopasowaniem wszystkich wierszy.
WSN = ActiveSheet.Nazwa
Columns("A:A").EntireRow.Hidden = Fałsz

„Znajdź ostatni aktywny wiersz i kolumnę w całym arkuszu z danymi
Z ActiveSheet.UsedRange
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
Porządek wyszukiwania:=xlByColumns, SearchDirection:=xlPrevious).Kolumna
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Wiersz
Kończyć z
CurrCol = LastColumn + 1 'tj. na prawo od ostatniej kolumny
Jeśli CurrCol < 27 To
ILetter = Chr$(CurrCol + 64) 'Kolumna indeksu
Więcej
ILitera = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Kolumna indeksu, jeśli podwójna cyfra. Nie zawracałem sobie głowy potrójną literą
End If

„Icell znajduje się na prawo i poniżej danych. Komórka służy do obliczenia wysokości wymaganej do dopasowania scalonego zakresu
ICell = ILetter & LastRow + 1

„Zwiększ szerokość kolumny o niewielką wartość, aby naprawić błąd zawijania pustych wierszy.
Range("A" & LastRow + 1). Wybierz
Dla C1 = 1 do ostatniej kolumny
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak „zwiększ szerokość kolumny o niewielką wartość, aby naprawić błąd
ActiveCell.Offset(0, 1).Range("A1").Select ' przenieś jedną komórkę w prawo
Następna

„Autodopasowanie wierszy (ignoruje połączone wiersze) z szerokością kolumny o 4% więcej, aby zapobiec błędom pustych wierszy w niektórych zawijanych wierszach
Komórki Wybierz
Zaznaczenie.Wiersze.Autodopasowanie
Set sht = Worksheets(WSN) 'potrzebne do znalezienia ostatniego wpisu w kolumnie z danymi

Dla CurrCol = 1 do ostatniej kolumny
„konwertuj bieżący numer kolumny na alfa (pojedynczą lub podwójną literę)
Jeśli CurrCol < 27 To
Litera = Chr$(CurrCol + 64)
Więcej
Litera = Chr$(Int((CurrCol - 1) / 26) + 64)
Litera = Litera & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
End If
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'znajdź ostatni wiersz w bieżącej kolumnie

Dla CRow = 1 do LastRowCC
Zakres (litery i CRow). Wybierz
Mgd = ActiveCell.MergeCells 'To komórka w scalonym zakresie
Jeśli Mgd = Prawda, to „Jeśli prawda, to tak”.
„Jaki jest adres połączonego zakresu? wyodrębnij pojedynczą/podwójną cyfrę dla początku zakresu
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Środkowy(MgdCellAddr, 2, 1)
MgdCellStart2 = Środkowy(MgdCellAddr, 3, 1)
Jeśli MgdCellStart2 = "$" To
MgdCellStart = MgdCellStart1
Więcej
MgdCellStart = MgdCellStart1 & MgdCellStart2
End If
If MgdCellStart = Letter Then „Pierwsza kolumna scalonej komórki jest równa bieżącej kolumnie
Z arkuszami (WSN)
Stara szerokość = 0
Ustaw oRange = Range(MgdCellAddr) 'ustaw oRange na wykryty zakres scalony
Dla C1 = 1 do pomarańczowego zakresu.liczba kolumn
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Akumuluje szerokości kolumn dla zakresu komórek (z dodanymi 4%)
Następna
Stara wysokość = 0
Dla R1 = 1 do pomarańczowego zakresu.liczba wierszy
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Akumuluje istniejącą wysokość wiersza dla zakresu komórek
Następna
lubRange.MergeCells = Fałsz
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Kopiuje tekst ORAZ rozmiar czcionki, nie tylko wartości
.Range(ICell).WrapText = True 'zawijaj ICell
.Columns(ILetter).ColumnWidth = OldWidth 'zmień szerokość kolumny zawierającej ICell, aby naśladować istniejący zakres
.Rows(LastRow + 1).EntireRow.AutoFit 'Automatycznie dopasuj wiersz ICell, gotowy do pomiaru wymaganej połączonej wysokości
oRange.MergeCells = True 'Zresetuj scalony zakres z powrotem do scalonego
oRange.WrapText = True 'i zawijanie
„Zmierz wymaganą wysokość dla połączonego zasięgu
NowaWysokość = .Rows(LastRow + 1).RowHeight
„Czy nowa wymagana wysokość przekracza starą istniejącą wysokość
Jeśli nowa wysokość > stara wysokość to
Dla R1 = CRow To CRow + oRange.Rows.Count - 1
'Zwiększ każdy rząd w zakresie proporcjonalnie
Range(ILiter & R1).RowHeight = Range(ILetter & R1).RowHeight * NewHeight / OldHeight
Następna
Więcej
„wystarczająca ilość miejsca w połączonej komórce
End If
CRow = CRow + oRange.Rows.Count - 1 „inaczej w zakresie wielu wierszy, spadnie do drugiego rzędu zakresu i powtórzy obliczenia po dotarciu do „Dalej”
.Range(ICell).Clear 'Zap ICell gotowy do następnego obliczenia
.Range(ICell).ColumnWidth = 8.1 'Uporządkuj szerokość kolumny
Kończyć z
End If
End If
Następna
Następna

„Zresetuj szerokość kolumny, usuwając 4% dodane (potrzebne do naprawienia błędu zawijania)
Range("A" & LastRow + 1). Wybierz
Dla C1 = 1 do ostatniej kolumny
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'zmniejsz szerokość kolumny do oryginalnej
ActiveCell.Offset(0, 1).Range("A1").Wybierz ' jedną komórkę w prawo
Następna
Zakres ("A1"). Wybierz

Application.ScreenUpdating = True 'włącz ponownie aktualizację
Exit Sub

Obsługa Tomów:
Application.ScreenUpdating = True 'włącz ponownie aktualizację
TwN = numer błędu
TwD = Opis błędu
MsgBox "Konieczność obsługi błędów " & TwN & " " & TwD
Stop
Resume
End Sub

Czy można uniemożliwić programowi Excel zmianę wyglądu ekranu przy zamykaniu/ponownym otwieraniu skoroszytu?
Wyświetl pełny post