Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка кучи экселек - есть ли ошибка? / 17 сообщений из 17, страница 1 из 1
08.08.2013, 17:45
    #38360096
Обработка кучи экселек - есть ли ошибка?
Подозреваю, что в коде где-то что-то концептуально неправильно, из-за чего может утекать память.
Для импорта в акцесс обрабатываю предварительно кучу экселек таким кодом:
Код: vbnet
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.
Dim xla
Sub RunProcessingXlk()
'Используем ФСО для возврата всех файлов в выбранной папке
'идем циклом по файлу, получаем его имя и далее работаем с рабочей книгой с этим именем
Dim fso, fld, f1, fc, s
Dim FolderSpec
Dim d1, d2
Dim lng_FileCount As Long
lng_FileCount = 0
d1 = Now
'CHANGE FOLDER===========================================================================
FolderSpec = "d:\docs\КировгрОтчеты\ТестОбрДолжн\"
'========================================================================================
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(FolderSpec)
Set fc = fld.Files
For Each f1 In fc
    If lng_FileCount > 0 Then
        Set xla = GetObject(, "Excel.Application")
    Else
        Set xla = New Excel.Application
    End If
    xla.ScreenUpdating = False
    s = f1.Name: lng_FileCount = lng_FileCount + 1
    
        OneXlsWBProcessing s, FolderSpec
   
Next f1
xla.ScreenUpdating = True
Set xla = Nothing
d2 = Now
MsgBox "Ура, ура! Обработка кучи экселек завершена", vbInformation, "satart at " & d1 & " end at " & d2
End Sub


Ничего вроде не придумывал, взял свой работающий код 2летней давности и немножко допилил. Есть что-то концептуально неправильное, из-за чего память может утекать?
Обработка может быть примерно такой:
Код: vbnet
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.
Sub OneXlsWBProcessing(WBFileName, FolderSpec)
'Обработка единственного эксельного файла
Dim xlw, xls
Dim strStartCell As String, stryyyymm01 As String
strStartCell = "A1"
Set xlw = xla.Workbooks.Open(FolderSpec & WBFileName)
'    xla.Visible = False
Set xls = xlw.ActiveSheet

Dim lng_row_count As Long, lng_col_count As Long
With xls
    .Columns("A:A").Delete Shift:=xlToLeft
    .Rows("1:3").Delete Shift:=xlUp
    .Rows("2:2").Delete Shift:=xlUp
    lng_row_count = .Range(strStartCell).CurrentRegion.Rows.Count
    lng_col_count = .Range(strStartCell).CurrentRegion.Columns.Count
    .Rows(lng_row_count).Delete Shift:=xlUp
    .Cells(1, lng_col_count + 1) = "Расчетный период"
    stryyyymm01 = Left(WBFileName, 6) & "01"
    .Cells(2, lng_col_count + 1).FormulaR1C1 = stryyyymm01
    .Cells(2, lng_col_count + 1).AutoFill Destination:=.Range(.Cells(2, lng_col_count + 1), .Cells(lng_row_count - 1, lng_col_count + 1))
End With
xlw.Names.Add "Data0", xlw.Sheets(1).Range(strStartCell).CurrentRegion
xlw.Close SaveChanges:=True
Set xls = Nothing
Set xlw = Nothing
    
End Sub
...
Рейтинг: 0 / 0
08.08.2013, 18:07
    #38360115
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
грязный комплектовщикПодозреваю, что в коде где-то что-то концептуально неправильно, из-за чего может утекать память.
Да. Вот тут:
грязный комплектовщик If lng_FileCount > 0 Then
Set xla = GetObject(, "Excel.Application")
Else
Set xla = New Excel.Application
End If

Загрузите ProcessExplorer или иной аналогичный инструмент. Запустите. И смотрите, сколько Экселей запускает этот фрагмент, и что с ними происходит дальше....
...
Рейтинг: 0 / 0
08.08.2013, 18:18
    #38360126
Обработка кучи экселек - есть ли ошибка?
Akinaгрязный комплектовщикПодозреваю, что в коде где-то что-то концептуально неправильно, из-за чего может утекать память.
Да. Вот тут:
грязный комплектовщик If lng_FileCount > 0 Then
Set xla = GetObject(, "Excel.Application")
Else
Set xla = New Excel.Application
End If

Загрузите ProcessExplorer или иной аналогичный инструмент. Запустите. И смотрите, сколько Экселей запускает этот фрагмент, и что с ними происходит дальше....
А как правильно? Сдаюсь.
...
Рейтинг: 0 / 0
08.08.2013, 19:31
    #38360169
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
грязный комплектовщик,

Вообще лучше за цикл вынести обращение к экземпляру Excel:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
On Error Resume Next
'пытаемся подключится к объекту Word
Set xla = GetObject(, "Excel.Application")
If xla Is Nothing Then
    Set xla = CreateObject("Word.Application")
End If
xla.ScreenUpdating = False
For Each f1 In fc
...
Рейтинг: 0 / 0
08.08.2013, 19:31
    #38360170
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Упс, ошибся в одной строке:
Код: vbnet
1.
Set xla = CreateObject("Excel.Application")
...
Рейтинг: 0 / 0
08.08.2013, 22:41
    #38360272
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
The_PristВообще лучше за цикл вынести обращение к экземпляру Excel
Не только. Надо запоминать, был ли создан новый инстанс, и если да - потом его quit-ить... А лучше безусловно в начале создавать, а в конце квитить - чтобы не ковыряться с воркспейсами.
...
Рейтинг: 0 / 0
09.08.2013, 00:40
    #38360316
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Akina,

