Несколько лет назад мною было создано пару надстроек, которые, как оказалось, могут быть полезны при работе в excel. Одна из них называется "Надстройка для автоподбора высоты строк в Excel". Почитать описание и скачать ее можно тут. В связи с тем, что ко мне периодически обращаются с просьбами открыть исходный код этих надстроек и/или модифицировать их, а с экселем я уже давным давно не имею макрописательных отношений, счел необходимым выложить исходный код данных надстроек в том неизменном виде, в котором они доступны на сайтах для скачивания.
Несколько лет назад мною было создано пару надстроек, которые, как оказалось, могут быть полезны при работе в excel. Одна из них называется "Надстройка для автоподбора высоты строк в Excel". Почитать описание и скачать ее можно тут. В связи с тем, что ко мне периодически обращаются с просьбами открыть исходный код этих надстроек и/или модифицировать их, а с экселем я уже давным давно не имею макрописательных отношений, счел необходимым выложить исходный код данных надстроек в том неизменном виде, в котором они доступны на сайтах для скачивания.nerv
Я тоже сейчас редко-редко с Ёкселем в шарады-ребусы играю... Но на форум иногда заглядываю. Вот и сейчас заглянул. Увидал, что Nerv решился-таки открыть код своей надстройки. Самому её вскрывать мне было лень,да и не очень то и хотелось, а открытую почему бы не посмотреть? Глянул. Мало того, что без комментариев, поэтому разобрать сложно (да и лень опять же), но что-то сложновато, ИМХО. У меня давно валяется нечто подобное, но в Personal одним макросом без форм и Private Type Сравнивать как работают не стал - нет сейчас под рукой ничего, над чем можно было поиздеваться. Если есть подопытные и желание, сравните. Да и комментариев у меня в коде, как всегда, достаточно, чтобы самим разобрать.
[vba]
Код
Sub MergeCell_AutoHeight() ' автоподбор высоты объединенных ячеек в Selection If Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub Application.ScreenUpdating = False Dim rCell As Range, rMergeArea As Range, rColumn As Range, rRow As Range Dim maxRowHeight!, newCellWidth!, CellWidth!, RowHeight! For Each rRow In Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange).Rows ' цикл по всем строкам диапазона maxRowHeight = 0 For Each rCell In rRow.Cells ' цикл по всем ячейкам строки If rCell.MergeCells And rCell.Address = rCell.MergeArea.Cells(1).Address Then ' если это первая ячейкам объединенной области Set rMergeArea = rCell.MergeArea: newCellWidth = 0 With rMergeArea CellWidth = .Columns(1).ColumnWidth ' запомним ширину первого столбца в объединенной области .UnMerge ' разгруппировываем область For Each rColumn In .EntireColumn: newCellWidth = newCellWidth + rColumn.ColumnWidth: Next .Columns(1).ColumnWidth = newCellWidth ' делаем ширину первой ячейки такую же, как была у всей объединенной области .EntireRow.AutoFit ' автоподбор высоты первой ячейки объединенной области RowHeight = .Item(1).RowHeight ' запомнить подобранную высоту для этой объединенной области 'RowHeight = .EntireRow.RowHeight ' запомнить подобранную высоту для этой объединенной области If RowHeight > maxRowHeight Then maxRowHeight = RowHeight ' если подобранная высота для этой объединенной области максимальна в строке, то запомним её .Merge ' группируем область обратно .Columns(1).ColumnWidth = CellWidth ' восстановим ширину первого столбца End With End If Next rCell ' повторяем со следующей ячейкой строки If maxRowHeight > 0 Then rRow.EntireRow.RowHeight = maxRowHeight ' устанавливаем подобранную максимальную высоту строки Next rRow ' переходим к следующей строке Application.ScreenUpdating = True End Sub
[/vba]
Я тоже сейчас редко-редко с Ёкселем в шарады-ребусы играю... Но на форум иногда заглядываю. Вот и сейчас заглянул. Увидал, что Nerv решился-таки открыть код своей надстройки. Самому её вскрывать мне было лень,да и не очень то и хотелось, а открытую почему бы не посмотреть? Глянул. Мало того, что без комментариев, поэтому разобрать сложно (да и лень опять же), но что-то сложновато, ИМХО. У меня давно валяется нечто подобное, но в Personal одним макросом без форм и Private Type Сравнивать как работают не стал - нет сейчас под рукой ничего, над чем можно было поиздеваться. Если есть подопытные и желание, сравните. Да и комментариев у меня в коде, как всегда, достаточно, чтобы самим разобрать.
[vba]
Код
Sub MergeCell_AutoHeight() ' автоподбор высоты объединенных ячеек в Selection If Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub Application.ScreenUpdating = False Dim rCell As Range, rMergeArea As Range, rColumn As Range, rRow As Range Dim maxRowHeight!, newCellWidth!, CellWidth!, RowHeight! For Each rRow In Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange).Rows ' цикл по всем строкам диапазона maxRowHeight = 0 For Each rCell In rRow.Cells ' цикл по всем ячейкам строки If rCell.MergeCells And rCell.Address = rCell.MergeArea.Cells(1).Address Then ' если это первая ячейкам объединенной области Set rMergeArea = rCell.MergeArea: newCellWidth = 0 With rMergeArea CellWidth = .Columns(1).ColumnWidth ' запомним ширину первого столбца в объединенной области .UnMerge ' разгруппировываем область For Each rColumn In .EntireColumn: newCellWidth = newCellWidth + rColumn.ColumnWidth: Next .Columns(1).ColumnWidth = newCellWidth ' делаем ширину первой ячейки такую же, как была у всей объединенной области .EntireRow.AutoFit ' автоподбор высоты первой ячейки объединенной области RowHeight = .Item(1).RowHeight ' запомнить подобранную высоту для этой объединенной области 'RowHeight = .EntireRow.RowHeight ' запомнить подобранную высоту для этой объединенной области If RowHeight > maxRowHeight Then maxRowHeight = RowHeight ' если подобранная высота для этой объединенной области максимальна в строке, то запомним её .Merge ' группируем область обратно .Columns(1).ColumnWidth = CellWidth ' восстановим ширину первого столбца End With End If Next rCell ' повторяем со следующей ячейкой строки If maxRowHeight > 0 Then rRow.EntireRow.RowHeight = maxRowHeight ' устанавливаем подобранную максимальную высоту строки Next rRow ' переходим к следующей строке Application.ScreenUpdating = True End Sub