1

Тема: Сохранение текста в FB2 c помощью макроса

На компьютере скопилось много книг в различном виде: doc, docx, html, txt и т.п. smile  Моя читалка их в принципе воспроизводит, но в среднем: то оглавления нет, то еще чего. По этой причине захотелось создать макрос, который бы переводил текст в народный формат  FB2.  В файле все просто. Копируем текст, отмечаем начало частей глав стилем "заголовок 1", жмем кнопку, ждем. Надеюсь буду полезным

Post's attachments

FB2create.docm 71.51 Кб, 33 скачиваний с 2013-02-12 

You don't have the permssions to download the attachments of this post.

2

Re: Сохранение текста в FB2 c помощью макроса

Полезная штука даже просто TXT перегнать в FB2 - мой любимый формат для читалок.

В формате fb2 как с символами Unicode? Можно кодом заменить? Недавно, к макросу экспорта в HTML, прикручивал замену символов и конвертер UTF-8.

Кстати, ваш макрос изменяет Normal, тем что создает/удаляет в нем панель инструментов. Что вызывает его пересохранение.

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Сохранение текста в FB2 c помощью макроса

Вождь пишет:

Полезная штука даже просто TXT перегнать в FB2 - мой любимый формат для читалок.

В формате fb2 как с символами Unicode? Можно кодом заменить? Недавно, к макросу экспорта в HTML, прикручивал замену символов и конвертер UTF-8.

Кстати, ваш макрос изменяет Normal, тем что создает/удаляет в нем панель инструментов. Что вызывает его пересохранение.

На сколько я разобрался в вопросе FB2 - разновидность xml. Соответственно поддерживает кодировку UTF-8. Но т.к. VBA сохранит текстовый файл в windows-1251, то я, не мудрствуя лукаво, забил как заголовок файла
<?xml version="1.0" encoding="windows-1251"?>
Как реализовать сохранение в кодировке UTF-8 используя Open # For - хороший вопрос.
Про пересохранение Normal.dot не понял? Это критично? Я использовал старый способ добавления меню (правда до этого применя его в Excel)

4

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik пишет:

...Как реализовать сохранение в кодировке UTF-8...

Я сохраняю в доступном формате, а потом перекодирую через ADODB. Работает практически везде:

Private Function ChangeFileCharset( _
    ByVal FileName As String, _
    ByVal DestCharset As String, _
    Optional ByVal SourceCharset As String) As Boolean
' функция перекодировки (смены кодировки) текстового файла
' FileName - вход: путь к текстовому файлу
' DestCharset, SourceCharset - вход: имена конечной и исходной кодировок:
'   "koi8-r", "ascii", "utf-7", "utf-8", "Windows-1250", "Windows-1251", "Windows-1252"
' возврат: True, при успехе

    ChangeFileCharset = False
    On Error Resume Next
Dim myStream
Dim S As String
    Set myStream = CreateObject("ADODB.Stream")
    myStream.Type = 2
    If VBA.Len(SourceCharset) > 0 Then myStream.Charset = SourceCharset$ ' указываем исходную кодировку
    myStream.Open
    myStream.LoadFromFile FileName$ ' загружаем данные из файла
    S = myStream.ReadText ' считываем текст файла в переменную S
    myStream.Close
    myStream.Charset = DestCharset$ ' назначаем новую кодировку
    myStream.Open
    myStream.WriteText S
    myStream.SaveToFile FileName$, 2 ' сохраняем файл уже в новой кодировке
    myStream.Close
    If Err.Number = 0 Then ChangeFileCharset = True
     
End Function
By_lesavik пишет:

...пересохранение Normal.dot...Это критично?...

Просто сразу думаешь, что же макросу надо в Normal? Еще, если Normal большой, то появляется пауза при закрытии Word 2003.

Макросы под заказ и готовый пакет - mtdmacro.ru

5

Re: Сохранение текста в FB2 c помощью макроса

Хм. есть над чем задуматься и куда стремиться)) Спасибо

6

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik, очень интересная мысль - создать такой макрос.

Я решил протестировать ваше решение в Word 2010.
Вкладка ленты "Надстройки" у меня не образовалась. Соответственно, и кнопки, на которую нужно нажать, я не вижу.

Еще один вопрос: обрабатывает ли ваш макрос изображения (картинки)?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

7

Re: Сохранение текста в FB2 c помощью макроса

Писал марос в Word 2007. В Word 2010 не проверял. Если поддержка макросов в документе включена, то попробуйте нажать Alt+F8. Из списка доступных макросов выбрать ShowFormFB2Create. Нажать "Выполнить"

8

