Войти

Показать полную графическую версию : [решено] переименования файлов


Страниц : 1 [2]

Iska
07-12-2017, 23:20
Извините за тупой вопрос но все же wsf файл запускать так же как и vbs »
Да, исполнитель тот же — wscript.exe/cscript.exe.

office 2013 /2016, скрипт ругается на 5 строчку: Методы или свойство OpenDataSource недоступны, потому что эту команду нельзя использовать в режиме чтения. И действительно word запускаться в режиме чтения »
Замените строку:
Set objDocument = objWord.Documents.Open("C:\Мои проекты\0136\order.doc", , True)
на:
Set objDocument = objWord.Documents.Open("C:\Мои проекты\0136\order.doc")

mcintosh55
07-12-2017, 23:56
ISKA, большое спасибо!!!

скрипт работает office 2003/2007/2013/2016
<job>
<object ProgId = "Word.Application" id = "objWord" events = "true" />
<script language = "VBScript">
Option Explicit

Const wdFormLetters = 0
Const wdSendToNewDocument = 0

Const wdDefaultFirstRecord = 1
Const wdDefaultLastRecord = -16

Const wdNextRecord = -2

Dim objDocument
Dim objCurrResultDocument

Dim i
Dim strDocumentName


objWord.Visible = True

Set objDocument = objWord.Documents.Open("C:\Мои проекты\0136\order.doc")

With objDocument.MailMerge
.MainDocumentType = wdFormLetters
.OpenDataSource _
"C:\Мои проекты\0136\base.xls", _
,,,,,,,,,, _
"Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;Jet OLEDB:Engine Type=35;""", _
"SELECT * FROM `Лист1$`"

.Destination = wdSendToNewDocument
.SuppressBlankLines = True

For i = wdDefaultFirstRecord To .DataSource.RecordCount
.DataSource.FirstRecord = .DataSource.ActiveRecord
.DataSource.LastRecord = .DataSource.ActiveRecord

Set objCurrResultDocument = Nothing

strDocumentName = .DataSource.DataFields.Item("SNP").Value

.Execute False
.DataSource.ActiveRecord = wdNextRecord

Do
WScript.Sleep 100
Loop Until Not objCurrResultDocument Is Nothing

objCurrResultDocument.Close
Next
End With

objDocument.Close False
WScript.DisconnectObject objWord
objWord.Quit

WScript.Quit 0

Sub objWord_MailMergeAfterMerge(ByVal objResultDocument, ByVal objMainDocument)
objResultDocument.SaveAs "C:\Мои проекты\0136\" & strDocumentName & ".doc"
Set objCurrResultDocument = objResultDocument

rem WScript.Echo "Mail Merge Complete: " & objResultDocument.FullName
End Sub
</script>
</job>

Iska
08-12-2017, 00:23
mcintosh55, так… Это уже хорошо. Теперь двигаемся дальше.

