Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Word - как разделить документ по листам? / 15 сообщений из 15, страница 1 из 1
04.06.2006, 20:09:58
    #33771216
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Имеются документы Word, объёмом до сотен страниц.
Они представляют собой перечень двусторонних бланков (полученных в результате слияния), и содержат поочередно: нечетные страницы - лицевая сторона, чётные - оборотная сторона каждого бланка.

Помогите, пожалуйста, составить макрос, который сможет автоматизировать работу по разделению таких больших документов на отдельные листы.

Т.е., например, из 100-страничного документа нужно получить 50 бланков, имеющих то же имя с добавкой выделенных №№ страниц.
(В идеале, в качестве добавки лучше бы использовать значения в одной из ячеек таблицы бланка - это тоже можно реализовать на VBA?)
...
Рейтинг: 0 / 0
04.06.2006, 20:56:39
    #33771243
LeonM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Selection.GoToNext wdGoToPage
...
Рейтинг: 0 / 0
04.06.2006, 22:03:16
    #33771274
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Поиском нашлась похожая тема - http://www.sql.ru/forum/actualthread.aspx?tid=144932 , но... :(

Разделение происходит для каждой страницы, а не для листа

Но самое главное - в новые документы переностся только текст, а всё форматирование и таблицы пропадают!

Помогите, пожалуйста, поправить код этого макроса
...
Рейтинг: 0 / 0
08.06.2006, 07:05:31
    #33779323
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
?...
...
Рейтинг: 0 / 0
31.07.2006, 15:58:14
    #33889575
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
вопрос всё ещё актуален....
...
Рейтинг: 0 / 0
31.07.2006, 18:35:03
    #33890148
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Попробуйте так (основано на том, что слияние типа "Письмо" вставляет разрыв раздела после каждой записи):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub Scatter_sections()
    Dim src As Document
    Dim dst As Document
    Dim i As Integer
    
    Set src = ActiveDocument
    For i =  1  To src.Sections.Count -  1 
        src.Sections(i).Range.Copy
        Set dst = Documents.Add
        dst.Range.Paste
        dst.Sections( 2 ).PageSetup.SectionStart = wdSectionContinuous
        dst.SaveAs src.Path & "\" & Left(src.Name, Len(src.Name) -  4 ) & _
            "_" & Format(i, "000")
        dst.Close
    Next
End Sub
...
Рейтинг: 0 / 0
20.09.2006, 23:13:05
    #34001550
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Спасибо, но к сожалению, предложенное решение разделяет существующий документ слияния по каждой странице, а не по парам (листам)

Поэтому автоматизация вопроса по-прежнему важна, пока же приходится делать всё ручками..;(

Вдобавок вопрос - каким образом в VBA WORD можно находить уже существующий на каждом листе номер (который является одним из полей слияния), чтобы использовать его в качестве фрагмента имени сохраняемого бланка?
...
Рейтинг: 0 / 0
26.09.2006, 19:36:34
    #34013857
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
RosaliaСпасибо, но к сожалению, предложенное решение разделяет существующий документ слияния по каждой странице, а не по парам (листам)

Хм... похоже, у Вас основной док-т состоит из нескольких разделов. Поправить можно так (если разделов два; если больше, соответственно):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 
Sub Scatter_sections()
    Dim src As Document
    Dim dst As Document
    Dim i As Integer
    
    Set src = ActiveDocument
    For i =  1  To src.Sections.Count -  1  Step  2 
        src.Range(src.Sections(i).Range.Start, src.Sections(i +  1 ).Range.End).Copy
        Set dst = Documents.Add
        dst.Range.Paste
        'След. строка подавляет пустую страницу в конце док-та. Номер д.б. на 1 больше, чем число разделов
        dst.Sections( 3 ).PageSetup.SectionStart = wdSectionContinuous
        dst.SaveAs src.Path & "\" & Left(src.Name, Len(src.Name) -  4 ) & _
            "_" & Format(i, "000")
        dst.Close
    Next
End Sub

Не проверяется, что нужное кол-во разделов существует, но, если работаем с результатом слияния, сойдет.

Rosalia
Вдобавок вопрос - каким образом в VBA WORD можно находить уже существующий на каждом листе номер (который является одним из полей слияния), чтобы использовать его в качестве фрагмента имени сохраняемого бланка?

Найти что-то в документе можно, предварительно пометив начало и конец нужного места скрытым текстом. Например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function find_my_marker() As String
    Dim r As Range
    Dim n0 As Integer
    Dim n1 As Integer
    
    Set r = ActiveDocument.Range
    r.Find.Execute FindText:="{{{"
    n0 = r.End
    r.Find.Execute FindText:="}}}"
    n1 = r.Start
    find_my_marker = ActiveDocument.Range(n0, n1).Text
End Function

Опять же на скорую руку, не проверяя результатов поиска.
...
Рейтинг: 0 / 0
30.09.2006, 18:09:12
    #34024140
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Спасибо, вот теперь документ действительно разделяется по листам! :)

