Можно ли как нибудь быстрым способом (может через макросы) выделить текст в диапазоне страниц и скопировать в отдельный файл word? Нужно для разбивки одного документа (более 700 стр.) на два документа.
Здравствуйте!
Можно ли как нибудь быстрым способом (может через макросы) выделить текст в диапазоне страниц и скопировать в отдельный файл word? Нужно для разбивки одного документа (более 700 стр.) на два документа.misharin
Я не большой VBA-специалист по Word, но у нас же есть Большой Всемирный Разум, а задача показалась полезной. Точнее, та ее часть, где надо выделить несколько подряд идущих страниц. Когда их выделили, дальше уже что-то сделать с ними - дело следующее и имхо не такое заковыристое, как задача выделения страниц.
Стал гуглить. Первая ссылка - http://programmersforum.ru/showthread.php?t=64307 Запустить приведенный там код мне не удалось. Я не запускал буквально тот код, а сделал свой - так сказать, "по мотивам". Вот он:
[vba]
Код
Sub not_working() Dim oStartPage As Range Dim oEndPage As Range 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 14) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select End Sub
[/vba]
Почему не работает - пока не понимаю. Т.е. отрабатывает без ошибок, но нужного не делает. Если кто-то увидит причину - с интересом послушаю.
Вот такой будет мой вклад в эту задачу в виде этого небольшого дайджеста
Я не большой VBA-специалист по Word, но у нас же есть Большой Всемирный Разум, а задача показалась полезной. Точнее, та ее часть, где надо выделить несколько подряд идущих страниц. Когда их выделили, дальше уже что-то сделать с ними - дело следующее и имхо не такое заковыристое, как задача выделения страниц.
Стал гуглить. Первая ссылка - http://programmersforum.ru/showthread.php?t=64307 Запустить приведенный там код мне не удалось. Я не запускал буквально тот код, а сделал свой - так сказать, "по мотивам". Вот он:
[vba]
Код
Sub not_working() Dim oStartPage As Range Dim oEndPage As Range 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 14) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select End Sub
[/vba]
Почему не работает - пока не понимаю. Т.е. отрабатывает без ошибок, но нужного не делает. Если кто-то увидит причину - с интересом послушаю.
Sub working() Dim oStartPage As Range Dim oEndPage As Range 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 2) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select Selection.Copy Selection.EndKey Unit:=wdStory Selection.Paste End Sub
[/vba]
PS И так тоже работает
[vba]
Код
Sub working_add() Dim oStartPage As Range Dim oEndPage As Range Dim addD As Document 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 2) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select Selection.Copy Set addD = Documents.Add Selection.Paste End Sub
Sub working() Dim oStartPage As Range Dim oEndPage As Range 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 2) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select Selection.Copy Selection.EndKey Unit:=wdStory Selection.Paste End Sub
[/vba]
PS И так тоже работает
[vba]
Код
Sub working_add() Dim oStartPage As Range Dim oEndPage As Range Dim addD As Document 'Начало первой страницы для выделения Set oStartPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 2) 'со страницы 4 'Конец последней страницы для выделения Set oEndPage = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, 4) 'по страницу 14 'Выделяем указанный диапазон документа ActiveDocument.Range(oStartPage.Start, oEndPage.End).Select Selection.Copy Set addD = Documents.Add Selection.Paste End Sub
Каково же было мое удивление, когда я попытался на работе запустить первый ("не работающий") макрос на следующий день - макрос работал как надо!!
Не веря в барабашку и в таракана, заползшего между контактами, я попытался воспроизвести ситуацию с самого начала. Для этого я скопировал файл в другую папку и стал открывать. Поскольку местоположение на диске стало новым, а файл был когда-то мне прислан по почте, то посыпались жёлтые сообщения системы безопасности:
Первое. Желтая полоса "ЗАЩИЩЕННЫЙ ПРОСМОТР Будьте осторожны: файлы из Интернета могут содержать вирусы. Если вам не нужно изменять этот документ, лучше работать с ним в режиме защищенного просмотра." и кнопка "Разрешить редактирование". Нажал кнопку.
Второе. Желтая полоса "ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен." и кнопка "Включить содержимое". Нажал кнопку.
Запустил свой макрос not_working. Выделилась только 4-я страница, что плохо и неправильно.
Закрыл файл без сохранения и открыл снова. На этот раз жёлтых полос предупреждений не было.
Запустил макрос not_working. Выделились, как надо, страницы с 4-й по 13-ю (именно 13-ю, а не 14-ю, так как курсор конца выделения находится в начале страницы 14 и чтобы выделить страницы с 4-ю по 14-ю, то для конечного диапазона надо ставить значение 15, т.е. на единицу больше номера последней страницы выделения - это уже мой небольшой ляп).
Внёс в файл небольшое изменение, сохранил его, закрыл и скопировал в еще одну новую созданную папку.
Открыл файл в этой новой папке. И всё повторилось с начала - и жёлтые предупреждения, и выделение только 4-й страницы при запусках макроса во время первого открытия файла. После закрытия и открытия всё опять поехало нормально.
Вот такие дела. И думается мне, что такое поведение это следствие корпоративных "рогаток" безопасности и всяких там групповых политик. Возможно, вне корпоративной сети ситуация более благоприятная и макросы всегда отрабатывают правильно, а не "только на следующий день".
Плюс к этому у нас на работе есть такое навязанное "счастье" как Folder Redirection (кто не знает - погуглите), которое может влиять на ситуацию не самым предсказуемым образом. Например, раньше никогда бы не подумал, что при отключении от сети нельзя будет ни открыть файл Excel или Word, ни сохранить уже редактируемый. Это интуитивно понятно в случае удаленного рабочего стола, который становится недоступным, но почему при этом и локальные файлы попадают под эту гребенку - за гранью моего понимания…
Всё. Устал исследовать. Узелок на память завязал, проблему приподнял - и хорошо!
Каково же было мое удивление, когда я попытался на работе запустить первый ("не работающий") макрос на следующий день - макрос работал как надо!!
Не веря в барабашку и в таракана, заползшего между контактами, я попытался воспроизвести ситуацию с самого начала. Для этого я скопировал файл в другую папку и стал открывать. Поскольку местоположение на диске стало новым, а файл был когда-то мне прислан по почте, то посыпались жёлтые сообщения системы безопасности:
Первое. Желтая полоса "ЗАЩИЩЕННЫЙ ПРОСМОТР Будьте осторожны: файлы из Интернета могут содержать вирусы. Если вам не нужно изменять этот документ, лучше работать с ним в режиме защищенного просмотра." и кнопка "Разрешить редактирование". Нажал кнопку.
Второе. Желтая полоса "ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен." и кнопка "Включить содержимое". Нажал кнопку.
Запустил свой макрос not_working. Выделилась только 4-я страница, что плохо и неправильно.
Закрыл файл без сохранения и открыл снова. На этот раз жёлтых полос предупреждений не было.
Запустил макрос not_working. Выделились, как надо, страницы с 4-й по 13-ю (именно 13-ю, а не 14-ю, так как курсор конца выделения находится в начале страницы 14 и чтобы выделить страницы с 4-ю по 14-ю, то для конечного диапазона надо ставить значение 15, т.е. на единицу больше номера последней страницы выделения - это уже мой небольшой ляп).
Внёс в файл небольшое изменение, сохранил его, закрыл и скопировал в еще одну новую созданную папку.
Открыл файл в этой новой папке. И всё повторилось с начала - и жёлтые предупреждения, и выделение только 4-й страницы при запусках макроса во время первого открытия файла. После закрытия и открытия всё опять поехало нормально.
Вот такие дела. И думается мне, что такое поведение это следствие корпоративных "рогаток" безопасности и всяких там групповых политик. Возможно, вне корпоративной сети ситуация более благоприятная и макросы всегда отрабатывают правильно, а не "только на следующий день".
Плюс к этому у нас на работе есть такое навязанное "счастье" как Folder Redirection (кто не знает - погуглите), которое может влиять на ситуацию не самым предсказуемым образом. Например, раньше никогда бы не подумал, что при отключении от сети нельзя будет ни открыть файл Excel или Word, ни сохранить уже редактируемый. Это интуитивно понятно в случае удаленного рабочего стола, который становится недоступным, но почему при этом и локальные файлы попадают под эту гребенку - за гранью моего понимания…
Всё. Устал исследовать. Узелок на память завязал, проблему приподнял - и хорошо! Gustav