Разделить файл word на два и больше
не совсем понятна постановка задачи. Требуется создать два-три файла из вордовского документа - почему бы не сделать это руками?
руками начинал - здох.
дык берешь и макрос фигачишь в ворде...
опиши задачу четко, я тебе код на vba дам
Есть текст в ворде, предварительно подготовленный - с использованием стиля "заголовок-2" текст структурирован на разделы.
Требуется создать из каждого файла столько файлов, сколько этих заголовков с соотв. названиями - название исходного файла плюс заголовок из первичного файла, причем желательно сохранить все эти файлы в папку с названием исходного файла.
P.S. макросы писать я умею на уровне "изменить имеющееся", так что если мне дадут болванку, я уж с ней справлюсь.
up
выложи какой-нибудь пример
Пример:
Валовой региональный продукт
бла-бла-бла <----- (содержание раздела в новый файл)
Промышленность
бла-бла-бла
Агропромышленный комплекс
бла-бла-бла
Инвестиции
ну и так далее
Транспорт
...
Финансы
Уровень цен
Труд и занятость
Охрана окружающей среды
Число файлов по количеству регионов? )
Option Explicit
Const strHeadStype As String = "Заголовок 2"
Public Sub SplitDocByHStype
Dim wrdDoc As Document, strFileName As String, pr As Paragraph
Dim blnStartPr As Boolean, lngPrPos As Long, i As Long, j As Long
blnStartPr = False
For i = 1 To ThisDocument.Paragraphs.Count - 1
Set pr = ThisDocument.Paragraphs(i)
If pr.Style.NameLocal = strHeadStype Then
If blnStartPr Then
strFileName = Replace(ThisDocument.Paragraphs(lngPrPos).Range.Sentences(1 vbCr, "")
If Len(strFileName) > 0 Then
Set wrdDoc = Documents.Add(Visible:=False)
For j = lngPrPos To i - 1
ThisDocument.Paragraphs(j).Range.Copy
wrdDoc.Paragraphs(wrdDoc.Paragraphs.Count).Range.Paste
Next
wrdDoc.SaveAs ThisDocument.Path & "\" & strFileName
wrdDoc.Close
End If
lngPrPos = i
Else
blnStartPr = True
lngPrPos = i
End If
End If
Next
End Sub
создает файлы в той-же директории где лежит документ, есть две недоработки (лишний перевод строки в новых файлах + не обрабатывает последний "блок").
Рабочий пример -
удачи
P.S. доработать предлагаю самому, что не ясно спрашивай
реально помог.
пять я тебе уже ставил, так что поставьте за меня кто-нибудь!
Молоток
как заставить макрос в normal.dot работать? и на кнопку в панели или сочетание клавиш навесить? А то в шаблон копируется текст макроса, но на выполнение его никак не пустить
Теперь ищу, как в имя создаваемых файлов добавить имя папки, в которой хранится исходный файл
Public Function GetFolderName(strPath As String) As String
Dim i As Long
i = InStrRev(strPath, "\")
If i = 0 Then
GetFolderName = strPath
Else
GetFolderName = Right$(strPath, Len(strPath) - i)
End If
End Function
если захочешь помудрить, то вычленить имя папки из пути можно в одну строку (тоже самое, только запутанней выглядит)
IIf(InStrRev(Path, "\") = 0, Path, Right$(Path, Len(Path) - InStrRev(Path, "\"
P.S при перемещении кода в шаблон Normal, макрос SplitDocByHStype не будет работать должным образом, так как ThisDocument указывает на контекст кода, т.е. на шаблон Normal.dot, в этом конретном случае достаточно поменять ThisDocument на ActiveDocument, в общем случае лучше явно использовать нужный объект:
Dim wdDoc As Document
Set wdDoc = Documents.Open(FileName ,...)
With wdDoc
'...
End With
я никак не могу разобраться с GetFolderName, да и с Normal.dot тоже не все понятно.
Еще вопрос - если в тексте есть всякие разметки типа графиков, таблиц, разрывов страниц, то этот макрос падает. Можно вылечить?
Option Explicit
Const strHeadStype As String = "Заголовок 2"
Public Sub SplitDocByHStype
Dim wrdDoc As Document, strFileName As String, pr As Paragraph
Dim blnStartPr As Boolean, lngPrPos As Long, i As Long
blnStartPr = False
With ThisDocument
For i = 1 To .Paragraphs.Count - 1
Set pr = .Paragraphs(i)
If pr.Style.NameLocal = strHeadStype Then
If blnStartPr Then
strFileName = Replace(.Paragraphs(lngPrPos).Range.Sentences(1 vbCr, "")
If Len(strFileName) > 0 Then
Set wrdDoc = Documents.Add(Visible:=False)
.Range(.Paragraphs(lngPrPos).Range.Start, .Paragraphs(i - 1).Range.End).Copy
wrdDoc.Range.Paste
wrdDoc.SaveAs .Path & "\" & GetFolderName(.Path) & strFileName & ".doc"
wrdDoc.Close
End If
lngPrPos = i
Else
blnStartPr = True
lngPrPos = i
End If
End If
Next
End With
End Sub
Public Function GetFolderName(strPath As String) As String
Dim i As Long
i = InStrRev(strPath, "\")
If i = 0 Then
GetFolderName = strPath
Else
GetFolderName = Right$(strPath, Len(strPath) - i)
End If
End Function
P.S. работающий пример, там же
P.S2 если код помещать в normal.dot, то With ThisDocument нужно заменить на With ActiveDocument
то что надо! вот еще разберусь как переменную вставить в текст )
p.s. это что за агрегат такой в примере?
barebone
Public Sub SplitDocByHStype
Dim wrdDoc As Document, strFileName As String, pr As Paragraph
Dim blnStartPr As Boolean, lngPrPos As Long, i As Long
blnStartPr = False
With ActiveDocument
For i = 1 To .Paragraphs.Count - 1
Set pr = .Paragraphs(i)
If pr.Style.NameLocal = strHeadStype Then
If blnStartPr Then
strFileName = Replace(.Paragraphs(lngPrPos).Range.Sentences(1 vbCr, "")
If Len(strFileName) > 0 Then
Set wrdDoc = Documents.Add(Visible:=False)
.Range(.Paragraphs(lngPrPos).Range.Start, .Paragraphs(i - 1).Range.End).Copy
wrdDoc.Range.Paste
wrdDoc.Paragraphs(1).Range.Text = GetFolderName(.Path) + Chr$(13) + wrdDoc.Paragraphs(1).Range.Text
wrdDoc.SaveAs .Path & "\" & strFileName & " " & GetFolderName(.Path) & ".doc", FileFormat:= _
wdFormatHTML
wrdDoc.Close
End If
lngPrPos = i
Else
blnStartPr = True
lngPrPos = i
End If
End If
Next
End With
End Sub
Public Function GetFolderName(strPath As String) As String
Dim i As Long
i = InStrRev(strPath, "\")
If i = 0 Then
GetFolderName = strPath
Else
GetFolderName = Right$(strPath, Len(strPath) - i)
End If
End Function
я добавил сохранение в формате htm для удобства последующего слияния файлов и вставку в начало результирующих файлов названия папки
Вопрос - как заставить word2000 сохранять в формате архива mht? wdFormatwebarchive он не распознает, работает только в Word XP
респект `у!
Оставить комментарий
pechenkinsa
Есть задача - из одного файла Word создать несколько с задаваемыми названиями.В принципе решение уже есть готовое - web-страница , только автор требует что-то там перечислить ему на счет...
Кто-нибудь решал такие задачки?