Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
29.03.2024, 08:10:45

Войти
Хотите поблагодарить участника за дельный совет? Нажмите [Повысить]. Так вы заслуженно поднимите репутацию активному участнику.
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  перенос объединенных ячеек
Страниц: 1 [2]  Все   Вниз
Печать
Автор Тема: перенос объединенных ячеек  (Прочитано 26848 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ewe007
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 8


Просмотр профиля E-mail
« Ответ #15 : 08.07.2011, 09:32:47 »

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

спасибо
но почему-то если документ в обычном виде все происходит раза в 3 быстрее, чем в режиме "просмотра страницы"
даже скорее можно сказать, что в режиме просмотра это занимает неприлично много времени, уже думал что повис)
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #16 : 08.07.2011, 10:26:45 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #17 : 12.07.2011, 07:56:08 »

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

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #18 : 12.07.2011, 07:58:16 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
YuriF
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #19 : 28.12.2020, 13:46:52 »

Что касаемо самой проблемы: не так проста, как кажется. С разгону не подъедешь.
Но вот такой вариант предложить могу:
Код:
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
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #20 : 25.01.2021, 09:59:56 »

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

spoiler for Hiden:
Код: (vb)

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
« Последнее редактирование: 25.01.2021, 10:04:58 от YuriF » Записан
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #21 : 25.01.2021, 10:52:39 »

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

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #22 : 25.01.2021, 13:41:43 »

В первый раз вижу работу с коллекцией HPageBreaks
может потому, что она не всегда правильно перестраивается после назначения новых разрывов? Улыбка
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #23 : 25.01.2021, 14:30:29 »

она не всегда правильно перестраивается после назначения новых разрывов
Не знаю, не пробовал.
Т.е. даже метод sh.ResetAllPageBreaks не уверенно помогает?
Записан

С уважением, Алексей
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #24 : 25.01.2021, 15:00:25 »

метод sh.ResetAllPageBreaks не уверенно помогает
он помогает. но ведь после него идет переопределение при помощи Location - вот тут могут начаться глюки. А могу и не начаться.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Alex_ST
Постоялец
***

Репутация: +13/-0
Офлайн Офлайн

Сообщений: 156


Просмотр профиля
« Ответ #25 : 25.01.2021, 15:03:46 »

А могу и не начаться.
Улыбка Спасибо. Учтём если вдруг придётся использовать (и склероз не помешает)
Записан

С уважением, Алексей
Страниц: 1 [2]  Все   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru