Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA: проблема с массовым импортом данных из Excel в Word, Каждая итерация цикла приводит к созданию нового процесса WINWORD.EXE
 
Добрый день!

Возник неприятный момент при массовом импорте данных из экселя в ворд.
Каждый раз прогоняя данные через шаблон, возникает новый процесс WINWORD.EXE, что в результате (на большом объеме: 600 файлов Excel перегоняются в Word) приводит к 100% загрузке ЦП и съеданию всего объема оперативной памяти, что в свою очередь приводит к зависанию макроса.

Дано:
1) файл эксель, в котором производятся необходимые расчеты.
2) файл шаблон ворд, в котором в необходимых местах стоят условные "zamena1" "zamena2" "zamena3", которые потом циклом построчно заменяются на данные из экселя.

В файле эксель, запускаю макрос, который в указанной папке перебирает все файлы, поочередно их открывая и перенося данные на лист с расчетами, после чего из этого же файла запускаю макрос, который формирует отчет в Word'e. Первые 100-200 файлов обрабатывает бодро, но при этом каждая итерация цикла приводит к созданию дополнительного процесса WINWORD.EXE

Прикладываю код макроса на замену данных в Word шаблоне, полагаю именно в нем проблема и он создает дополнительные процессы WORD.EXE и не выгружает их из памяти. При этом в коде объектные переменные очищаются, а файл закрывается с сохранением. Подскажите, пожалуйста, в чем может быть проблема?
Код
Sub Otchet()
Dim objWord As Word.Application
Dim objDocument As Word.Document
Dim iLastRow As Long

iLastRow = Worksheets(4).Cells(Rows.Count, 1).End(xlUp).Row
Set objWord = CreateObject("Word.Application")
Se t objDocument = objWord.Documents.Open(Filename:="C:\Справка\spravka.docx", ReadOnly:=False)
Set myRange = objDocument.Content

FName = "C:\Справка" & "\" & Sheets(1).Cells(8, 16).Value & "_" & Sheets(1).Cells(10, 16).Value
 
myRange.Find.ClearFormatting

   For i = 1 To iLastRow
myRange.Find.Execute FindText:="z" & i, MatchWholeWord:=True, ReplaceWith:=Sheets(4).Cells(i, 1).Text, Replace:=wdReplaceAll
    Next i

objWord.Visible = False
objDocument.SaveAs Filename:=FName & ".doc", FileFormat:=wdFormatDocument
objDocument.Close

Set myRange = Nothing
Set objDocument = Nothing
Set objWord = Nothing
End Sub
Вытащить несколько столбцов sql-запросом на VBA при пересекающихся условиях выборки
 
Добрый день, уважаемые форумчане! =)
Знаю, что проблема наверное банальная, но быстрый поиск по просторам сети результатов не принес — поэтому обращаюсь к вам за помощью.

Использую стандартное подключение, которое ранее здесь выкладывал Dmitry_R, вот оно:

Код
Public Function SqlFin(ByVal strSql$, ByVal FilePath$, ByVal OutputRange As Range, _
ByVal FieldsName As Boolean, ByVal OutputFieldsName As Boolean)
'==============================================================================
'*Описание функции : Возвращает набор записей Recordset с первой ячейки адреса,
'* указанного диапазона.
'*strSql - Конструкция SQL  запроса.
'* FilePath - Полный путь к файлу включая имя и расширение.
'* OutputRange - адрес ячеки с которой начинается вывод данных.
'* FieldsName - используются или нет заголовки столбцов (True - False)
'* OutputFieldsName - вывод данных с заголовками или без (True - False), _
'* если FieldsName=False, заголовки не выводятся.

Dim sCon As String, FieldName As String
Dim rs As Object, cn  As Object
Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
If FieldsName Then FieldName = "Yes" Else FieldName = "No"
Select Case CLng(Split(Application.Version, ".")(0))
    Case Is < 12
        sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FilePath _
          & ";Extended Properties=""Excel 8.0;HDR=" & FieldName & ";IMEX=1"";"
    Case Is >= 12
        sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FilePath _
        & ";Extended Properties=""Excel 12.0;HDR=" & FieldName & ";IMEX=1"";"
End Select

cn.Open sCon
If Not cn.State = 1 Then Exit Function
Set rs = cn.Execute(strSql)
If Not FieldsName Then OutputFieldsName = False
 If OutputFieldsName Then
    For i = 0 To rs.Fields.Count - 1
    OutputRange.Offset(0, i) = rs.Fields(i).Name
    Next
    Set OutputRange = OutputRange.Offset(1, 0)
 End If
 DoEvents
OutputRange.CopyFromRecordset rs
rs.Close:  cn.Close
Set cn = Nothing: Set rs = Nothing
End Function

Теперь пытаюсь написать SQL запрос, который вытягивал бы сразу много столбцов из моих табличек.

Например:

Visokolikvid = "SELECT DISTINCT REGN, SUM (IITG) As ВысоколиквидныеАктивы FROM [Лист1$] WHERE NUM_SC IN ('20202','20203','20206','20207','20208','20209','20210','30210','30102','30104','30106','20302','20303','20305','20308','20401','20402','20403','30110','30118','30119','30125','30213','30114') GROUP BY REGN" - Такой запрос отрабатывает нормально

Но как только добавляю третий столбец через запятую выдает ошибку: "Ошибочное или пропущенное зарезервированное слово или аргумент в инструкции SELECT или неверная пунктуация"

Visokolikvid = "SELECT DISTINCT REGN, SUM (IITG) As ВысоколиквидныеАктивы WHERE NUM_SC IN ('20202','20203','20206','20207','20208','20209','20210','30210','30102','30104','30106','20302','20303','20305','20308','20401','20402','20403','30110','30118','30119','30125','30213','30114'), SUM (IITG) As Касса FROM [Лист1$] WHERE NUM_SC IN ('20202','20203','20206') GROUP BY REGN"

Не подскажите, в чем может быть проблема? При необходимости подготовлю файл-пример (меньшего объема, чем боевой).

Заранее спасибо.

Изменено: DelinhO - 08.08.2017 13:51:36
Страницы: 1
Наверх