Статьи из блога
Статьи из блога
Имя документа из текста закладки
Рубрика: Вопрос-Ответ, Макросы
Метки: FileSave | закладки | макросы
Суббота, 30 августа 2008 г.
Просмотров: 2910
Подписаться на комментарии по RSS
Версия для печати
Метки: FileSave | закладки | макросы
Суббота, 30 августа 2008 г.
Просмотров: 2910
Подписаться на комментарии по RSS
Версия для печати
Александр спрашивает:
Как сделать так, чтобы при сохранении созданного документа в качестве имени файла предлагалось содержимое одной из закладок.
Вся соль состоит в том, чтобы пользователь сохранял документ через стандартную команду «Сохранить», а не отдельной кнопкой, к которой прикручен макрос.
Предположим, что в тексте документа используется множество разных закладок, одна из которых носит имя "Закладка". Вот ее мы и возьмем в качестве имени файла (документа). Далее воспользуемся следующим макросом.
Если вы включите этот макрос в глобальный шаблон Normal.dot, то при сохранении любого документа, основанного на этом шаблоне, будет всегда выводится окно с сообщением. Используйте этот макрос только для других шаблонов, с которыми вы работаете для создания специфических документов, и в имени которых должен быть текст одной из закладок.
Sub FileSave()
'Сохранение документа с именем одной из закладок
'Помощь Graham Mayor
Dim fName As String
On Error Resume Next
If Len(ActiveDocument.Path) = 0 Then
fName = ActiveDocument.Bookmarks("Закладка").Range
If Len(fName) = 0 Then
MsgBox "Документ не содержит закладки." & vbCr & _
"Документ не может быть сохранен."
Exit Sub
End If
ActiveDocument.SaveAs fName & ".doc"
Else
ActiveDocument.Save
End If
End Sub