Но..
К сожалению, остается проблема с появлением ненужной пустой страницы в конце разделенных листов.

Т.е. похоже, что фрагмент кода
Код: plaintext
1.
        'След. строка подавляет пустую страницу в конце док-та. Номер д.б. на 1 больше, чем число разделов
        dst.Sections( 3 ).PageSetup.SectionStart = wdSectionContinuous

не выполняется, и не происходит замены типа разрыва ;(


На всякий случай опишу структуру нашего шаблона слияния.

В конце первой страницы вставлен разрыв раздела (со следующей страницы)
::::::: Section Break (Next Page) ::::::::
При слиянии, на каждой второй странице документа такой же тип разрыва появляется автоматически, что и приводит к образованию пустой страницы у разделённых бланков.


Поиском нашлась статья БЗ MS "How to Programmatically Save Each Page or Section of Document As Separate File" , с примерами решения подобной задачи

Код: plaintext
1.
2.
3.
4.
5.
   
      ........      
      ' Removes the break that is copied at the end of the section, if any.
      Selection.MoveUp Unit:=wdLine, Count:= 1 , Extend:=wdExtend
      Selection.Delete Unit:=wdCharacter, Count:= 1 
      ........

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

(Вообще, похоже, что работа в VBA Word с разделами является нетривиальной задачей - "Deleting Word Document Sections" )


Как же изменить макрос до совершенства? :)
...
Рейтинг: 0 / 0
02.10.2006, 19:18:51
    #34027038
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Rosalia
Т.е. похоже, что фрагмент кода
Код: plaintext
1.
        'След. строка подавляет пустую страницу в конце док-та. Номер д.б. на 1 больше, чем число разделов
        dst.Sections( 3 ).PageSetup.SectionStart = wdSectionContinuous

не выполняется, и не происходит замены типа разрыва ;(

Эт врядли... ©. Скроее всего дело вот в чем: разрыв раздела (даже wdSectionContinuous) порождает лишнюю строку -- она и вылезает на след. страницу. Т.е., можно попробовать просто уменьшить нижнее поле (ну или как-нибудь ужать). Если уменьшать некуда, можно попробовать не копировать разрыв раздела вообще (вычесть 1 из конечной позиции копируемого диапазона; соответственно, совсем убрать "неработающую" строку) со всеми вытекающими: параметры страницы второго раздела не скопируются. Обойти это можно, например, задав при создании нового док-та шаблон (Template:=...) с нужными параметрами страницы. Его можно получить из исходного документа. Так что, нет в мире совершенства .
...
Рейтинг: 0 / 0
02.10.2006, 22:26:13
    #34027261
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Goldminer
Скроее всего дело вот в чем: разрыв раздела (даже wdSectionContinuous) порождает лишнюю строку -- она и вылезает на след. страницу.

Да нет, в конце второго листа достаточно места - после разрыва ещё шесть абзацев помещаются, не переходя на новою страницу...

Как я понимаю, строка
Код: plaintext
dst.Sections( 3 ).PageSetup.SectionStart = wdSectionContinuous
должна превращать в конце листа ::Section Break (Next Page):: в ::Section Break (Continuous)::

Однако этого почему-то не происходит, тип разрыва остается как и был - со следующей страницы

Есть еще одна идея - выделять всё с заранее помеченного места до конца документа и удалять это выделенное (с расчетом, что при этом будет удален и непослушный разрыв)

(По поводу совета о пометке текста отдельное спасибо), а как тогда реализовать выделение до самого конца документа?
...
Рейтинг: 0 / 0
03.10.2006, 13:39:28
    #34028602
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Rosalia
Однако этого почему-то не происходит, тип разрыва остается как и был - со следующей страницы

Бред какой-то. Может кинете файлик (не тот, где сотни страниц, конечно, а окончательный кусочек) на мыло (goldminer на рамблер ру). Версия офиса какая у Вас?
Rosalia
Есть еще одна идея - выделять всё с заранее помеченного места до конца документа и удалять это выделенное (с расчетом, что при этом будет удален и непослушный разрыв)

Удалить разрыв не проблема, а еще проще его вообще не копировать. Нужен он единственно затем, что к нему привязаны параметры Вашей второй страницы (Вы же сами кучу ссылок привели на эту тему). Можно и без него (дочитайте до конца мой пред. пост), но с ним гораздо изящнее получается. Я, кстати, этот прием и вручную использовал, когда надо было слепить из неск. док-тов один и быть уверенным, что страницы не поползут.
Rosalia
а как тогда реализовать выделение до самого конца документа?

Проще всего отвечать на такие вопросы сделав ручками и записав макрос. Другое дело, что на самом деле ничего выделять не нужно (если не предполагается взаимодействие с пользователем) -- нужно просто вычислять требуемые диапазоны.
...
Рейтинг: 0 / 0
04.10.2006, 16:46:40
    #34032504
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
2 Rosalia:

Да уж, чудеса. Есть некая странность в присланном файле, идентифицировать которую мне не удалось. Чуть позже изложу свое видение того, что происходит, Вам же посоветую поступить по "плану Б" (см. выше), а именно:
1. Берете присланный файл, удаляете содержимое, сохраняете как шаблон (напр. "sample.dot").
2. Меняете код так:
Код: plaintext
1.
2.
3.
4.
        src.Range(src.Sections(i).Range.Start, src.Sections(i +  1 ).Range.End -  1 ).Copy
        Set dst = Documents.Add(Template:="Sample.dot")
        dst.Range.Paste
        dst.SaveAs ..........
Т.е., по сути просто избавляетесь от лишнего раздела, как вы и хотели (заметили -1?). Что будет, если просто его удалить, без шаблона (т.е использовать Normal.dot)? Второй раздел получит параметры страницы, колонтитулы и т.п оттуда. Если все везде более или менее по умолчанию, разницы можно и не заметить. А если понадобилось выполнить на другом компе? Могут быть неожиданности. (Какие только normal.dot'ы мне не попадались -- нарочно не придумаешь.) Поэтому с шаблоном надежнее.
...
Рейтинг: 0 / 0
04.10.2006, 23:26:27
    #34033231
Rosalia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Спасибо, с шаблоном получается! :)

Однако интересно решение и без шаблона.

Просто таких форм в дальнейшем будет несколько, а работают с ними не очень опытные пользовательницы.
Хотелось бы поместь им макрос в Normal.dot и привязать к кнопочке, чтобы легко и просто можно было работать с любым возможным вариантом документа слияния.
...
Рейтинг: 0 / 0
05.10.2006, 12:08:09
    #34034098
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Word - как разделить документ по листам?
Rosalia
Однако интересно решение и без шаблона.
Просто таких форм в дальнейшем будет несколько, ....

Повторюсь: проблема именно в некой особенности Вашего док-та. Какой, а пока не знаю (может Вы?). Сам прием (в первоначальном варианте) опробован неоднократно и никаких шаблонов не требует. Попробуйте пересоздать осн. док-т слияния. Копировать можно все, кроме разрывов разделов.

2 All:

Test case: есть два док-та MSWord. Doc1 -- получен из образца, который прислала Rosalia, удалением всего содержимого (для чистоты эксперимента). Doc2 -- новый док-т, на основе умолчального Normal.dot (Office 2003 SP2). Вставим в любой из них разрыв раздела типа continuous (на текущей странице), выделим его и скопируем в другой док-т. Наблюдаем странный результат: вставлен разрыв "со след. страницы", причем его тип невозможно изменить (!) ни вручную, ни программно, причем никакой ругани, просто тип остается прежним. Между копиями "странного" док-та все копируется без проблем. Напрашивается вывод: (единственный) раздел "странного" док-та обладает неким свойством Х, которое Word считает несовместимым на одной странице с "нормальным" разделом. На первый (и на второй) взгляд ничего необычного в свойствах этого раздела нет.

Собственно вопрос: может кто знает (или обнаружит) что это за свойство? Вопрос теоретический, обходных путей я уже и сам напредлагал
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Word - как разделить документ по листам? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]