Автоподбор и minHeight в Excel Cell - PullRequest
0 голосов
/ 11 февраля 2019

Я создал небольшой макрос в Excel, который вставляет новый лист с определенными именами и вносит некоторые изменения (форматирование, цвета фона, ширину столбцов и т. Д.).Это также прекрасно работает.

Моя проблема в том, что я хочу дать определенным строкам свойство "Автозаполнение" и минимальную высоту.У последнего есть оптические причины.Autofit, потому что это может быть, что контент становится многострочным.

К сожалению, я не могу получить комбинацию двух.Либо у меня рост, либо автоподбор.

Вот мой существующий код:

    Sheets(sn).Range("B4:H50").WrapText = True
    Sheets(sn).Range("B4:H50").Rows.AutoFit
   'Sheets(sn).Range("B4:H50").RowHeight = 30

    Dim Rng As Range
    Sheets(sn).Range("A4:H50").Select
    For Each Rng In Selection.Cells
        Rng.RowHeight = Application.WorksheetFunction.Min(Rng.RowHeight, 50)
    Next Rng

Попытка с MinRowHeight, которую я нашел в Google.Он устанавливает правильную высоту, но затем автоподбор снова деактивируется.

Большое спасибо

1 Ответ

0 голосов
/ 11 февраля 2019

Во-первых, вам нужно учесть пару фактов:

  1. Если вы хотите «дать определенным строкам свойство« Автозаполнение »и минимальную высоту».Затем вы должны сначала использовать автоподгонку, а затем в цикле for each использовать функцию Max вместо Min.Например:
Sub sheetFormat()

    Dim sn As Integer, formatRng As Range, minHeight

    sn = ThisWorkbook.Sheets.Count 'To format the last worksheet in this workbook
    Set formatRng = ThisWorkbook.Sheets(sn).Range("B4:H50")
    minHeight = 30 'or 50

    formatRng.WrapText = True
    formatRng.Rows.AutoFit

    Dim Rng As Range
    For Each Rng In formatRng
        Rng.RowHeight = Application.WorksheetFunction.Max(Rng.RowHeight, minHeight)
    Next Rng

End Sub

Этот код будет выполнять то, что вы просили, но только если вы форматируете лист после заполнения ячеек содержимым.Этот код НЕ будет AutoFit высотой строки, если - после вызова этого SUB- вы заполняете ячейку в formatRng символами, которые не помещаются в minHeight высоту строки точки.Он будет форматировать только те ячейки, в которых уже есть содержимое, в соответствии с этим правилом: (Все ячейки в диапазоне formatRng имеют минимальную высоту строки minHeight, а ячейки, содержимое которых не помещается в эту minHeight, имеют большую строку-высота определяется AutoFit).

Когда вы указываете высоту строки в явном виде , например, с Range.RowHeight до 30, вы говорите excel не настраивать высоту для достижения наилучшего соответствия (т. Е. Вы отключаете функцию .AutoFit),и он не будет регулировать высоту больше автоматически.Нет просто способов сделать это.

Это означает, что вам нужно оставить высоту строки равной , неявно настроить (делается путем выбора AutoFit в качестве высоты строки) и, каким-то образомустановите значение не ниже minheight, если вы хотите решить проблему в 1. и избегайте явной настройки высоты строки.

Это можно сделать, установив размер шрифта ячейки в каждомстрока в нашем formatRng больше, поэтому высота в этих строках будет увеличиваться, чтобы достичь minheight, а затем, когда мы используем autofit в этих строках, получится «высота строки по умолчанию» - даже пустые ячейки -не ниже minheight.

Методом проб и ошибок я обнаружил, что шрифт Arial размером 40 пт делает высоту строки 50, вот код vba для этого:

Sub sheetFormat()

    Dim sn As Integer, formatRng As Range
    sn = ThisWorkbook.Sheets.Count 'To format the last worksheet in this workbook
    Set formatRng = ThisWorkbook.Sheets(sn).Range("B4:H50")

    Dim p As Integer, q As Integer, lastColStr As String
    p = formatRng.Row      'first row of the range
    q = formatRng.Rows.Count + p - 1   'last row of the range
    lastColStr = Mid(Cells(1, Columns.Count).Address, 2, 3)  'Last column Name (XFD on my machine)

'    Making Cells in the range "XFD4:XFD50" have 40pt Arial font
    With ThisWorkbook.Sheets(sn).Range(lastColStr & p & ":" & lastColStr & q)
        .Font.Name = "Arial"
        .Font.Size = 40
    End With

    formatRng.WrapText = True
    formatRng.VerticalAlignment = xlCenter  'I added this one just to see the whole contents of the cell
    formatRng.Rows.AutoFit

End Sub

Подробнее оэтот трюк:

https://excelribbon.tips.net/T005663_Changing_Default_Row_Height.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...