Re: Сохранение текста в FB2 c помощью макроса

C подачи Вождь переписал макрос. Добавилась возможность выбирать кодировку.
Картинки и таблицы макрос не обрабатывает. В FB2 картинки хранятся закодированными  по алгоритму Base64, так что просто так запихнуть туда картинку не получится.

9

Re: Сохранение текста в FB2 c помощью макроса

Вот файл

Post's attachments

FB2createSream.docm 80.66 Кб, 8 скачиваний с 2013-02-14 

You don't have the permssions to download the attachments of this post.

10

Re: Сохранение текста в FB2 c помощью макроса

Теперь (в последнем файле) - ошибка такая (см. вложение).
Макрос останавливается на строке:
   

Set objDoc = ThisDocument

В первом файле - то же самое.
Поля формы не оставил пустыми.

Post's attachments

error01.jpg
error01.jpg 20.39 Кб, 1 скачиваний с 2013-02-14 

You don't have the permssions to download the attachments of this post.
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

11

Re: Сохранение текста в FB2 c помощью макроса

Alex_Gur пишет:

Теперь (в последнем файле) - ошибка такая (см. вложение).
Макрос останавливается на строке:
   

Set objDoc = ThisDocument

В первом файле - то же самое.
Поля формы не оставил пустыми.

Может так будет лучше. Ссылка на документ присваивается объектной переменной при старте файла. Если нет - придется скачать 2010 офис и разбираться. sad

Post's attachments

FB2createSream.docm 72.62 Кб, 9 скачиваний с 2013-02-14 

You don't have the permssions to download the attachments of this post.

12

Re: Сохранение текста в FB2 c помощью макроса

Пришла в голову другая идея. Файл должен быть сохранен на диске. Т.е. его нужно скачать, а не открыть в ворде с сервера.

13

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik пишет:

Пришла в голову другая идея. Файл должен быть сохранен на диске. Т.е. его нужно скачать, а не открыть в ворде с сервера.

Файл скачан с сервера на диск, и я открываю его с диска.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

14

Re: Сохранение текста в FB2 c помощью макроса

Может быть нужно подключить какую-то библиотеку, которая у меня не подключена?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

15

Re: Сохранение текста в FB2 c помощью макроса

Ничего особенного не применял. Библиотеки в приложении. Может не идет под 2010 офисом... Придется установить smile

Post's attachments

refer.jpg
refer.jpg 93.35 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

16

Re: Сохранение текста в FB2 c помощью макроса

Теперь выдается ошибка 91 "Object variable or With block variable not set" на строке:

strFileName = objDoc.Path & "\" & strBname & ".fb2"

Попробовал дома на 2010 - все работает. Новая вкладка с кнопкой создалась.
А здесь, на работе, вкладка также не создается.
Очень интересно!

Библиотеки у меня установлены такие же. Значит дело не в них.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

17

Re: Сохранение текста в FB2 c помощью макроса

objDoc - объектная переменная, содержащая ссылку на документ. Так вот все предыдущие ошибки связаны с тем, что на вашем компьютере Vba не может передать этой переменной ссылку на документ. Странно. У меня работает и на работе и дома.

18

Re: Сохранение текста в FB2 c помощью макроса

Да, как то странно By_lesavik творит. Видимо, на одном колене, я то хоть на двух леплю smile Кодировка на форме выбирается, но в макросе жестко прописано utf-8. Тег section в fb только закрывающий. Поправил это, еще кое-что, прикрутил замену штм-разметки и юникод-знаков их эквивалентом. Прикрепляю.

Post's attachments

FB2createSream.dot 143 Кб, 10 скачиваний с 2013-02-18 

You don't have the permssions to download the attachments of this post.
Макросы под заказ и готовый пакет - mtdmacro.ru

19

Re: Сохранение текста в FB2 c помощью макроса

Вождь, я попробовал также применить ваше творение.
Вкладка Надстройки с кнопкой у меня образовалась и файл FB2 также сформировался.
Как вы считаете, почему ваш макрос сработал, а макрос коллеги By_lesavik на конкретной установке Word 2010 выдавал ошибку, что не сформирована объектная переменная? В чем была проблема?

Файл FB2 с помощью вашего макроса сформировался, но программа STDU его не открывает. Выдает ошибку:

Невозможно открыть файл:... Файл поврежден или имеет неподдерживаемый формат.

Сформированный файл FB2 прилагаю.

Post's attachments

aaa.fb2 48.64 Кб, 6 скачиваний с 2013-02-18 

You don't have the permssions to download the attachments of this post.
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

20

Re: Сохранение текста в FB2 c помощью макроса

Alex_Gur пишет:

...почему...выдавал ошибку...

Макросы я просто упростил, не разбираясь.

Alex_Gur пишет:

...FB2...не открывает...

В формате fb2 я но компренде, тупо поправил как htm. Тестово открыл в AlReader (и ваш aaa.fb2 тоже), проблем не было, вот я и надеялся... Будет время - почитаю доку по fb2, или автор поправит, может быть smile

Вот поправил под XML, что в fb2.

Post's attachments

FB2createSream.dot 187.5 Кб, 33 скачиваний с 2013-02-18 

You don't have the permssions to download the attachments of this post.
Макросы под заказ и готовый пакет - mtdmacro.ru

21

Re: Сохранение текста в FB2 c помощью макроса

Вождь пишет:

Да, как то странно By_lesavik творит. Видимо, на одном колене, я то хоть на двух леплю smile Кодировка на форме выбирается, но в макросе жестко прописано utf-8.

Вы правы. Моя ошибка. Недосмотрел. Леплю на коленке, т.к. не профессионал. Работа заставила выучить VBA, а тут еще и читалку купил.
За идею запихнуть все это в *dot отдельная благодарность.
До необходимости отлова и замены знаков юникода(особенно"<>") я  и сам дошел. Реализовал, но у вас получилось как-то изящнее))

Alex_Gur пишет:

Файл FB2 с помощью вашего макроса сформировался, но программа STDU его не открывает. Выдает ошибку:

Тегов Section больше чем надо. Этим тегом размечаются части, главы. За их корректную расстановку отвечает конструкция

If blFirstSection = True Then
                    blFirstSection = False
                    myStream.writetext OpenTag("section") & vbCr
                    myStream.writetext OpenCloseTag("title", PTag(rngRange.Text)) & vbCr
                Else
                    myStream.writetext CloseTag("section") & vbCr
                    myStream.writetext OpenTag("section") & vbCr
                    myStream.writetext OpenCloseTag("title", PTag(rngRange.Text)) & vbCr
                End If

Так что открывающий тег в начале убираем.
Может и топорно, но работает.

22

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik пишет:
Alex_Gur пишет:

Файл FB2 с помощью вашего макроса сформировался, но программа STDU его не открывает. Выдает ошибку:

Тегов Section больше чем надо. Этим тегом размечаются части, главы.

Верно. Оказалось, что в результирующем файле FB2 открывающих тегов <section> на один больше, чем закрывающих тегов </section>.
Я убрал первый тег <section> перед тегом <title>, и программа STDU успешно открыла файл FB2.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

23

Re: Сохранение текста в FB2 c помощью макроса

Хотел бы все же разобраться, почему шаблон Вождя открывает у меня вкладку Надстройки с кнопкой, а в файле By_lesavik эта вкладка не открывается.

В файле By_lesavik, в разделе Microsoft Word Objects.ThisDocument я нашел следующий макрос, который должен активизироваться при открытии документа:

Sub Document_Open()
    Set objDoc = Application.ActiveDocument
    CreateMenu
End Sub

И затем, в разделе Modules.Menu - следующую процедуру:

Sub CreateMenu()
    Dim cbrMenu As CommandBar
    Dim ctlCBar As CommandBarControl
    Dim strMenuName As String
    
    DelMenu
    strMenuName = "Создать FB2"
    
    Set cbrMenu = Application.CommandBars.Add(strMenuName)
    cbrMenu.Visible = True
    
    Set ctlCBar = cbrMenu.Controls.Add(Type:=msoControlButton, Temporary:=True)
        With ctlCBar
            .Caption = "Создание книги FB2"
            .OnAction = "ShowFormFB2Create"
            .Style = msoButtonIconAndCaption
            .FaceId = 463
        End With
End Sub

А в шаблоне Вождя мне не удалось найти макроса на открытие.
Вождь, не могли бы вы подсказать, как вы формируете макросом новую вкладку?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

24

Re: Сохранение текста в FB2 c помощью макроса

Alex_Gur пишет:

Хотел бы все же разобраться...мне не удалось найти макроса...

Макрос находится в скрытом модуле. Скрыт методом удаления, после создания панели wink

Вот и Section поправил, а то, если заголовков нет, то лишний закр. вылазил. Прикрепляю.

Post's attachments

FB2createSream.dot 194.5 Кб, 25 скачиваний с 2013-02-19 

You don't have the permssions to download the attachments of this post.
Макросы под заказ и готовый пакет - mtdmacro.ru

25

Re: Сохранение текста в FB2 c помощью макроса

