powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Из Ворда в Эксель
49 сообщений из 49, показаны все 2 страниц
Из Ворда в Эксель
    #36565131
Привет всем! Совсем не знаю как быть... Есть в Ворде файл Export.doc - он меняется каждый месяц и в нем около 100000 записей, в общем больше чем может вместиться на листе экселя. Помогите, пожалуйста, написать макрос, который будет загонять из ворда данные на лист эксель, а когда лист1 закончится, то продлжит копировать эти данные на лист2. Пожалуйста!!!
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565350
Фотография Serge 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новенькая123, скиньте данные в Акцесс.
Или установите Эксель 2007 - 2010.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565379
Serge 007, спасибо что откликнулись! Там данные идут так что Дата на строчку выше остальных данных и мне приходится вначале макросом проставлять Дату на соответствующую строку вниз, а затем делать обработки, если я открою в акцессе, то получится что строка 1 содержит Дату, а строка 2 - остальные данные, затем 3 путсые и опять - Дата - Данные, это все копируется из левого приложения, а обрабатывать надо в экселе - там много операций и автофильтр и перевод из текста в число и ВПР используется и все надо сделать одной кнопкой - сделала все, но строк получается очень много и самое страшное почему нельзя использовать акцесс - дата на разных строчках, причем экспортируется в вворд интересно - в начале страницы - дата прямо в предыдущей строчке, дальше по листу - через строчку...
2007 офис не куплен...
Как быть... :-(
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565403
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новенькая123, можете файл строк на надцать показать?
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565418
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть сохранить из Ворда в текст (если можно), далее в тексте скриптом навести порядок - строк станет в 2 раза меньше, затем скриптом же можно грузить в Эксель, ну или уже импортом, как положено.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565421
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нев 2, а в 4-5 раз меньше...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565479
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. можно так текст преобразовать (если данные позволяют) -
читаем построчно,
если в начале строки дата - пишем в другой файл без перевода строки,
если пусто - пропускаем,
если есть данные и в начале не дата - пишем с переводом строки.
Можно ещё разделители между датой и данными поставить.
Наверное также можно и из Ворда читать, но я не знаю синтаксис.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565521
Фотография Serge 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новенькая1232007 офис не куплен...
Как быть... :-(
Зачем покупать?
http://the-universe.ru/soft/74-ofis-2007-skachat-word-2007-besplatno-rus-excel.html
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565695
Hugo121Т.е. можно так текст преобразовать (если данные позволяют) -
читаем построчно,
если в начале строки дата - пишем в другой файл без перевода строки,
если пусто - пропускаем,
если есть данные и в начале не дата - пишем с переводом строки.
Можно ещё разделители между датой и данными поставить.
Наверное также можно и из Ворда читать, но я не знаю синтаксис.

8-) я тоже не знаю как это делать... как макросом читать построчно...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565729
Вот к примеру текстовый файл :
15.03.10
1010 ввпывп 2120

16.03.10

5262 ыываф 5458



17.03.18
4456 ваывп 5827

и так 100000 записей... как их преобразовать (это очень упрощенный вариант)
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565807
На второй строке после Даты 3 столбца, т.е. весь текст должен быть разбит на 3 столбца
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36565983
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новенькая123,
даты все в таком виде, нет случайно 1.04.10?
Если всё именно так, то должно получиться.
Вообще думаю можно сделать так:
1. запускаем *.vbs
2. диалог выбора вордовского файла.
3. скрипт сохраняет этот файл как word.txt
4. преобразует word.txt в excel.txt
5. открывает заранее приготовленный файл Экселя, который при открытии подгружает данные из excel.txt

Если данных всё же будет набираться больше 65656 строк, можно грузить данные непосредственно в Эксель, считая строки, но это будет дольше.
Можно этот скрипт и в Экселе разместить, и даже поставить его на выполнение при открытии файла.
Но я всё жду - может кто подскажет, как именно из Ворда данные выбирать построчно, какой синтаксис...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566098
Hugo121Новенькая123,
даты все в таком виде, нет случайно 1.04.10?
Если всё именно так, то должно получиться.
Вообще думаю можно сделать так:
1. запускаем *.vbs
2. диалог выбора вордовского файла.
3. скрипт сохраняет этот файл как word.txt
4. преобразует word.txt в excel.txt
5. открывает заранее приготовленный файл Экселя, который при открытии подгружает данные из excel.txt

Если данных всё же будет набираться больше 65656 строк, можно грузить данные непосредственно в Эксель, считая строки, но это будет дольше.
Можно этот скрипт и в Экселе разместить, и даже поставить его на выполнение при открытии файла.
Но я всё жду - может кто подскажет, как именно из Ворда данные выбирать построчно, какой синтаксис...

Спасибо что не бросаете! Но я не поняла [1. запускаем *.vbs] - я так поняла что Сервис/Макрос/Редактор Visual Basiс, а дальше как - [2. диалог выбора вордовского файла.
] - что это? я пробовала там открыть вордовский файл - ошибку выдает... что-то совсем не понимаю... :-(((
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566165
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новенькая123, нет, это я про скрипт wsh говорю.
Вот для начала - выбираете в запросе свой сохранённый уже txt, на выходе преобразованный C:\temp\_excel.txt
Сперва попробуйте на маленьком файле, чтобы оценить скорость работы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
'# Диалог открытия файла
   Const ForReading   =  1 
   Const ForAppending   =  8 
   
Set objDialog = CreateObject("UserAccounts.CommonDialog") 
objDialog.Filter = "txt Files|*.txt" 
objDialog.InitialDir = "C:\" 
intResult = objDialog.ShowOpen 
 If intResult =  0  Then 
    Wscript.Quit 
Else 
    toFile =  objDialog.FileName 
End If 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(toFile, ForReading) 

Set objFile = objFSO.CreateTextFile("C:\temp\_excel.txt")
Set objfile = Nothing
Set objOTS = objFSO.OpenTextFile("C:\temp\_excel.txt", ForAppending)

   Do While objTS.AtEndOfStream <> True
      tmp = objTS.ReadLine()
   if len(tmp) >  7  then
		if isdate(left(tmp,  8 )) then
		objOTS.Write tmp & " "
		else
		  objOTS.WriteLine tmp
		end if
	end if
   Loop

'# очищаем память 
objTS.Close 'закрываем текстовый файл
objOTS.Close 'закрываем текстовый файл

Set objFSO = Nothing
Set objDialog = Nothing
Set objTS = Nothing
Set objOTS = Nothing

tmp = Empty
Wscript.Quit
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566211
Спасибо что не бросаете!!!
Но у меня в результате работы просто образовался пустой файл _excel.txt с размером 0
Все запускается в окне диалога выбираю export.txt и в результате появляется пустой _excel.txt ...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566222
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новенькая123,
я делал под Ваш пример, на нём работает.
Там проверяется длина строки, если больше 7, то если первых 8 символов дата, то пишется без перевода строки (с добавлением после строки пробела), иначе с переводом.
Результат:
из
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 15 . 03 . 10 
 1010  ввпывп  2120 

 16 . 03 . 10 

 5262  ыываф  5458 



 17 . 03 . 18 
 4456  ваывп  5827 
получаем
Код: plaintext
1.
2.
 15 . 03 . 10   1010  ввпывп  2120 
 16 . 03 . 10   5262  ыываф  5458 
 17 . 03 . 18   4456  ваывп  5827 
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566234
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вдруг бывают строки короче 8 символов, можно эту цифру и уменьшить до 1, т.е. поменять на
Код: plaintext
if len(tmp) >=  1  then
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566285
Hugo121Если вдруг бывают строки короче 8 символов, можно эту цифру и уменьшить до 1, т.е. поменять на
Код: plaintext
if len(tmp) >=  1  then


Только пожалуйста не бросайте меня!!! Ситуация - если я использую файл который Вы прислали в архиве, то он работает, но я не могу его редактировать, если я в тело модуля макроса вставляю скрипт который Вы прислали в форуме, то он выдает ошибку Run-time error '424' Object required и выделяет Wscript.Quit
ХОТЯ ДАННЫЕ ПРАВИЛЬНО СРАБАТЫВАЮТ!!!!
Спасибо огромное!!!
В общем я так понимаю на эту ошибку не стоит обрщать внимание!!! СПАСИБО ВАМ ОГРОМНОЕ!!!
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566311
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новенькая123,
в макрос прямо 1:1 не пойдёт, там чуть подправить надо :) - вместо
Wscript.Quit
надо
Exit Sub
Ну и ещё переменные бы определить, ну это сильно желательно (в wsh им всё равно тип не задаётся, поэтому я не напрягался...)
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566368
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пропустил - как это не можете редактировать? А блокнот?
Я кстати в блокноте и писал, в Notepad++
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566403
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё - если
Код: plaintext
objOTS.Write tmp & " "
заменить на
Код: plaintext
objOTS.Write tmp & vbTAB
и файл сохранить даже тупо как C:\temp\_excel.txt.xls, то его можно открывать сразу в Экселе - дата будет в первом столбце, остальное во втором, его разбить стандартным способом. Или в скрипт встроить замену всех пробелов на vbTAB...
Хотя файл так и останется текстовым по содержанию...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566450
Hugo121Ещё - если
Код: plaintext
objOTS.Write tmp & " "
заменить на
Код: plaintext
objOTS.Write tmp & vbTAB
и файл сохранить даже тупо как C:\temp\_excel.txt.xls, то его можно открывать сразу в Экселе - дата будет в первом столбце, остальное во втором, его разбить стандартным способом. Или в скрипт встроить замену всех пробелов на vbTAB...
Хотя файл так и останется текстовым по содержанию...

СПАСИБО!!!
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36566872
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новенькая123Вот к примеру текстовый файл :
15.03.10
1010 ввпывп 2120

16.03.10

5262 ыываф 5458



17.03.18
4456 ваывп 5827

и так 100000 записей... как их преобразовать (это очень упрощенный вариант)
Скопировал эти записи в Word... Вот что получилось (если в реальном файле перевод строки иной, работать не будет):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Sub FromWordToExcel()
Dim oWD As Object, oDoc As Object
Dim strT As String, i As Long, j As Byte, strA() As String, strB() As String
Dim WS As Worksheet, k As Byte, l As Long

Set oWD = CreateObject("Word.Application")
Set oDoc = oWD.Documents.Open _
    ("C:\...Путь...\Export.doc")
strT = oDoc.Content
Do While InStr(strT, Chr( 11 ) & Chr( 11 )) >  0 
    strT = Replace(strT, Chr( 11 ) & Chr( 11 ), Chr( 11 ))
Loop
oWD.Quit
Set oWD = Nothing: Set oDoc = Nothing
strA = Split(strT, Chr( 11 ))
Application.ScreenUpdating = False
For k =  1  To (UBound(strA) +  1 ) \ Application.Rows.Count +  1 
    l =  1 
    With ThisWorkbook.Worksheets(k)
        For i =  0  To UBound(strA)
            strB = Split(Replace(strA(i), vbCr, ""))
            For j =  0  To UBound(strB)
                .Cells(l, j +  1 ) = strB(j)
            Next j
            l = l +  1 
        Next i
    End With
Next k
Application.ScreenUpdating = True
End Sub
Насколько быстро это будет работать реально, на большом кол-ве строк, сказать затрудняюсь
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567063
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth, что-то у меня всё в кучку собрал:
15.03.101010 ввпывп 212016.03.105262 ыываф 545817.03.184456 ваывп 5827
А как в Ворде построчно пройтись, не подскажете?
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567133
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, проблема может быть в знаке перевода строки: при копировании записей с форума, я получил chr(11). Если вводит их вручную, через Enter, то само-собой, нужно chr(11) заменить на chr(13) (или vbcr).
Обратите внимание: я не использую возможности Ворд, а, получив содержимое файла в строковую переменную, закрываю его.
Навыков работы с Вордом у меня у самого нет
: я потратил сегодня довольно много времени, чтобы понять, как получить содержимое файла.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567149
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
да, почти получилось с Chr(13), по крайней мере в массив построчно поместилось, далее уже можно обрабатывать.
Только мне кажется, если строк много и они длинные, а не как в примере, то ворочать эту кучу будет небыстро. Я и тексты бывало сперва сразу целиком в массив загонял и затем анализировал, но когда знал, что объём не очень большой. В данном случае в коде выше текст построчно перекладываю в другой файл, выбирая только нужное. Хотя может разница и небольшая, тесты не делал...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567153
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил, что не всё "идеально". Исправленный фрагмент:
Код: plaintext
1.
2.
3.
4.
5.
6.
oWD.Quit
Set oWD = Nothing: Set oDoc = Nothing ' "рокировка" с последующим циклом

Do While InStr(strT, Chr( 11 ) & Chr( 11 )) >  0 
    strT = Replace(strT, Chr( 11 ) & Chr( 11 ), Chr( 11 ))
Loop
strA = Split(strT, Chr( 11 )): strT = "" 'очищение ненужной более переменной
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567161
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, я на ru-board писал кому-то обработку текстового файла. Предполагая большое кол-во строк, организовал возможность его обработки частями по 3000 строк. Скорость выполнения в этом случае сокращалась примерно на 20%. Вот здесь.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36567188
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
Хотел заставить wsh скриптом сделать весь цикл от Ворд до Эксель - не получается ни в Ворде по строчкам пройтись, ни его в текст сохранить.
Но если вручную сохранить данные в текст, то вполне перекладывает в текст.xls (все пробелы заменены на vbTAB, поэтому сразу разбивает по колонкам):


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
'# Диалог открытия файла
   Const ForReading   =  1 
   Const ForAppending   =  8 

   stb = timer
  
Set objDialog = CreateObject("UserAccounts.CommonDialog") 
objDialog.Filter = "txt Files|*.txt" 
objDialog.InitialDir = "C:\" 
intResult = objDialog.ShowOpen 
 If intResult =  0  Then 
    Wscript.Quit 
Else 
    toFile =  objDialog.FileName 
End If 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(toFile, ForReading) 

Set objFile = objFSO.CreateTextFile("C:\temp\_excel.xls")
Set objfile = Nothing
Set objOTS = objFSO.OpenTextFile("C:\temp\_excel.xls", ForAppending)

   Do While objTS.AtEndOfStream <> True
      tmp = objTS.ReadLine()
   if len(tmp) >  7  then
		if isdate(left(tmp,  8 )) then
		objOTS.Write tmp & vbTAB '" "
		else
		  objOTS.WriteLine Replace(tmp, " ", vbTAB)
		end if
	end if
   Loop

'# очищаем память 
objTS.Close 'закрываем текстовый файл источник
objOTS.Close 'закрываем целевой текстовый файл

Set objFSO = Nothing
Set objDialog = Nothing
Set objTS = Nothing
Set objOTS = Nothing

tmp = Empty

stb = CInt((Timer - stb) *  100 ) /  100 
MsgBox ("Время работы " & stb & " сек."), vbInformation

Wscript.Quit
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36568495
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, доработал процедурку: теперь она должна работать при любом знаке окончания строки. Для пробы растиражировал записи Новенькой123 на 10923 страницы в Ворде.
Пришлось ещё подправить переключение переноса данных на другие листы книги Excel.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Sub FromWordToExcel()
Dim oWD As Object, oDoc As Object
Dim strT As String, i As Long, j As Integer, strA() As String, strB() As String
Dim WS As Worksheet, k As Byte, l As Long

Set oWD = CreateObject("Word.Application")
Set oDoc = oWD.Documents.Open _
    ("C:\... Путь ...\Export.doc")

Application.DisplayAlerts = False
strT = oDoc.Content
Application.DisplayAlerts = True

oWD.Quit
Set oWD = Nothing: Set oDoc = Nothing

strT = Replace(strT, Chr( 10 ), Chr( 13 ))
strT = Replace(strT, Chr( 11 ), Chr( 13 ))
Do While InStr(strT, Chr( 13 ) & Chr( 13 )) >  0 
    strT = Replace(strT, Chr( 13 ) & Chr( 13 ), Chr( 13 ))
Loop

strA = Split(strT, Chr( 13 )): strT = ""

Application.ScreenUpdating = False
For k =  1  To (UBound(strA) +  1 ) \ Application.Rows.Count +  1 
    l =  1 
    With ThisWorkbook.Worksheets(k)
        For i = i + l -  1  To UBound(strA)
            strB = Split(strA(i))
            For j =  0  To UBound(strB)
                .Cells(l, j +  1 ) = strB(j)
            Next j
            l = l +  1 
            If l = .Rows.Count +  1  Then
                i = i +  1 
                Exit For
            End If
        Next i
    End With
Next k
Application.ScreenUpdating = True
End Sub
Здесь можно еще "навесить" функцию проверки необходимости создания нового листа. Ну и последующего его создания, конечно
.

Что получилось по скорости выполнения (P IV-1700, 768 MB ОЗУ, XP SP3, 2003 SP3):
со 10923 страниц Ворда создана строка длиной в 5308444 знака. Из них после очистки осталось 4980761.
На присвоение значения строковой переменной (strT = oDoc.Content) ушла почти половина времени - 189 сек, общее время выполнения процедуры составило 400 сек (было заполнено 6 листов Excel по 65536 строк + ещё 2 записи на 7-м листе).
Вечером, если получится, буду сравнивать это со скоростью работы Вашего скрипта.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36568522
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
давай, интересно.
Только в моём скрипте собственно нет операции занесения данных в лист Экселя, т.е. ещё можно сравнить время открытия Вашего итогового файла и моего псевдо-экселевского файла. Т.е. я думаю, Эксель мой файл будет дольше открывать. Или просто добавить в скрипт в конце процедуру открытия этого файла и мерить общее время. Только я там таймер по ошибке в самое начало поставил, т.е. мерится и время реакции оператора тоже
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36570438
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121...Только я там таймер по ошибке в самое начало поставил, т.е. мерится и время реакции оператора тоже
Хм... это единственное, на что я обратил внимане ( - проверять скорость работы скрипта, учитывая отсутствие импорта данных в Excel, получается, смысла нет.
Но сравнить скорость выполнения задачи, применяя другой подход, всё-таки хотелось. Поэтому написал процедуру с использованием fso:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Sub FromWordToExcel2()
Dim oWD As New Word.Application, oDoc As Word.Document 'раннее связывание
Dim fso As New Scripting.FileSystemObject, oFile As Scripting.File 'раннее связывание
Dim strT As String, oTS1 As Scripting.TextStream, oTS2 As Scripting.TextStream 'раннее связывание

'Dim oWD As Object, oDoc As Object
'Dim fso As Object, oFile As Object
'Dim strT As String, oTS1 As Object, oTS2 As Object
'Const wdFormatText As Long = 2, ForWriting As Byte = 2

Dim lngLnsCount As Long, bytWSCount As Byte, strFIlesPath As String
Dim oTmpWB As Workbook, stb

'Set oWD = CreateObject("Word.Application")
'Set fso = CreateObject("Scripting.FileSystemObject")

bytWSCount =  1 
Set oDoc = oWD.Documents.Open _
    ("C:\... Путь ...\Export.doc"\Export2.doc")
oDoc.SaveAs oDoc.Path & "\Export2.txt", wdFormatText
Set oFile = fso.GetFile(oDoc.FullName)
oWD.Quit: Set oDoc = Nothing: Set oWD = Nothing
Set oTS1 = fso.OpenTextFile(oFile)
strFIlesPath = Left(oFile.Path, InStrRev(oFile.Path, "\"))
Set oTS2 = fso.CreateTextFile(strFIlesPath & "Tmp.txt", ForWriting, True)
Application.EnableEvents = False
Application.ScreenUpdating = False
Do Until oTS1.AtEndOfStream
    strT = oTS1.ReadLine
    If Len(strT) > 0 Then
        lngLnsCount = lngLnsCount + 1
        oTS2.WriteLine strT
    End If
    If lngLnsCount = Application.Rows.Count Or oTS1.AtEndOfStream Then
        oTS2.Close
        Workbooks.OpenText Filename:=strFIlesPath & "Tmp.txt", Origin:=1251, _
            StartRow:=1, DataType:=xlDelimited, Space:=True, FieldInfo:=Array(Array(1, 1), _
            Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
        Set oTmpWB = Workbooks("Tmp.txt")
        oTmpWB.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets(bytWSCount).Cells
        oTmpWB.Close
        bytWSCount = bytWSCount + 1
        lngLnsCount = 0
        Set oTS2 = fso.CreateTextFile(strFIlesPath & "Tmp.txt")
    End If
Loop
Application.EnableEvents = True
Application.ScreenUpdating = True
oTS1.Close: oTS2.Close
Kill oFile: Kill strFIlesPath & "Tmp.txt"
End Sub
Время выполнения импорта данных из того же вордовского файла на 10923 страницы при позднем связывании (закомментированные строки) составило 96 сек.
При раннем (не забываем добавлять ссылки на библиотеки) экономится ещё 14 сек (всего 82 сек)
Необходимость создания новых листов здесь также не проверяется, так что нужно заранее побеспокоиться об их наличии. Или подкорректировать код процедуры.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36570464
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
я тоже пробовал (правда в wsh)
Код: plaintext
1.
oDoc.SaveAs oDoc.Path & "\Export2.txt", wdFormatText
на выходе мусор получился, куча служебной информации, поэтому отказался от автоматики в этой части.
Надо тоже попробовать из Экселя провернуть.
А про проверку скорости - так там, после открытия файла, происходит работа по перекладыванию из одного файла в другой, с преобразованием строк. Вот это и хотел померить.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36570887
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного тоже скорость потестил:
612437 строк в Ворде (он уже сам и не показывает в статусе, по тексту смотрел).
Сохранил вручную в текст.
Моим wsh скриптом переложил в текст в 166152 строки за 21,18 сек.
Открывается в Экселе практически сразу, но кричит, что всё не откроет - естественно, нет разбивки по страницам. Но автору наверное и не надо - вроде пока объём не настолько большой.

Код vlth:
Связывание переключил (раннее пока не стал налаживать) и переделал перекладывание строк, что-то вроде не так писал в файл (см. ниже).
Тот-же файл Ворд перегрузил в Эксель за 30,27 сек.
Но тут есть ремарка - при 512 мБ памяти ругался на её отсутствие, общее время работы было больше, как раз принесли ещё 512 - теперь сработал без возражений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Option Explicit

Sub FromWordToExcel2()
'Dim oWD As New Word.Application, oDoc As Word.Document 'раннее связывание
'Dim fso As New Scripting.FileSystemObject, oFile As Scripting.File 'раннее связывание
'Dim strT As String, oTS1 As Scripting.TextStream, oTS2 As Scripting.TextStream 'раннее связывание

Dim oWD As Object, oDoc As Object
Dim fso As Object, oFile As Object
Dim strT As String, oTS1 As Object, oTS2 As Object
Const wdFormatText As Long =  2 , ForWriting As Byte =  2 

Dim lngLnsCount As Long, bytWSCount As Byte, strFIlesPath As String
Dim oTmpWB As Workbook, stb

stb = Timer

Set oWD = CreateObject("Word.Application")
Set fso = CreateObject("Scripting.FileSystemObject")

bytWSCount =  1 
Set oDoc = oWD.Documents.Open _
    ("C:\Temp\Export.doc")
oDoc.SaveAs oDoc.Path & "\Export2.txt", wdFormatText
Set oFile = fso.GetFile(oDoc.FullName)
oWD.Quit: Set oDoc = Nothing: Set oWD = Nothing
Set oTS1 = fso.OpenTextFile(oFile)
strFIlesPath = Left(oFile.Path, InStrRev(oFile.Path, "\"))
Set oTS2 = fso.CreateTextFile(strFIlesPath & "Tmp.txt", ForWriting, True)
Application.EnableEvents = False
Application.ScreenUpdating = False
Do Until oTS1.AtEndOfStream
    strT = oTS1.ReadLine
    If Len(strT) >  7  Then
        If IsDate(Left(strT,  8 )) Then
        oTS2.Write strT & vbTab
      Else
        oTS2.WriteLine strT
        lngLnsCount = lngLnsCount +  1 
    End If
    End If
    If lngLnsCount = Application.Rows.Count Or oTS1.AtEndOfStream Then
        oTS2.Close
        Workbooks.OpenText Filename:=strFIlesPath & "Tmp.txt", Origin:=xlWindows, _
            StartRow:= 1 , DataType:=xlDelimited, Space:=True, FieldInfo:=Array(Array( 1 ,  1 ), _
            Array( 2 ,  1 ), Array( 3 ,  1 )) ', TrailingMinusNumbers:=True 'это на 2000 не пошло
        Set oTmpWB = Workbooks("Tmp.txt")
        oTmpWB.Worksheets( 1 ).Cells.Copy ThisWorkbook.Worksheets(bytWSCount).Cells
        oTmpWB.Close
        bytWSCount = bytWSCount +  1 
        lngLnsCount =  0 
        Set oTS2 = fso.CreateTextFile(strFIlesPath & "Tmp.txt")
    End If
Loop
Application.EnableEvents = True
Application.ScreenUpdating = True
oTS1.Close: oTS2.Close
Kill oFile: Kill strFIlesPath & "Tmp.txt"

stb = CInt((Timer - stb) *  100 ) /  100 
MsgBox ("Время работы " & stb & " сек."), vbInformation

End Sub

...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571579
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121,

Так у меня получилось 91 сек вместо 96 - всё-таки листов в 2 раза меньше - 3, а не 6
Только автору по условию нужно было 3 столбца, а не 4? Или 3 - это промежуточный вариант
? Что-то непонятно...
Код: plaintext
', TrailingMinusNumbers:=True 'это на  2000  не пошло
Когда-то я пытался и от этого параметра "избавиться", вычищая всё, что записал рекордером - тогда не пошло. Видимо, тот текст, с которым я работал, иначе корректно не открыть было.
Сейчас и проверять не стал - оставил. Выходит, зря не проверил.
Кстати, нигде не нашёл описания этого параметра, а в хелпе сказано лишь, что он - "Optional Variant".
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571932
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
попробовал сейчас этот же Ваш код дома - что-то 1 гиг памяти не спасает - загрузка в пике доходит до 900 мБ и в итоге Эксель виснет. Так результата и не добился.
Имхо на слабой машине надо работать с текстом. Можно его в отдельные файлы перекладывать. Ваш код у меня до зависона сделал Export2.txt и первый Tmp.txt. И вероятно на
oTmpWB.Worksheets(1).Cells.Copy ThisWorkbook.Worksheets(bytWSCount).Cells
он и помер, или уже при открытии этого Tmp.txt (я его видел).
А вообще можно и csv генерить, по 65536 строк каждый. И потом подгружать в листы, можно даже и кодом - количество и имена известны, тянуть как экспорт или копировать целиком из отдельных книг в общую - сейчас сделал вручную, без проблем и мнгновенно, не так, как через Cells.Copy.
Но это уже теория, проверять не буду, уже неинтересно, да и проблема уже решена.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571955
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, посмотрел подробнее, даже генерил сразу Tmp.txt.xls, этот файл открыл нормально, а на копировании "Недостаточно памяти"...
Сейчас попробую лист целиком копировать, зацепило...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571972
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал - 125 секунд 3.5 листа данных - копировал листы целиком - полёт нормальный.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571981
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал сейчас этот же Ваш код дома - что-то 1 гиг памяти не спасает
Hugo121, у меня 768 MB, так что проблема, думаю, не в объёме памяти.

Если копировать лист, вручную выделяя все его ячейки, что равносильно Cells.copy, зависание проявляется?

А вообще можно и csv генерить, по 65536 строк каждый. И потом подгружать в листы, можно даже и кодом - количество и имена известны, тянуть как экспорт или копировать целиком из отдельных книг в общую - сейчас сделал вручную, без проблем и мнгновенно, не так, как через Cells.Copy Можно и целиком листы. Из того же .txt (принципиальной разницы с .csv нет). Кроме того, можно копировать только содержащие данные 3-4 столбца. Можно еще с помощью ADO, что наверное, будет быстрее всего. Всё это дело техники.
Cells.copy в записи проще всего - 1 строка. Поскольку она у меня работает (а причины, по которой в данном случае может быть иначе, я не представляю), я её и оставил.

Если автор топика, или кто-то иной, вновь обратится к этой теме, тогда и будет смысл реализовать что-то из вышеперечисленного, а так - согласен: задача решена.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36571982
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Сделал - 125 секунд 3.5 листа данных - копировал листы целиком - полёт нормальный.Вот и ладно
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572005
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот продукт совместного творчества, у меня работает без зависаний.
Кнопка запуска кода остаётся на последнем листе.
Должна быть доступна запись в папку, откуда открываете исходный документ.
Немного некрасиво остаётся полузакрытое окно выбора файла, не получилось победить...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572018
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Вот продукт совместного творчества, у меня работает без зависаний.
...
Немного некрасиво остаётся полузакрытое окно выбора файла, не получилось победить...
Решается с помощью DoEvents
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "Doc Files|*.doc"
objDialog.InitialDir = "C:\"
intResult = objDialog.ShowOpen
 If intResult =  0  Then
    Exit Sub
Else
    toFile = objDialog.Filename
End If
DoEvents
Только время выполнения увеличилось до 125 сек - в 1,5 раза (( ...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572024
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot]Решается с помощью DoEventsquot]
Или применить "родное" диалоговое окно Application.FileDialog(msoFileDialogOpen), что логичнее.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572205
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
Да, про DoEvents я подумал, уже засыпая...
Т.к. Application.FileDialog на 2000 не идёт, сделал с DoEvents. Ещё добавил и сократил StatusBar - стало инфомативней и меньше мелькать. В итоге время работы даже сократилось на 30%! Всё-же StatusBar здорово жрёт ресурсы...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572599
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121, про Status Bar интересно: я так эту версию и не проверил, хотя хотел...
Вот вариант с ADO. У меня получилось чуть более минуты (62-65 сек):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Sub FromWordToExcel3()
Dim oWD As New Word.Application, oDoc As Word.Document
Dim fso As New Scripting.FileSystemObject, oFile As Scripting.File, _
    strT As String, oTS1 As Scripting.TextStream, oTS2 As Scripting.TextStream
Dim cnTXT As New ADODB.Connection, rs As New ADODB.Recordset
Dim lngLnsCount As Long, bytWSIndx As Byte, strFIlesPath As String
Dim oTmpWB As Workbook, strDate As String, lngRowCnt As Long, lngRCrs As Long

Set oDoc = oWD.Documents.Open _
    ("C:\...\Export2.doc")
oDoc.SaveAs oDoc.Path & "\Export2.txt", wdFormatText
Set oFile = fso.GetFile(oDoc.FullName)
oWD.Quit: Set oDoc = Nothing: Set oWD = Nothing

Set oTS1 = fso.OpenTextFile(oFile)
strFIlesPath = Left(oFile.Path, InStrRev(oFile.Path, "\"))
Set oTS2 = fso.CreateTextFile(strFIlesPath & "Tmp.txt", ForWriting)

Do Until oTS1.AtEndOfStream
    strT = oTS1.ReadLine
    If Len(strT) >  0  Then
        If IsDate(strT) Then
            lngLnsCount = lngLnsCount +  1 
            strDate = lngLnsCount & " " & strT & " "
        Else
            oTS2.WriteLine Replace(strDate & strT, " ", ";")
            strDate = "": strT = ""
        End If
    End If
Loop
oTS1.Close: oTS2.Close
Set oTS1 = Nothing: Set oTS2 = Nothing

cnTXT.Mode = adModeRead
cnTXT.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data SoulngRCrse=" & strFIlesPath & ";Extended Properties='text;HDR=NO;FMT=Delimited'"
rs.CursorType = adOpenStatic
lngRowCnt = Application.Rows.Count
Application.EnableEvents = False
Application.ScreenUpdating = False
For bytWSIndx =  1  To lngLnsCount / lngRowCnt +  1 
    Set rs = cnTXT.Execute("SELECT F2,F3,F4,F5 FROM Tmp.txt WHERE F1 BETWEEN " & _
        lngRCrs +  1  & " AND " & lngRCrs + lngRowCnt)
    lngRCrs = lngRCrs + lngRowCnt
    With ThisWorkbook.Worksheets(bytWSIndx)
        .Cells( 1 ,  1 ).CopyFromRecordset rs
        .Columns( 1 ).NumberFormat = "dd.mm.yy"
    End With
Next
cnTXT.Close
Set cnTXT = Nothing: Set rs = Nothing
Application.EnableEvents = True
Application.ScreenUpdating = True
Kill oFile: Kill strFIlesPath & "Tmp.txt"
End Sub
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572603
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,
ещё не пропал интерес?
Поверяю - ругается на cnTXT.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
Не подскажете - что подключить или чем заменить?
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572605
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, заработало... просто я "Data SoulngRCrse=" исправил на "Data Sourse=" ...
Ещё недочёт - у меня 3 листа, а ему 4 подавай... смотрю...
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572611
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с АДО побыстрее - 48-66 сек. в зависимости от активности антивируса наверное.
Тот мой/наш последний вариант 79-93 сек. соответственно. Статусбары отключил для объективности.
...
Рейтинг: 0 / 0
Из Ворда в Эксель
    #36572683
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Не, заработало... просто я "Data SoulngRCrse=" исправил на "Data Sourse=" ...

Это я, уже в окне сообщения, вставляя переменную strFIlesPath вместо абсолютного пути... Но как ТАКОЕ могло получиться - не понимаю
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Из Ворда в Эксель
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]