Страницы: 1
RSS
Генерировать Word-документы по каждой однотипной позиции под требования отдела закупок
 
всем привет !
Пишу первый макрос :
есть таблица ексель с сописками электронных компонентов, нужно сегенерить ворд-документы по каждой однотипной позиции под требования отдела закупок.
Написал такой текст :

Код
Sub m1()

Dim objWord As Object

Dim FileSt
Dim FileNew
 
Set objWord = CreateObject("Word.Application")

    FileSt = "C:\SHABLON.docx"
        
Set objDoc = objWord.Documents.Open(FileSt)

    objWord.Visible = True
    
' пишем в файлы с названием элемента в цикле

For i = 15 To 25
      
      FileNew = "C:\zayavki2021\" & i & Cells(14, 2).Value & Cells(i, 2).Value & ".docx"

      objWord.ActiveDocument.SaveAs _
            Filename:=FileNew, _
            AddToRecentFiles:=True, _
            ReadOnlyRecommended:=False        
      
' ТИТУЛЬНЫЙ ЛИСТ
     objDoc.Bookmarks("Z1").Range.InsertAfter "_" & i & (Cells(14, 2).Value)
     objDoc.Bookmarks("Z1").Range.InsertAfter (Cells(i, 2).Value)
' название
      objDoc.Bookmarks("Z2").Range.InsertAfter (Cells(14, 2).Value)
      objDoc.Bookmarks("Z2").Range.InsertAfter (Cells(i, 2).Value)
' область применения
     objDoc.Bookmarks("Z3").Range.InsertAfter (Cells(14, 2).Value)
     objDoc.Bookmarks("Z3").Range.InsertAfter (Cells(i, 2).Value)
' параметры и размеры
      objDoc.Bookmarks("Z4").Range.InsertAfter (Cells(14, 2).Value)
' технико эконом и эксплуат показатели
      objDoc.Bookmarks("Z5").Range.InsertAfter (Cells(i, 6).Value)
' ТРЕБОВАНИЯ К ЭЛЕКТРОПИТАНИЮ
      objDoc.Bookmarks("Z6").Range.InsertAfter (Cells(i, 6).Value)
' КОЛИЧЕСТВО
      objDoc.Bookmarks("Z7").Range.InsertAfter (Cells(i, 6).Value) 
 
  Next i
  
objWord.ActiveDocument.Close
objWord.Quit
 
End Sub

Однако такая конструкция в цикле  работает  неправильно: в последний файл из десяти  вписываются все позиции.
Во второй две, в в пятый пять
Примерно так получатся в последнем ворд-файле:
Цитата
Техническое задание  на поставку
0402 10k 0.062Вт 25В_25Резисторы 1%0402 6k2 0.062Вт 25В_24Резисторы 1%0402 5k6 0.062Вт 25В_23Резисторы 1%0402 1k6 0.062Вт 25В_22Резисторы 1%0402 1k 0.062Вт 25В_21Резисторы 1%0402 680 0.062Вт 25В_20Резисторы 1%0402 100 0.062Вт 25В_19Резисторы 1%0402 1k6 0.062Вт 25В_18Резисторы 1%0402 68 0.062Вт 25В_17Резисторы 1%0402 50 0.062Вт 25В_16Резисторы 1%0402 20 0.062Вт 25В _15Резисторы 1%
 
На первый взгляд, Вы открываете шаблон, потом запускаете цикл, в начале цикла сохраняете шаблон (но он без значений!!!) под новым именем и лишь затем вносите туда данные. Пройдите свой код в пошаговом режиме, отслеживая результат после каждой команды и всё увидите.

И пример нужно прикладывать, кому охота создавать похожий шаблон с закладками, чтобы воспроизвести ошибку у себя?
 
вот
тексты шаблона и макроса подрезал по минимуму
 
alex niki, так пробуйте
Код
Sub m1()
Dim objWord As Object
Dim FileSt
Dim FileNew
Set objWord = CreateObject("Word.Application")
 For i = 15 To 25
    FileSt = "C:\SHABLON.docx"
    Set objDoc = objWord.Documents.Open(FileSt)
    objWord.Visible = True
    FileNew = "C:\zayavki2021\" & i & Cells(14, 2).Value & Cells(i, 2).Value & ".docx"
' ТИТУЛЬНЫЙ ЛИСТ
     objDoc.Bookmarks("Z1").Range.InsertAfter (Cells(14, 2).Value) & " "
     objDoc.Bookmarks("Z1").Range.InsertAfter (Cells(i + 1, 2).Value)
   objWord.ActiveDocument.SaveAs _
            Filename:=FileNew, _
            AddToRecentFiles:=True, _
            ReadOnlyRecommended:=False
        objWord.ActiveDocument.Close
  Next i
objWord.Quit
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Так пробовал : пишет первый файл, а на втором зависает на первой строке записи .
objDoc.Bookmarks("Z1").Range.InsertAfter (Cells(14, 2).Value) & " "

В чем проблема я пока не понимаю (
Изменено: alex niki - 28.01.2021 16:41:37
 
alex niki, у меня все работает...странно поменяйте формат файла везде с docx на dotx
Изменено: Mershik - 28.01.2021 16:42:32
Не бойтесь совершенства. Вам его не достичь.
 
Я думаю, может быть не успевает закрыть первый файл...? Есть ли метод который возвращает данные что файл закрыт?

Цитата
Mershik написал: поменяйте формат файла везде с docx на dotx
менял. тот же эффект, только еще и первый созданный файл не открывается "из за проблем с его содержимым"
 
alex niki, файл закрывать нужно не нужно закрывать объект вы точно макрсо попробовали мой?
Не бойтесь совершенства. Вам его не достичь.
 
В сообщении 4 код рабочий. Проверил.
Открыл файл из шаблона и сохранил его в "C:\SHABLON.docx".  Не как шаблон, а как документ. Всё отработало без каких-либо ошибок. Если сомневаетесь, что процедура не успевает что-то сделать, проверьте вручную работу процедуры пошагово по F8.
При массовом обращении к множеству файлов Word из Excel встречал плавающие ошибки (редко и на определенных компьютерах), которые излечивались заменой позднего связывания на раннее.
Изменено: aequit - 28.01.2021 17:13:50
 
Цитата
aequit написал:
встречал плавающие ошибки (редко и на определенных компьютерах), которые излечивались заменой позднего связывания на раннее
нет никаких ошибок нигде
но только если код правильно написан
(какое связывание используется, значения не имеет)
 
все заработало. Внимательность нужна.
Спаисбо всем за внимание к проблеме начинающего VBA-шника )
Страницы: 1
Наверх