Поиск
Рубрики
Подписка
Читают
Обсуждают
страницы
сайты
статистика
Комментариев: 17
Вроде бы самая близкая тема из всего что нашел...
Есть документ Word с произвольным количеством страниц, каждая страница содержит отдельную таблицу неизменного вида, которая повторяется от страницы к странице и отличается только содержимым.
Необходимо сохранить каждую страницу в виде отдельного документа Word, причем так, чтобы название для образуемых файлов бралось из определенного поля таблицы.
Буду очень благодарен за помощь.
В качестве примера: http://wordexpert.ru/page/kopirovanie-tablic-iz-odnogo-dokumenta-v-novyj
Если на странице только таблица, то пример Антона подойдет. А если есть еще текст на странице, то тут нужно хитрее, чтобы сохранить отдельную страницу, а не только таблицу.
Спасибо, попробовал работу данного макроса. Александр прав, к моей ситуации он не до конца подходит, т.к. при сохранении очень сильно изменяется исходный вид страницы, исчезают некоторые элементы, плюс не решается вопрос с присвоением нужного имени файла. Для наглядности проблемы скинул на обменник пример исходного документа. http://narod.ru/disk/7512141000/пример.rar.html
В идеале - сохранение каждой страницы в исходном виде с присвоением в качестве имени "номера платежного поручения" (111, 112, 113, 114 и т.д.).
Игорь, попробуйте этот макрос. Сохраняет в папку с исходным файлом. Я очень надеюсь, что эти платежки были получены из программы, а не набраны вручную. Иначе, чем тогда объяснить выравнивание пробелами?
'Сохранение каждой страницы в отдельный документ Sub SaveEachPageToFile() Dim oRng As Range, oMainDoc As Document, oNewDoc As Document, sFileName$, iPage% 'Отключаем обновление экрана Application.ScreenUpdating = False 'Запоминаем основной документ Set oMainDoc = ActiveDocument 'Диапазон основного документа Set oRng = oMainDoc.Range 'Пока счетчик страниц не превысил количество страниц в документе Do While iPage <= oMainDoc.ComputeStatistics(2) 'wdStatisticPages iPage = iPage + 1 'Изменяем рабочий диапазон до одной страницы If iPage < oMainDoc.ComputeStatistics(2) Then oRng.SetRange oRng.Start, oRng.GoToNext(1).Start 'wdGoToPage Else oRng.SetRange oRng.Start, oMainDoc.Range.End End If 'Копируем страницы oRng.Copy 'Добавляем новый документ Set oNewDoc = Documents.Add 'Вставляем в него содержимое буфера с сохранением форматирования oNewDoc.Range.PasteAndFormat 16 'wdFormatOriginalFormatting 'Имя файла берем из ячейки пятой строки второго столбца sFileName = Trim(Left(oRng.Tables(1).Cell(5, 2).Range.Text, Len(oRng.Tables(1).Cell(5, 2).Range.Text) - 2)) sFileName = Trim(Left(oRng.Tables(1).Cell(5, 1).Range.Text, Len(oRng.Tables(1).Cell(5, 1).Range.Text) - 2)) & sFileName 'Сохраняем новый документ в папку с исходным oNewDoc.SaveAs oMainDoc.Path & Application.PathSeparator & sFileName & ".doc" 'Закрываем новый документ oNewDoc.Close True 'Переходим к следующей странице Set oRng = oRng.GoToNext(1) 'wdGoToPage Loop 'Включаем обновление экрана Application.ScreenUpdating = True End SubПлатежки формируются программным путем.
Действие макроса оценить не смог, т.к. вылетела ошибка с указанием на строку Do While iPage <= oMainDoc.ComputeStatistics(2) 'wdStatisticPages
За желание помочь - спасибо!
Игорь, если бы макрос не работал, я бы его не выкладывал. Макрос проверен и не только на вашем документе. Проверьте, что у вас стоит после iPage. Должен стоять знак < «меньше». При публикации кода некоторые символы заменяются на их коды: знак меньше на <, знак амперсанда заменяется на &
Исправьте это и все будет работать. Или напишите мне, я вам вышлю этот макрос. Ссылка на моем имени
Большое человеческое спасибо! На самом деле при переносе кода символы отобразились неправильно. Теперь макрос работает. Однако заметил, что его действие в 2007 и 2003 ворде отличается. Word 2007 немного меняет исходное форматирование, а также похоже создает файл в новом несовместимом со старыми версиями формате (хотя расширение ставит .doc). Добавил строчку FileFormat:=wdFormatRTF, вроде бы помогло.
И еще: можно ли убрать вторую пустую страницу, которая создается в каждом новом файле?
Конечно, можно, но она появляется потому, что у вас стоит разрыв раздела со следующей страницы. Если его убрать, то немного изменяется положение нижней надписи. Попробуйте, может подойдет.
Нужно добавить в код сразу после строки вставки из буфера такую строку:
Измененный вид не совсем подходит, но сама идея с заменой выглядит правильной, по крайней мере вручную у меня получилось перенести на остальные страницы "непечатаемую" концовку последнего создаваемого документа (который изначально получается в правильном виде и без второй страницы).
Осталось узнать каким образом эти непечатаемые символы вставить в макрос.
Вы мне не поможете еще раз? Каким кодом в макросе можно обозначить эти символы и можно ли вообще? http://s42.radikal.ru/i098/0904/7c/81d1e2beff03.jpg
Это символы конца абзаца. ¶ — вот так он выглядит. Искать его можно по выражению ^p или ^0013. Но вы его не удалите с последней страницы, потому, что если стоит разрыв раздела со следующей страницы, то следующая страница будет всегда.
А почему не подходит? Границы страниц смещаются? тогда можно их сделать такими, как в исходном документе. После удаления разрыва страницы напишите:
With oNewDoc.PageSetup .BottomMargin = oMainDoc.PageSetup.BottomMargin .TopMargin = oMainDoc.PageSetup.TopMargin .LeftMargin = oMainDoc.PageSetup.LeftMargin .RightMargin = oMainDoc.PageSetup.RightMargin End WithЯ отличий не нашел.
На вашем рисунке точки это пробелы. Пробел можно найте кодом ^0032. Найти несколько пробелов: ^0032{1;}
Теперь все работает так, как нужно. Огромное спасибо за неоценимую помощь! Побольше бы таких ресурсов как ваш.
Снова прошу вашей помощи.
Второй сервис пак позволяет сохранять файлы в формате pdf, но вот откорректировать макрос под это дело у меня не получилось.
oNewDoc.SaveAs oMainDoc.Path & Application.PathSeparator & sFileName & ".pdf", FileFormat:=wdFormatPDF
Добавление данной строки позволяет сохранить только первую страницу - дальше затык. Что нужно сделать не пойму.
И еще: макрос позволяет сохранять только документы с количеством страниц меньше 100. Если больше - не работает. Данное ограничение как то можно обойти? Заранее спасибо!
Игорь, могу предложить вместо сохранения в pdf печатать в pdf с помощью виртуального принтера.
Сторонние программы и плагины на работе запрещены, поэтому только встроенные возможности ворда. А по поводу проблемы с количеством страниц есть какие то предположения?
Доброго времени суток!
2 года пользуюсь данным макросом. Прикрутил сохранение в pdf, все просто супер... кроме ограничения по количеству страниц. Если страниц больше 100, то вылетает ошибка.
Люди добрые, помогите еще разочек пожалуйста победить данное ограничение.