Как сделать в экселе ячейки одной высоты


Как сделать в экселе ячейки одной высоты
Как сделать в экселе ячейки одной высоты
Как сделать в экселе ячейки одной высоты


Member
Откуда: Москва
Сообщений: 318
Заполняю скриптом страницу Excel. При занесении в ячейку длинного текста автоматически изменяется высота ячейки, как в общем то и надо. А если мы объединяем несколько ячеек в строке и заносим туда данные - высота строки не изменяется. Можно ли с этим как - то побороться? With dst ' - Какой - то лист With .Range(.Cells(y, 2), .Cells(y, 5)) ' Объединяем ячейки .Merge .HorizontalAlignment = xlJustify .VerticalAlignment = xlTop .WrapText = True .ShrinkToFit = True End With (.Cells(y, 2) = "Какой - то длинный текст ............." ' Заносим текст End With
Member
Откуда:
Сообщений: 6451
убери shrinktofit
Картинка с другого сайта.
Member
Откуда: Москва
Сообщений: 318
big-duke убери shrinktofit
Увы не помогает

К сожалению найти прямое решение проблемы не удалось. Зато нашелся обходной путь: задаю фиктивному столбцу в той же строке ширину равную сумме объединенных ячеек, форматирую аналогично, заношу тот же текст и скрываю этот столбец.
Excel для этой ячейки выполняет автоматическое задание высоты так как эта ячейка не является объединенной и пользователь не видит фиктивный столбец в отчете.

В общем хоть решение и нашлось, но осадок остался - что мешало изначально сделать автоподбор высоты для ячеек объединенных в пределах одной строки?

Если кто знает более простое решение - пишите
Всем спасибо


Member
Откуда:
Сообщений: 104
Михаил К. big-duke убери shrinktofit
Увы не помогает

К сожалению найти прямое решение проблемы не удалось. Зато нашелся обходной путь: задаю фиктивному столбцу в той же строке ширину равную сумме объединенных ячеек, форматирую аналогично, заношу тот же текст и скрываю этот столбец.
Excel для этой ячейки выполняет автоматическое задание высоты так как эта ячейка не является объединенной и пользователь не видит фиктивный столбец в отчете.

В общем хоть решение и нашлось, но осадок остался - что мешало изначально сделать автоподбор высоты для ячеек объединенных в пределах одной строки?

Если кто знает более простое решение - пишите
Всем спасибо

Спасибо за Ваш совет - пригодилось.
Действительно интересно почему ms не сделал автоподбор ?


Member
Откуда: Москва
Сообщений: 85
Объединенные ячейки - гадость та еще!!!
  • Проблема с автоподбором высоты
  • Проблема с копированием диапазонов

Member
Откуда: г СУРГУТ
Сообщений: 54
Здраствуйте!
Может это поможет если вопрос еще актуальный

Вместо прямого объединения ячеек сделайте следующее: выделите нужное количество ячеек, т.е. в нашем варианте это ширина таблицы и в формате ячеек в выравнивании по горизонтали задайте "по центру выделения", оставьте уже стоящую галочку "переносить по словам" и в формате строки: "автоподбор высоты".
Вроде так все работает...

код для vba

Range("A6:E6").Select
With Selection
.HorizontalAlignment = xlCenterAcrossSelection ' по центру выделения
.VerticalAlignment = xlBottom
.WrapText = True 'переносить по словам
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
rows("6:6").EntireRow.AutoFit ' автоподбор высоты

Удачи!

LSM
Guest Нашел в инете макрос:
Private Sub ВысотаСтрок()
Dim CurrentRowHeight As Single, MergedCellRgWidth As Single
Dim CurrCell As Range
Dim ActiveCellWidth As Single, PossNewRowHeight As Single
If ActiveCell.MergeCells Then
With ActiveCell.MergeArea
If .WrapText = True Then
Application.ScreenUpdating = False
CurrentRowHeight = .RowHeight
ActiveCellWidth = ActiveCell.ColumnWidth
For Each CurrCell In Selection
MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
Next
.MergeCells = False
.Cells(1).ColumnWidth = MergedCellRgWidth
.EntireRow.AutoFit
PossNewRowHeight = .RowHeight
.Cells(1).ColumnWidth = ActiveCellWidth
.MergeCells = True
.RowHeight = IIf(CurrentRowHeight > PossNewRowHeight, CurrentRowHeight, PossNewRowHeight)
End If
End With
End If
End Sub
Работает для объединенных столбцов, для строк надо дописывать. Den380
Guest LSM Нашел в инете макрос:
...
Работает для объединенных столбцов, для строк надо дописывать.
Спасибо большое, как раз то, что было нужно. ;)
Member
Откуда: Левый берег
Сообщений: 2331
А мне вот это понравилось. Круто!
Юрик# Вместо прямого объединения ячеек сделайте следующее: выделите нужное количество ячеек, т.е. в нашем варианте это ширина таблицы и в формате ячеек в выравнивании по горизонтали задайте "по центру выделения", оставьте уже стоящую галочку "переносить по словам" и в формате строки: "автоподбор высоты".
Вроде так все работает...
MX -- ALEX
Guest k-nike А мне вот это понравилось. Круто!
Юрик# Вместо прямого объединения ячеек сделайте следующее: выделите нужное количество ячеек, т.е. в нашем варианте это ширина таблицы и в формате ячеек в выравнивании по горизонтали задайте "по центру выделения", оставьте уже стоящую галочку "переносить по словам" и в формате строки: "автоподбор высоты".
Вроде так все работает...
прижать влево еще бы неплохо - но как ?
Member
Откуда: Левый берег
Сообщений: 2331
MX -- ALEX прижать влево еще бы неплохо - но как ?
Походу, облом-с...((( Ольга и Александр
Guest Большое спасибо Михаилу К. за идею со вставкой столбца. Тоже была проблема со вставкой текста в объединенные ячейки. Благодаря идее Михаила удачно разрешилась. Спасибо!
Member
Откуда:
Сообщений: 29
Я эту проблему решил так: вычисляю количество строк в многострочной объединённой ячейке, потом присваиваю высоте ячейки её высоту умножить на число строк. И всё работает.
Member
Откуда: Левый берег
Сообщений: 2331
itsme8 Я эту проблему решил так: вычисляю количество строк в многострочной объединённой ячейке, потом присваиваю высоте ячейки её высоту умножить на число строк. И всё работает.
Вы, по-моему, недопоняли тему, поднятую тут.
Речь идет не о "многострочной" ОЯ, а о "многостолбцовой" ОЯ. В вашем же случае достаточно использовать автоматический подбор высоты строки.

Картинка с другого сайта.

Между сообщениями интервал более 1 года.

Member
Откуда:
Сообщений: 1
Я подобную проблему решил с помощью написания функции. Функция принимает строку, определяет количество символов (len) и в зависимости от числа возвращает требуемую высоту. Потом мы устанавливаем эту высоту там, где нужно.
Приводу пример кода:
Вызываю функцию: StrAdress = "A4" Height1 = MyHeight(oWbk.Sheets(i).Range(StrAdress).Value) oWbk.Sheets(i).Range(StrAdress).RowHeight = Height1

Сам код функции:

Function MyHeight(MyStr As String) As Single Dim m1 As Integer m1 = Len(MyStr) If m1 < 1 Then MyHeight = 20 Exit Function End If Select Case m1 Case Is < 250 MyHeight = 40 Case Is < 500 MyHeight = 75 Case Is < 1000 MyHeight = 150 Case Is < 2000 MyHeight = 300 Case Else MyHeight = 400 End Select End Function

Понятно, что значения высоты вы определяете сами )


Member
Откуда:
Сообщений: 2
LSM, добрый день!

через alt F11 вставляю данный макрос, далее проверяю - не работает. Прошу подсказать, что нужно сделать, чтобы проверить его работу в Excel для всего листа. В VBA не сильна это мягко сказано, но есть задача для сильных духом - выравнивать высоту объединенных ячеек в Excel шаблоне отчета, который выгружается из системы SAP.

Господа, помогите советом!
К сообщению приложен файл (Ох уж этот Excel.xlsm - 15Kb)


Member
Откуда:
Сообщений: 2
LSM Нашел в инете макрос:
Private Sub ВысотаСтрок()
Dim CurrentRowHeight As Single, MergedCellRgWidth As Single
Dim CurrCell As Range
Dim ActiveCellWidth As Single, PossNewRowHeight As Single
If ActiveCell.MergeCells Then
With ActiveCell.MergeArea
If .WrapText = True Then
Application.ScreenUpdating = False
CurrentRowHeight = .RowHeight
ActiveCellWidth = ActiveCell.ColumnWidth
For Each CurrCell In Selection
MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
Next
.MergeCells = False
.Cells(1).ColumnWidth = MergedCellRgWidth
.EntireRow.AutoFit
PossNewRowHeight = .RowHeight
.Cells(1).ColumnWidth = ActiveCellWidth
.MergeCells = True
.RowHeight = IIf(CurrentRowHeight > PossNewRowHeight, CurrentRowHeight, PossNewRowHeight)
End If
End With
End If
End Sub
Работает для объединенных столбцов, для строк надо дописывать.

LSM, добрый день!

повторю вопрос, но теперь уже с цитатой.
Через alt F11 вставляю данный макрос, далее проверяю - не работает. Прошу подсказать, что нужно сделать, чтобы проверить его работу в Excel для всего листа. В VBA не сильна это мягко сказано, но есть задача для сильных духом - выравнивать высоту объединенных ячеек в Excel шаблоне отчета, который выгружается из системы SAP.

Господа, помогите советом!
К сообщению приложен файл (Ох уж этот Excel.xlsm - 15Kb)


Member
Откуда:
Сообщений: 489
Народ, мне тоже надо. Неужели никто не писал.
Member
Откуда:
Сообщений: 3
LSM Нашел в инете макрос:
Private Sub ВысотаСтрок()
Dim CurrentRowHeight As Single, MergedCellRgWidth As Single
Dim CurrCell As Range
Dim ActiveCellWidth As Single, PossNewRowHeight As Single
If ActiveCell.MergeCells Then
With ActiveCell.MergeArea
If .WrapText = True Then
Application.ScreenUpdating = False
CurrentRowHeight = .RowHeight
ActiveCellWidth = ActiveCell.ColumnWidth
For Each CurrCell In Selection
MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
Next
.MergeCells = False
.Cells(1).ColumnWidth = MergedCellRgWidth
.EntireRow.AutoFit
PossNewRowHeight = .RowHeight
.Cells(1).ColumnWidth = ActiveCellWidth
.MergeCells = True
.RowHeight = IIf(CurrentRowHeight > PossNewRowHeight, CurrentRowHeight, PossNewRowHeight)
End If
End With
End If
End Sub
Работает для объединенных столбцов, для строк надо дописывать. Вот только ширина объединенной ячейки БОЛЬШЕ суммы ширин входящих в нее ячеек.
На каждую границу между колонками (на моем мониторе) надо добавлять 0.78 (найдено экспериментально).
(если быть точным, то это размер "поля вокруг пикселов", а ширина колонок изменяется, на самом деле, по пикселам, по целым пикселам. А размер этого "поля" зависит от размера и разрешения монитора :-( )
Строка с установлением ширины ячейки тогда будет такой: .Cells(1).ColumnWidth = MergedCellRgWidth + (0.78 (.Columns.Count - 1))
Думаю, что разброс этого "поля" по разным мониторам будет где-то 0.7-0.8.
А если это "поле" не учитывать, то высота ячейки может оказаться больше на одну строку, чем надо.
А если объединено очень много узких ячеек, то разница может быть и больше одной лишней строки...
Member
Откуда:
Сообщений: 3
um_mka Через alt F11 вставляю данный макрос, далее проверяю - не работает. Прошу подсказать, что нужно сделать, чтобы проверить его работу в Excel для всего листа. В VBA не сильна это мягко сказано, но есть задача для сильных духом - выравнивать высоту объединенных ячеек в Excel шаблоне отчета, который выгружается из системы SAP. Добрый день, um_mka!
Что значит "проверяю"? и что значит "не работает"?
У меня работает. Проверяю так:
- встаю на объединенную ячейку;
- вызываю (Alt+F8) и выполняю макрос ВысотаСтрок
Все работает.
Важно (как писал автор) чтобы объединенная ячейка была в одну строку.
(автоподбор высоты для ячейки из нескольких строк, задач более сложная и нетривиальная)

Если же речь идет о том, что не получается вызывать эту процедуру из другого макроса, то оно и понятно.
Нужно перед вызовом процедуры ВысотаСтрок делать активной нужную объединенную ячейку (.Select).
Либо (как правильно) немного переписать процедуру, добавив параметр, через который передавать ссылку на нужную объединенную ячейку, а в самой процедуре заменить ActiveCell на этот параметр.


Member
Откуда:
Сообщений: 3
kos20 Народ, мне тоже надо. Неужели никто не писал. Вот доделал универсальную функцию по подбору высоты указанной ячейки :
+ Function AutoFit_Height() Const c_Border_Width = 0.7 ' дополнительная ширина границы между ячейками (для автоопределения высоты объединенной ячейки) '------------------------------------------------------------------------------------------ ' Автоматическое определение высоты строки для указанной ячейки, ' в том числе - объединенной (по столбцам и/или по строкам). ' Достаточно высокие строки не изменяются. '------------------------------------------------------------------------------------------ Function AutoFit_Height(p_oCell) Dim h_row_original, h_row_set Dim arr_h_row() Dim w_col_original, w_col_total Dim i_oCol, cnt_rows, n_rows, h_row, flg_excl, k, i, j, s AutoFit_Height = -1 ' код неуспешного завершения If UCase(TypeName(p_oCell)) <> "RANGE" Then Exit Function ' неверный параметр AutoFit_Height = 1 ' код успешного завершения If Not p_oCell.MergeCells Then ' ячейка не часть объединенной ячейки h_row_original = p_oCell.RowHeight ' запомним первоначальную высоты строки p_oCell.EntireRow.AutoFit ' подберем высоту строки по содержанию ' но если строка стала меньше начальной, то восстановим исходную высоту ' (высота могла быть настроена по другим объединенным ячейкам в этой строке) If h_row_original > p_oCell.RowHeight Then p_oCell.RowHeight = h_row_original Exit Function End If ' ячейка не часть объединенной ячейки ' --- Дальше работа с объединенной ячейкой ---------------------------------------- With p_oCell.MergeArea ' Работа с объединенной ячейкой --------------------------- cnt_rows = .Rows.Count ' кол-во строк в объединенной ячейке ' Сохранение исходной высоты строки/строк объединенной ячейки ------------------ If cnt_rows = 1 Then ' ячейка в одну строку h_row_original = .Rows(1).RowHeight ' запомним первоначальную высоты строки Else ' ячейка в несколько строк h_row_original = 0 ' суммарная первоначальная высота строк ReDim arr_h_row(cnt_rows) ' установим размер массива высот строк For i = 1 To cnt_rows ' цикл по всем строкам объединенной ячейки arr_h_row(i) = .Rows(i).RowHeight ' первоначальная высота очередной строки h_row_original = h_row_original + arr_h_row(i) ' суммарная первоначальная высота строк Next ' цикл по всем строкам объединенной ячейки End If ' ячейка в одну строку ? ' Определение нужной высоты для содержимого объединенной ячейки ---------------- w_col_original = .Columns(1).ColumnWidth ' запомним ширину первой колонки If .Columns.Count = 1 Then ' объединено одна колонка w_col_total = w_col_original Else ' Если объединено несколько колонок ' Подсчитаем ширину объединенной ячейки w_col_total = c_Border_Width (.Columns.Count - 1) ' дополнение (на границы) к сумме ширин колонок For Each i_oCol In .Columns w_col_total = w_col_total + i_oCol.ColumnWidth Next End If ' Если объединено несколько колонок .MergeCells = False ' снимем объединение .Columns(1).ColumnWidth = w_col_total ' установим расчитанную ширину колонки .Rows(1).AutoFit ' автоподбор высоты строки h_row_set = .Rows(1).RowHeight ' запомним нужную высоту строки .Columns(1).ColumnWidth = w_col_original ' восстановим ширину первой колонки .MergeCells = True ' восстановим объединение ' Установка нужной высоты / восстановление прежней ----------------------------- If .Rows.Count = 1 Then ' ячейка в одну строку .RowHeight = IIf(h_row_original > h_row_set, h_row_original, h_row_set) Else ' ячейка в несколько строк .Rows(1).RowHeight = arr_h_row(1) ' восстановим высоту первой строки If h_row_original < h_row_set Then ' исходная суммарная высота меньше, чем расчетная ' надо менять высоту строк ----------- >>>> ' исключаем те строки, высота которых больше, чем нужно (в среднем) n_rows = cnt_rows ' кол-во строк, на которые надо распределить высоту Do 'цикл исключения достаточно высоких строк и перераспределения изменения на оставшиеся flg_excl = False ' признак того, что была исключена хоть одна строка h_row = h_row_set / n_rows ' расчетная высота каждой из оставшихся строк (средняя) For i = 1 To cnt_rows If arr_h_row(i) > h_row Then ' исходная высота больше, чем надо flg_excl = True ' признак того, что была исключена хоть одна строка h_row_set = h_row_set - arr_h_row(i) ' уменьшим распределяемую высоту n_rows = n_rows - 1 ' уменьшим кол-во изменяемых строк arr_h_row(i) = -1 ' больше эту строку не учитывать End If ' исходная высота больше, чем надо Next Loop While flg_excl 'цикл исключения достаточно высоких строк и перераспределения изменения на оставшиеся h_row = h_row_set / n_rows ' расчетная высота каждой из оставшихся строк (средняя) For i = 1 To cnt_rows ' цикл по всем строкам объединенной ячейки If arr_h_row(i) > 0 Then ' строка не исключена из обработки .Rows(i).RowHeight = h_row h_row_set = h_row_set - .Rows(i).RowHeight ' уменьшим остаток распределяемой высоты End If ' строка не исключена из обработки Next ' цикл по всем строкам объединенной ячейки If h_row_set > 0 Then ' если не вся требуемая высота расределена .Rows(1).RowHeight = .Rows(1).RowHeight + h_row_set ' добавим к первой строке End If ' если не вся требуемая высота расределена End If ' исходная суммарная высота меньше, чем расчетная ? End If ' ячейка в одну строку ? End With ' Работа с объединенной ячейкой End Function ' AutoFit_Height Толщину границы между колонок вынес в константу. (может у кого сильно другая)
Работает и с объединенной, и с обычной ячейкой.
Объединенная может быть из нескольких строк. Тогда строки делаются одинаковой нужной высоты, кроме тех, которые и так достаточно высокие.
Member
Откуда:
Сообщений: 1
Что-то не сообразить как применить вашу функцию.
Подскажите, плиз.
Member
Откуда: Питер, Литва
Сообщений: 45
has70,

Спасибо!
Функция встала в модуль, как влитая!

Виртуальные форумы   Темы из всех форумов за 3 дня   Мои избранные форумы Использование СУБД   Microsoft SQL Server   Firebird, InterBase   Oracle   Microsoft Access   IBM DB2, WebSphere, IMS, U2, etc   MySQL   PostgreSQL   OLAP и DWH   Sybase ASA, ASE, IQ   Informix   Другие СУБД   FoxPro, Visual FoxPro   Caché   SQLite   NoSQL, Big Data Дискуcсии   Сравнение СУБД   Проектирование БД   Работа   ERP и учетные системы   Разработка информационных систем   Тестирование и QA   Отчетные системы   Просто треп   Наши за рубежом   Сертификация и обучение   Hardware   Управление процессом разработки ИС   Юридические вопросы в ИТ Microsoft.NET   WinForms, .Net Framework   ASP.NET   ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM   WPF, Silverlight   WCF, Web Services, Remoting Программирование   Delphi   C++   Visual Basic   Программирование   Java   Разработка под мобильные платформы   PowerBuilder   Microsoft Office   SharePoint   XML, XSL, XPath, XQuery Web Технологии   PHP, Perl, Python   HTML, JavaScript, VBScript, CSS Администрирование ОС   Windows   Unix-системы   Другие: Mac OS, PalmOS, BeOS, PocketPC SQL.RU   Обсуждение нашего сайта   Вопрос-Ответ   Test
Источник: http://www.sql.ru/forum/155379/excel-avtomaticheskoe-izmenenie-vysoty-stroki-s-obedinennymi-yacheykami


Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Как сделать в экселе ячейки одной высоты

Похожие новости: