Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

перенос объединенных ячеек

Автор ewe007, 06.07.2011, 16:43:38

« назад - далее »

ewe007

Цитата: The_Prist от 07.07.2011, 22:25:45
P.S. Забыл сказать - перед запуском макроса необходимо отобразить разбиение на страницы. Это можно сделать и макросом первой строкой - ActiveSheet.DisplayPageBreaks = True

спасибо
но почему-то если документ в обычном виде все происходит раза в 3 быстрее, чем в режиме "просмотра страницы"
даже скорее можно сказать, что в режиме просмотра это занимает неприлично много времени, уже думал что повис)

Дмитрий Щербаков(The_Prist)

Тут дело такое, что хотя бы удостоверьтесь потом, что правильно все перенеслось. А думать, да - будет дольше в этом режиме.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Alex_ST

Дмитрий,
решение интересное и, бывает, действительно нужное.
Ведь в Excel'e в отличие от Word'a нет настройки таблицы "не разбивать ячейку при переносе на другую страницу" (за точность названия не ручаюсь, но как-то так по смыслу).
Только вот почему необходимо ограничиваться одним столбцом? Может все ячейки строки в UsedRange имеет смысл просматривать?
С уважением, Алексей

Дмитрий Щербаков(The_Prist)

Алексей - я не претендовал на полностью отработанное решение. Я лишь показал принцип. Если будет время - добью до "универсального" этот код.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

YuriF

Цитата: Дмитрий Щербаков(The_Prist) от 07.07.2011, 22:25:45
Что касаемо самой проблемы: не так проста, как кажется. С разгону не подъедешь.
Но вот такой вариант предложить могу:
Sub Make_Pages_Breack()
   Dim rUsRng As Range, li As Long, lCnt As Long
   Set rUsRng = Range("A1", Cells.SpecialCells(11))
   For li = 1 To rUsRng.Rows.Count
       If rUsRng.Rows(li).PageBreak <> xlNone Then
           If rUsRng.Cells(li, 1).MergeCells Then
           lCnt = li - Cells(li, 1).MergeArea.Row
               If lCnt > 0 Then Rows(li - lCnt).Resize(lCnt).Insert: lCnt = 0
           End If
       End If
   Next li
End Sub
Подгонит разрывы так, чтобы объединенные ячейки не "разрывались". Сразу оговорюсь - проверяет объединенные ячейки только в первом столбце.
Димитрий,
первым делом, спасибо за код.
А можно его оптимизировать? Отключение и включение нижепреведенных апликаций не сильно ускоряет процесс.

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False


YuriF

#20
У меня с таким кодом работает быстрее

[spoiler]
Private Sub()
Dim sh As Worksheet
Dim NextPageBreakNumber As Long
Dim PageBreakFirstLine  As Object
Dim LineNumber As Long
Set sh = ThisWorkbook.ActiveSheet
ActiveWindow.View = xlPageBreakPreview
sh.ResetAllPageBreaks
NextPageBreakNumber = 1
While NextPageBreakNumber <= sh.HPageBreaks.Count
   Set PageBreakFirstLine = sh.HPageBreaks(NextPageBreakNumber).Location
   LineNumber = PageBreakFirstLine.Row
   If sh.Cells(LineNumber, 1).MergeCells = True Then
       Set sh.HPageBreaks(NextPageBreakNumber).Location = sh.Cells(sh.Cells(LineNumber, 1).MergeArea.Row, 1)
   End If
   NextPageBreakNumber = NextPageBreakNumber + 1
Wend
End Sub
[/spoiler]

Alex_ST

Цитата: YuriF от 25.01.2021, 09:59:56с таким кодом
Грамотно (кроме Private Sub(), конечно ;) )!
В первый раз вижу работу с коллекцией HPageBreaks. Надо взять на заметку. Вдруг пригодится.
А по поводу кода, то для удобства пользователя хорошо бы сначала запоминать в дополнительной Integer-переменной текущий вид (их всего 2 возможно: xlNormalView := 1 и xlPageBreakPreview := 2), а после отработки макроса восстанавливать его.
С уважением, Алексей

Дмитрий Щербаков(The_Prist)

Цитата: Alex_ST от 25.01.2021, 10:52:39В первый раз вижу работу с коллекцией HPageBreaks
может потому, что она не всегда правильно перестраивается после назначения новых разрывов? :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Alex_ST

Цитата: Дмитрий Щербаков(The_Prist) от 25.01.2021, 13:41:43она не всегда правильно перестраивается после назначения новых разрывов
Не знаю, не пробовал.
Т.е. даже метод sh.ResetAllPageBreaks не уверенно помогает?
С уважением, Алексей

Дмитрий Щербаков(The_Prist)

Цитата: Alex_ST от 25.01.2021, 14:30:29метод sh.ResetAllPageBreaks не уверенно помогает
он помогает. но ведь после него идет переопределение при помощи Location - вот тут могут начаться глюки. А могу и не начаться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Alex_ST

Цитата: Дмитрий Щербаков(The_Prist) от 25.01.2021, 15:00:25А могу и не начаться.
:) Спасибо. Учтём если вдруг придётся использовать (и склероз не помешает)
С уважением, Алексей

Яндекс.Метрика Рейтинг@Mail.ru