VBATools

Auto dopasowanie wysokości do tekstu komórek scalonych

by on May.20, 2011, under Excel, Porady

Excel posiada możliwość scalenia komórek, jednakże nie radzi sobie z ich zarządzaniem. W przypadku jednej komórki jest to prosta sprawa. Funkcja auto dopasowania wysokości, szerokości, zawijania tekstu jest elementarna ale dla kilka cell zagregowanych razem jest już problem.

Poniższa procedura umieszczona w module arkusza np: Arkusz1 pozwoli na automatyczne dobranie wysokości komórek do tekstu. Oczywiście ważną rolę odbiera tutaj rodzaj czcionki. Przydatne jest to głównie w przypadku tekstu, opisującego pola arkusza dla różnego rodzaju formularzy Excelowych.

Private Sub Worksheet_Change(ByVal Target As Range)
'Mod by MVP OShon from VBATools.pl
Dim NewRwHt As Single
Dim cWdth As Single, MrgeWdth As Single
Dim c As Range, cc As Range
Dim ma As Range, wysokosc As Currency

With Target
 wysokosc = .RowHeight
 If .MergeCells And .WrapText Then
 Set c = Target.Cells(1, 1)
 cWdth = c.ColumnWidth
 Set ma = c.MergeArea
 For Each cc In ma.Cells
  MrgeWdth = MrgeWdth + cc.ColumnWidth
 Next
 If wysokosc > c.RowHeight Then Exit Sub
   Application.ScreenUpdating = False
   ma.MergeCells = False
   c.ColumnWidth = MrgeWdth
   c.EntireRow.AutoFit
   NewRwHt = c.RowHeight
   c.ColumnWidth = cWdth
   ma.MergeCells = True
   If NewRwHt > wysokosc Then
     ma.RowHeight = NewRwHt
   Else
     ma.RowHeight = wysokosc
   End If
  cWdth = 0: MrgeWdth = 0
  Application.ScreenUpdating = True
 End If
End With
End Sub

(c) Shon Oskar – www.VBATools.pl

Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
:, , , ,

12 Comments for this entry

  • Łukasz Kowal

    Bardzo fajna procedura!

    Zmieniłbym tylko warunek

    If NewRwHt > wysokosc Then
    ma.RowHeight = NewRwHt
    Else
    ma.RowHeight = wysokosc
    End If

    na

    If NewRwHt wysokosc Then
    ma.RowHeight = NewRwHt
    Else
    ma.RowHeight = wysokosc
    End If

    wtedy korekta wysokości wiersza działac będzie w obie strony.

  • Marcin

    Witam,
    nie jestem pewny czy robię wszystko dobrze. Nie znam się na tym. Pierwszy raz próbuję zastosować makro.

    wywołuję VBA przez ALT+ F11 klikam na ThisWorkbook przeklejam kod który podaliście powyżej. Zapisuję jako .xlsm. Nic się nie zmienia.

    Chciałbym żeby wysokość wiersza scalonych komórek dostosowywała się automatycznie do zawartości tekstu.

    czy coś pominąłem, albo powinienem zrobić inaczej ?

    • vbatools

      Procedura działa w zakresie wykonywania czynności. Czyli dopasowuje na bieżąco, a nie szuka gdzie dopasować w obszarze arkusza gdzie nie realizujemy żadnych zmian.

  • Koleś

    Cześć, bardzo podoba mi się idea takiego makra. Pytanie: jak można wykorzystać je do ogólnego użytku? Czy można je wkleić do pliku PERSONAL?

  • Piotr

    Dzięki za rozwiązanie. Po raz drugi odwołałem się do niego. Pozdrawiam.

  • arek

    W excel2007 Twoje rozwiązanie działa tylko gdy się kliknie 2x w komórki scalone (tak aby je wyedytować) wtedy wyświetla się cały text w komórkach i wtedy autodopasowanie działa.

    Używająć funkcji autodopasowanie wysokości wierszy kod nie działa.

    Nie znam się na VBA ale czy można coś takiego zrobić w automacie dla kilku scalonych i zawijanych komórek
    w kilku wierszach?

    • vbatools

      Ta procedura jest oparta na zdarzeniu, a wiec kiedy użytkownik edytuje arkusz tworząc w nim treść jest stosowane dopasowanie wszystkości. W takim przypadku działa poprawnie i tak została zaprojektowana. Nie jest to procedura naprawiania już istniejącego tekstu.

  • Krzysztof

    Witam,

    1.Czy makro można zmienić tak, aby odnosiło się do jednej konkretnej scalonej komórki?

    2. Czy można wpłynąć jakość na wysokość wierszy, np. 80% aktualnie ustawianych?

    • vbatools

      Krzysztof, kod jaki zaproponowałem możesz interpretować dowolnie. Prześledź jego polecenia aby wiedzieć, które zmienne możesz pomniejszyć o 20%, oraz jakim parametrem się kierować aby podać zakres na którym będzie działać kod.

  • Darek Kamiński

    Dzięki za przedstawienie formuły. Zastosowaliśmy ją do odpowiedniego sformatowania dokumentu i pojawił się problem, że w zależności od objętości tekstu w scalonych komórkach albo wysokość wychodziła idealnie na “0”, albo pojawiał się odstęp i wysokość obszar była większa niż zajmowanego tekstu.
    Nie wyglądało to “ładnie” na wydruku.

    Do formuły “MrgeWdth = MrgeWdth + cc.ColumnWidth” dodaliśmy +1 (” MrgeWdth = MrgeWdth + cc.ColumnWidth + 1″) i po testach widzimy, że chyba zaczęło działać, bo każdy obszar dopasowywany jest idealnie do wysokości tekstu bez dodawania wspomnianego wyżej odstępu.

Leave a Reply