Статьи из блога

Имя документа из текста закладки

Александр спрашивает:

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

Вся соль состоит в том, чтобы пользователь сохранял документ через стандартную команду «Сохранить», а не отдельной кнопкой, к которой прикручен макрос.

Предположим, что в тексте документа используется множество разных закладок, одна из которых носит имя "Закладка". Вот ее мы и возьмем в качестве имени файла (документа). Далее воспользуемся следующим макросом.

Если вы включите этот макрос в глобальный шаблон 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

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 21

  1. Игорь
    07.04.2009 в 18:01 | #1

    Вроде бы самая близкая тема из всего что нашел...

    Есть документ Word с произвольным количеством страниц, каждая страница содержит отдельную таблицу неизменного вида, которая повторяется от страницы к странице и отличается только содержимым.

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

    Буду очень благодарен за помощь.

  2. 07.04.2009 в 18:43 | #2

    В качестве примера: http://wordexpert.ru/page/kopirovanie-tablic-iz-odnogo-dokumenta-v-novyj

  3. 07.04.2009 в 19:18 | #3

    Если на странице только таблица, то пример Антона подойдет. А если есть еще текст на странице, то тут нужно хитрее, чтобы сохранить отдельную страницу, а не только таблицу.

  4. Игорь
    08.04.2009 в 21:32 | #4

    Спасибо, попробовал работу данного макроса. Александр прав, к моей ситуации он не до конца подходит, т.к. при сохранении очень сильно изменяется исходный вид страницы, исчезают некоторые элементы, плюс не решается вопрос с присвоением нужного имени файла. Для наглядности проблемы скинул на обменник пример исходного документа. http://narod.ru/disk/7512141000/%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80.rar.html

    В идеале - сохранение каждой страницы в исходном виде с присвоением в качестве имени "номера платежного поручения" (111, 112, 113, 114 и т.д.).

  5. 09.04.2009 в 11:23 | #5

    Игорь, попробуйте этот макрос. Сохраняет в папку с исходным файлом. Я очень надеюсь, что эти платежки были получены из программы, а не набраны вручную. Иначе, чем тогда объяснить выравнивание пробелами?

    'Сохранение каждой страницы в отдельный документ
    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

  6. Игорь
    09.04.2009 в 16:39 | #6

    Платежки формируются программным путем.

    Действие макроса оценить не смог, т.к. вылетела ошибка с указанием на строку Do While iPage <= oMainDoc.ComputeStatistics(2) 'wdStatisticPages

    За желание помочь - спасибо!

  7. 10.04.2009 в 08:25 | #7

    Игорь, если бы макрос не работал, я бы его не выкладывал. Макрос проверен и не только на вашем документе. Проверьте, что у вас стоит после iPage. Должен стоять знак < «меньше». При публикации кода некоторые символы заменяются на их коды: знак меньше на <, знак амперсанда заменяется на &

    Исправьте это и все будет работать. Или напишите мне, я вам вышлю этот макрос. Ссылка на моем имени

  8. Игорь
    10.04.2009 в 17:02 | #8

    Большое человеческое спасибо! На самом деле при переносе кода символы отобразились неправильно. Теперь макрос работает. Однако заметил, что его действие в 2007 и 2003 ворде отличается. Word 2007 немного меняет исходное форматирование, а также похоже создает файл в новом несовместимом со старыми версиями формате (хотя расширение ставит .doc). Добавил строчку FileFormat:=wdFormatRTF, вроде бы помогло.

    И еще: можно ли убрать вторую пустую страницу, которая создается в каждом новом файле?

  9. 10.04.2009 в 20:38 | #9

    …И еще: можно ли убрать вторую пустую страницу, которая создается в каждом новом файле?

    Конечно, можно, но она появляется потому, что у вас стоит разрыв раздела со следующей страницы. Если его убрать, то немного изменяется положение нижней надписи. Попробуйте, может подойдет.

    Нужно добавить в код сразу после строки вставки из буфера такую строку:

    oNewDoc.Range.Find.Execute FindText:="^m", MatchWildcards:=True, ReplaceWith:=""

  10. Игорь
    11.04.2009 в 08:19 | #10

    Измененный вид не совсем подходит, но сама идея с заменой выглядит правильной, по крайней мере вручную у меня получилось перенести на остальные страницы "непечатаемую" концовку последнего создаваемого документа (который изначально получается в правильном виде и без второй страницы).

    Осталось узнать каким образом эти непечатаемые символы вставить в макрос.

    Вы мне не поможете еще раз? Каким кодом в макросе можно обозначить эти символы и можно ли вообще? http://s42.radikal.ru/i098/0904/7c/81d1e2beff03.jpg

  11. 11.04.2009 в 08:32 | #11

    Это символы конца абзаца. — вот так он выглядит. Искать его можно по выражению ^p или ^0013. Но вы его не удалите с последней страницы, потому, что если стоит разрыв раздела со следующей страницы, то следующая страница будет всегда.

  12. 11.04.2009 в 08:47 | #12

    А почему не подходит? Границы страниц смещаются? тогда можно их сделать такими, как в исходном документе. После удаления разрыва страницы напишите:

    With oNewDoc.PageSetup
          .BottomMargin = oMainDoc.PageSetup.BottomMargin
          .TopMargin = oMainDoc.PageSetup.TopMargin
          .LeftMargin = oMainDoc.PageSetup.LeftMargin
          .RightMargin = oMainDoc.PageSetup.RightMargin
        End With

    Я отличий не нашел.

    На вашем рисунке точки это пробелы. Пробел можно найте кодом ^0032. Найти несколько пробелов: ^0032{1;}

  13. Игорь
    12.04.2009 в 09:35 | #13

    Теперь все работает так, как нужно. Огромное спасибо за неоценимую помощь! Побольше бы таких ресурсов как ваш.

  14. Игорь
    06.05.2009 в 21:34 | #14

    Снова прошу вашей помощи.

    Второй сервис пак позволяет сохранять файлы в формате pdf, но вот откорректировать макрос под это дело у меня не получилось.

    oNewDoc.SaveAs oMainDoc.Path & Application.PathSeparator & sFileName & ".pdf", FileFormat:=wdFormatPDF

    Добавление данной строки позволяет сохранить только первую страницу - дальше затык. Что нужно сделать не пойму.

    И еще: макрос позволяет сохранять только документы с количеством страниц меньше 100. Если больше - не работает. Данное ограничение как то можно обойти? Заранее спасибо!

  15. 07.05.2009 в 09:02 | #15

    Игорь, могу предложить вместо сохранения в pdf печатать в pdf с помощью виртуального принтера.

  16. Игорь
    07.05.2009 в 15:19 | #16

    Сторонние программы и плагины на работе запрещены, поэтому только встроенные возможности ворда. А по поводу проблемы с количеством страниц есть какие то предположения?

  17. Игорь
    22.06.2011 в 20:26 | #17

    Доброго времени суток!

    2 года пользуюсь данным макросом. Прикрутил сохранение в pdf, все просто супер... кроме ограничения по количеству страниц. Если страниц больше 100, то вылетает ошибка.

    Люди добрые, помогите еще разочек пожалуйста победить данное ограничение.

  18. Татьяна
    18.05.2012 в 14:47 | #18

    Помогите! Прислали анкету по работе, она как то странно открылась и я ее заполнила и сохранила. Отослав адресату она у него не открывается. Пишет что документ сохранен в Ворде с макросами. И еще она и у меня не открывается. Что делать.

  19. olik
    15.08.2014 в 09:04 | #19

    Здравствуйте!

    Очень понравился Ваш макрос на сохранение с закладкой. Но у себя никак прикрутить его не могу. При формировании из шаблона текст в закладку встает, но макрос не видит этот текст или при формировании текст встает, а сама закладка пропадает. Бьюсь два дня, начинаю отчаиваться уже. Может, какие идеи будут? Word2000.

  20. olik
    15.08.2014 в 09:07 | #20

    А или сохраняет в таком виде .doc

    то есть имя пустое

  21. olik
    15.08.2014 в 09:14 | #21

    Здравствуйте!

    Очень понравился Ваш макрос на сохранение док-а с именем из закладки. Вот только уже два дня бьюсь, а никак не получается. Или сама закладка пропадает, хотя текст остается или все есть, но макрос все равно не видит эту закладку.

    Word2000. Может, какие идеи будут? Очень хочется такую примочку к отчету.

    А! или сохраняет в таком виде .doc

    то есть имя пустое

Оставьте комментарий!

(обязательно)

^ Наверх