Alex_Gur Вождь Спасибо большое за несколько дней столько фишек по макросам!
При таком подходе этот шаблон можно закинуть в папку с шаблонами Word и, когда нужно создать книгу fb2 через меню "создать" загрузить шаблон для книги. Как все просто оказывается smile
Опять же макрос не ломится изменять Normal.dot

26

Re: Сохранение текста в FB2 c помощью макроса

К выше исправленному решил кое-что добавить:
Если уж менять символы на коды, то и в заголовках в том числе. Ну и так по мелочи. После формирования книги, чтобы вылетело сообщение что макрос закончил работу.

27

Re: Сохранение текста в FB2 c помощью макроса

вот и файл.

Post's attachments

FB2createSream.dot 175 Кб, 42 скачиваний с 2013-02-19 

You don't have the permssions to download the attachments of this post.

28

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik пишет:

...макрос не ломится изменять Normal.dot

Можно было оставить создание/удаление панели, перенаправив ее в ваш шаблон - CustomizationContext, и сбрасывая Saved, чтобы не просился сохраниься. Я начал было так и делать, но решил, что одна кнопка не стоит того smile

Макросы под заказ и готовый пакет - mtdmacro.ru

29

Re: Сохранение текста в FB2 c помощью макроса

Уважаемые коллеги, теперь все у всех работает корректно!

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

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

30

Re: Сохранение текста в FB2 c помощью макроса

Панель инструментов с кнопкой просто создана и сохранена в шаблоне. По типу, как это делается руками в Word 2003.

Макросы под заказ и готовый пакет - mtdmacro.ru

31

Re: Сохранение текста в FB2 c помощью макроса

Вождь пишет:

Панель инструментов с кнопкой просто создана и сохранена в шаблоне. По типу, как это делается руками в Word 2003.

В том то и вопрос - как?
Вариант:

Sub Document_Open()
    Set objDoc = Application.ActiveDocument
    CreateMenu
End Sub

в некоторых случаях не срабатывает, а ваш - срабатывает везде.
Не могли бы вы написать код создания вкладки, если, конечно, это не секрет?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

32

Re: Сохранение текста в FB2 c помощью макроса

Спасибо, Вождь, уже разобрался.

By_lesavik, вы, наверно, и сами давно поняли, но я понял только сейчас.
Вместо:

Sub Document_Open()
    Set objDoc = Application.ActiveDocument
    CreateMenu
End Sub

луче было написать стандартную процедуру запуска при открытии файла:

Sub AutoOpen()
    Set objDoc = Application.ActiveDocument
    CreateMenu
End Sub

Sub Document_Open(), вероятно, в Word 2010 работает не везде.

Поэтому и появлялись ошибки, связанные с отсутствием объявления объектной переменной,- эта переменная объявлялась именно в той процедуре, которая не выполнялась.

Всем огромное спасибо за интересное обсуждение! smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

33

Re: Сохранение текста в FB2 c помощью макроса

До таких тонкостей не допер. Знаю, что в VBA встроен стандартный обработчик Document_Open. Туды и пихал код  формирование меню. Вкладку "надстройки" Ворд формирует автоматически. В случае с Ворд 2003 результатом моего кода была бы панель инструментов с одной кнопкой, которая бы тем либо иным образом заняло бы свое место  среди других панелей инструментов. С появлением ленты все пользовательские навороты скидываются на вот эту вот вкладку "надстройки". Создать вкладку можно, но это совсем другая история, требующая определенного набора знаний и опыта smile

34

Re: Сохранение текста в FB2 c помощью макроса

By_lesavik пишет:

До таких тонкостей не допер. Знаю, что в VBA встроен стандартный обработчик Document_Open. Туды и пихал код  формирование меню. Вкладку "надстройки" Ворд формирует автоматически. В случае с Ворд 2003 результатом моего кода была бы панель инструментов с одной кнопкой, которая бы тем либо иным образом заняло бы свое место  среди других панелей инструментов. С появлением ленты все пользовательские навороты скидываются на вот эту вот вкладку "надстройки". Создать вкладку можно, но это совсем другая история, требующая определенного набора знаний и опыта smile

Теперь в 2010 действительно активизируется вкладка Надстройки с вашей кнопкой. Общими усилиями нашли решение! smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

35

Re: Сохранение текста в FB2 c помощью макроса

Привет всем. Макрос для перевода doc в fb2 уже давно существует и называется ExportXML. Попробуйте его для сравнения.

Post's attachments

ExportXML.rar 49.72 Кб, 28 скачиваний с 2013-06-17 

You don't have the permssions to download the attachments of this post.

36

Re: Сохранение текста в FB2 c помощью макроса

Единственное он не хочет работать в MS Word 2013 x64