Согласен. Полагаю, автор как-нить догадается поставить флаг в моем коде.
...
Рейтинг: 0 / 0
09.08.2013, 11:12
    #38360541
Обработка кучи экселек - есть ли ошибка?
Спасибо за советы.
Странное дело, обрабатываю 305 файлов, на 306 макрос просто прекращается, без выдачи ошибки.
Запустил по новой - на 57 файле заткнулась работа.
В итоге в 3 захода 426 экселек обработалось.
...
Рейтинг: 0 / 0
09.08.2013, 11:20
    #38360555
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Один раз уже говорил:
AkinaЗагрузите ProcessExplorer или иной аналогичный инструмент. Запустите. И смотрите, сколько Экселей запускает этот фрагмент, и что с ними происходит дальше....
...
Рейтинг: 0 / 0
09.08.2013, 11:58
    #38360615
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Akina,

а может попробовать
Код: vbnet
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.
Dim xla
Sub RunProcessingXlk()
'Используем ФСО для возврата всех файлов в выбранной папке
'идем циклом по файлу, получаем его имя и далее работаем с рабочей книгой с этим именем
Dim fso, fld, f1, fc, s
Dim FolderSpec
Dim d1, d2
Dim lng_FileCount As Long
lng_FileCount = 0
 Set xla = New Excel.Application
d1 = Now
'CHANGE FOLDER===========================================================================
FolderSpec = "d:\docs\КировгрОтчеты\ТестОбрДолжн\"
'========================================================================================
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(FolderSpec)
Set fc = fld.Files
For Each f1 In fc
    xla.ScreenUpdating = False
    s = f1.Name: lng_FileCount = lng_FileCount + 1
    
        OneXlsWBProcessing s, FolderSpec
   
Next f1
xla.ScreenUpdating = True
Set xla = Nothing
d2 = Now
MsgBox "Ура, ура! Обработка кучи экселек завершена", vbInformation, "satart at " & d1 & " end at " & d2
End Sub
...
Рейтинг: 0 / 0
09.08.2013, 12:12
    #38360648
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
ПЕНСИОНЕРКА , да мне-то оно зачем... а ТС вроде задачу выполнил (и, как я понял, она вообще одноразовая).
...
Рейтинг: 0 / 0
09.08.2013, 13:06
    #38360792
Обработка кучи экселек - есть ли ошибка?
AkinaОдин раз уже говорил:
AkinaЗагрузите ProcessExplorer или иной аналогичный инструмент. Запустите. И смотрите, сколько Экселей запускает этот фрагмент, и что с ними происходит дальше....
Извини, не до того было - срочно нужно было другие эксельки спаривать.
Посмотрю на сл. неделе.
Из цикла я GetObject вынес.
ЗЫ Задача не разовая, нужно будет разобраться.
...
Рейтинг: 0 / 0
09.08.2013, 13:59
    #38360899
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
грязный комплектовщикЗадача не разовая, нужно будет разобраться.
В таком случае используйте мой совет в режиме трассировки кода. Узнаете много интересного - особенно если найдётся время на эксперименты.
...
Рейтинг: 0 / 0
09.08.2013, 16:59
    #38361321
Обработка кучи экселек - есть ли ошибка?
грязный комплектовщик...
Странное дело, обрабатываю 305 файлов, на 306 макрос прекращается, без выдачи ошибки.
Запустил по новой - на 57 файле заткнулась работа.
В итоге в 3 захода 426 экселек обработалось.
Я с такой штукой 1 раз сталкиваюсь. Без всякого сообщения об ошибке макрос просто прекращает работу - и все. Причем потом без проблем запускается.
Было дело, грязно использовал АДО с эксельными файлами - но там макрос просто не запускался со временем - Эксель выдавал сообщение "Оут оф мемори". Память утекла как рыба.
А вот чтобы так - просто прекратил работу цикл в макросе - 1 раз увидел.
Т.е. и такое бывает, сталкивались с таким?
...
Рейтинг: 0 / 0
09.08.2013, 17:18
    #38361357
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Для For Each? да запросто...
...
Рейтинг: 0 / 0
10.08.2013, 11:37
    #38361796
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Попробуйте обойтись без FSO (подпапки все равно не просматриваете):
Код: vbnet
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.
Dim xla As Object
Sub RunProcessingXlk()
'Используем ФСО для возврата всех файлов в выбранной папке
'идем циклом по файлу, получаем его имя и далее работаем с рабочей книгой с этим именем
    Dim sFiles As String, s As String, FolderSpec As String
    Dim d1 As Date, d2 As Date
    Dim lng_FileCount As Long
    
    lng_FileCount = 0
    Set xla = New Excel.Application
    d1 = Now
    'CHANGE FOLDER===========================================================================
    FolderSpec = "d:\docs\КировгрОтчеты\ТестОбрДолжн\"
    '========================================================================================
    sFiles = Dir(FolderSpec & "*.xls*")
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        OneXlsWBProcessing sFiles, FolderSpec
        sFiles = Dir
    Loop

    xla.ScreenUpdating = True
    Set xla = Nothing
    d2 = Now
    MsgBox "Ура, ура! Обработка кучи экселек завершена", vbInformation, "satart at " & d1 & " end at " & d2
End Sub
...
Рейтинг: 0 / 0
10.08.2013, 11:38
    #38361797
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка кучи экселек - есть ли ошибка?
Строка
sFiles = Dir(sFolder & "*.xls*")
лишняя - надо удалить.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка кучи экселек - есть ли ошибка? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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