1. Как я понимаю, Вам сие придётся проделывать достаточно регулярно, так? Как было бы Вам удобнее и проще работать?
2. Существует вполне ненулевая вероятность, что в одном списке окажутся разные люди с полным совпадением ФИО (или даже один и тот же, но с разными постановлениями). Пока это даже никак не проверяется — файл с именем, стоящим ниже по списку просто тупо затрёт ранее созданный файл. Что можно придумать, исходя из исходных данных — что там есть уникального в списке (скажем, тот же номер постановления, нет?

mcintosh55
08-12-2017, 02:03
Как было бы Вам удобнее и проще работать? »
в принципе на данном этапе все ок, Я завтра напишу cmd скрипт которые будет запускать скрипт wsf скрипт (все системе все скрипты открываются как txt файл ).
Я думаю можно по пробовать фио+столбик personal account это число уникальное
strDocumentName = .DataSource.DataFields.Item("SNP" & "_" & "personal account").Value
что типа такого, но у меня не получилось вываливает в ошибку

mcintosh55
08-12-2017, 14:09
Сегодня протестировал скрипт, почему то рандомно он останавливается т.е. может создать новых файлов из всего списка а может и остановиться 10 или 20 или 24 файлов каждый раз по разному

Iska
08-12-2017, 15:03
Я думаю можно по пробовать фио+столбик personal account это число уникальное »
strDocumentName = .DataSource.DataFields.Item("SNP").Value & "_" & .DataSource.DataFields.Item("personal account").Value

Сегодня протестировал скрипт, почему то рандомно он останавливается т.е. может создать новых файлов из всего списка а может и остановиться 10 или 20 или 24 файлов каждый раз по разному »
На одном и том же файле-списке?

mcintosh55
08-12-2017, 15:09
На одном и том же файле-списке? »
нет на разных такое ощущение что он теряет фокус окна, к примеру пока выполнялся скрипт Я открыл cmd консоль и скрипт остановился, до этого еще был браузер открыт другой документ word если делаешь активное например браузера может скрипт остановиться. После того как все закрыли скрипт отработал полностью 2 из 3 раза.

Iska
08-12-2017, 15:36
mcintosh55, ну, с окнами там работы никакой не ведётся по причине отсутствия такового кода. То, что окна новосозданных документов Word мельтешат в процессе — так я пока специально оставил окно приложения Microsoft Word видимым на случай возникновения ошибок.

mcintosh55, мне вот ещё что подумалось: Вы исполняете .wsf под консольным cscript.exe или под GUI'шным wscript.exe? Я-то всегда работаю под консолью, и у меня именно cscript.exe задан исполнителем (в противовес wscript.exe, используемому по умолчанию). Так вот, под wscript.exe от команд WScript.Echo будут появляться не сообщения в консоли, а окна сообщений, и после появления такого окна сообщения скрипт действительно будет останавливаться до тех пор, пока будет это окно сообщения не будет закрыто.

mcintosh55
08-12-2017, 15:46
strDocumentName = .DataSource.DataFields.Item("SNP").Value & "_" & .DataSource.DataFields.Item("personal account").Value
у нас скрипт выдал ошибку в "personal account" надо поставить _ а то ошибку выдает Я поменял и в скрипте и в таблице
strDocumentName = .DataSource.DataFields.Item("SNP").Value & "_" & .DataSource.DataFields.Item("personal_account").Value

Скрипт Я запускаю по двойному щелчку, по Вашему комментарию Я понял что скрипт надо запускать через cscript.exe. Буду пробовать, отпишусь что и как.

через cscript.exe все отлично отрабатывает

mcintosh55
08-12-2017, 16:02
Большое спасибо, Iska!!! Все отлично работает, то что окна открываются закрываются это не страшно.

Iska
08-12-2017, 16:16
у нас скрипт выдал ошибку в "personal account" надо поставить _ а то ошибку выдает Я поменял и в скрипте и в таблице »
Ну, я не проверял, просто воспользовался Вашим кодом.

Скрипт Я запускаю по двойному щелчку, по Вашему комментарию Я понял что скрипт надо запускать через cscript.exe. Буду пробовать, отпишусь что и как.
через cscript.exe все отлично отрабатывает »
Периодически выпадает из памяти, что надо этот момент учитывать.

Все отлично работает, то что окна открываются закрываются это не страшно. »
Это можно будет убрать, просто закомментировав:
' objWord.Visible = True
Но что дальше? В первую очередь я имею в виду указание путей к файлам непосредственно в коде.

mcintosh55
08-12-2017, 20:02
Но что дальше? В первую очередь я имею в виду указание путей к файлам непосредственно в коде. »
в принципе тот функционал, что сейчас есть его хватает, все файлы лежат в папках и Я сказал пользователю ни чего не трогать не передвигаем редактируем только это и это. Ну максимум на что Я бы посмотрел это как в excel файле сделать печатную форму т.е. те данные которые храниться word как то перенести в excel. Ну и переделать скрипт которые выше т.е. встроить его в excel документ, что я имею веду к примеру пользователь выделяет строку и нажимает кнопку печать и печатается конкретный документы или нажимаю кнопку печатать всю таблицу и печатается вся таблица в виде печатной форме. Просто интересен момент с печатной формой в excel + можно уйти от слияния.

А так весь функционал хватает.




© OSzone.net 2001-2012