Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2013, 17:44   #1
madace
Пользователь
 
Регистрация: 15.10.2009
Сообщений: 15
По умолчанию Ошибка при открытии файлов

Доброго дня всем!
есть большой макрос в excel2010
начальная стадия- загрузка и декодирование 10-ти файлов xlsx
имена файлов и листов, куда надо данные вставлять занесены в массив
каждые файл открывается нижеприведенным кодом
функция flopflip просто раскодирует каждую ячейку (иначе "умные" юзеры лезут руками в данные)

СУТЬ ПРОБЛЕМЫ -
процедура работает- но два раза из трех вылетает ексель
подозреваю, что не хватает памяти, НО Я НЕ СПЕЦИАЛИСТ И НЕ ПРОГРАММИСТ -(прошу прощения за быдлокод)
уважаемые гуру- подскажите, в чем может быть проблема и как модифицировать/оптимизировать код?
зы. файлы разные, размером от 24 кб до 5 мб от 5 до 30 000 строк и от10до 50столбцов - попытался разбить на отрезки по 10000 строк - не помогает
Код:
 Sub decrypt(ByVal sv_name)
Dim split_control As Integer

split = False
If decrypt_from_GP = True Then
    currfile_graph = currfile
End If
Dim last_cyc As Boolean
row_control = Worksheets("properties").Cells(15, 2).Value
split_control = 1
last_cyc = False
Workbooks(currfile_graph).Activate
If sdd = False Then
    Worksheets(save_array(save_runner, 0)).Activate
Else
    Worksheets(save_array1(save_runner, 0)).Activate
End If

Cells.Clear
ActiveSheet.UsedRange
While last_cyc = False
    Workbooks.Open Filename:=ThisWorkbook.Path & "\" & sv_name & Worksheets("properties").Cells(split_control + 1, 3) & ".xlsx"
    Application.ScreenUpdating = False
    last_row = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    last_col = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
    Range("a1").Select
    temp_array_encryptor_me = Range(Cells(1, 1), Cells(last_row, last_col)).Value
    For x_runner = 1 To last_row
        For y_runner = 1 To last_col
            temp_array_encryptor_me(x_runner, y_runner) = flopflip(temp_array_encryptor_me(x_runner, y_runner))
        Next y_runner
    Next x_runner
    
    Workbooks(currfile_graph).Activate
    ActiveSheet.Cells(1 + (split_control * row_control) - row_control, 1).Resize(UBound(temp_array_encryptor_me), last_col).Value = temp_array_encryptor_me()
    Workbooks(sv_name & Worksheets("properties").Cells(split_control + 1, 3)).Activate
    ActiveSheet.UsedRange
    ActiveWorkbook.Close SaveChanges:=False
    If last_row < row_control Then last_cyc = True
    split_control = split_control + 1
Wend
End Sub
madace вне форума Ответить с цитированием
Старый 11.02.2013, 21:18   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

1) зачем используются строки ActiveSheet.UsedRange?

2) вместо
Код:
Workbooks(sv_name & Worksheets("properties").Cells(split_control + 1, 3)).Activate
    ActiveSheet.UsedRange
    ActiveWorkbook.Close SaveChanges:=False
можно написать
Код:
Workbooks(sv_name & Worksheets("properties").Cells(split_control + 1, 3)).Close SaveChanges:=False
3) код написан очень даже неплохо - не надо говорить про быдлокод

4) если макрос хотя бы один раз отработал корректно,
а Excel вылетает «молча», без всяких уведомлений об ошибке, — то это глюк Excel,
и с такими глюками справиться весьма непросто

5) постарайтесь избавиться от всех Activate в коде - они не нужны,
и могут провоцировать Excel на «вылет» (хотя, конечно, не должны)

6) попробуйте поработать с макросом на другом компе (и, возможно, другой версии Excel)
Если все будет работать - проблема в вашем Excel (можно попробовать накатить сервиспак)
EducatedFool вне форума Ответить с цитированием
Старый 12.02.2013, 10:58   #3
madace
Пользователь
 
Регистрация: 15.10.2009
Сообщений: 15
По умолчанию

1. ActiveSheet.UsedRange использую для того, что бы ActiveSheet.UsedRange.Row работал по последней заполненной строке, а то юзеры могут в произвольной пустой строке че-нить сделать - а макрос собьется - но это моя догадка- может я и не прав

2.эсли просветите с пп1 - попробую написать так
4. при ошибке эксель выдыет appcrash и пытается перезапустить приложение
5 попробую обойтись без activate- пока наблюдаю только катастрофический рост потребления памяти экселем при выполнении кода - да 400-500 мб и спорадические вылеты на стадии загрузки этих файлов- дальнейшие преобразования к вылетам не приводят...
6. пробовал на разных компах и системах - результат примерно один и тот же

спасибо, что помогаете разобраться
madace вне форума Ответить с цитированием
Старый 12.02.2013, 11:42   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
4. при ошибке эксель выдыет appcrash и пытается перезапустить приложение

наблюдаю только катастрофический рост потребления памяти экселем при выполнении кода - да 400-500 мб
Вот в этом и проблема, что Excel глючит при работе с большими объёмами данных.
Вообще, это проблема чисто Excel (а не вашего кода), но можно попробовать её избежать.

Я бы попробовал один из 2 вариантов:
1) установить другую версию Excel 2010 (c последним сервиспаком) - вот лично у меня Excel 2010 работает очень стабильно, appcrash я даже не помню, когда в последний раз видел (хотя в Excel 2007 - бывало), хотя я ежедневно пишу программы разной сложности, и для больших объёмов памяти в том числе.
У меня установлено 2 гига оперативки. А у вас? Может, надо памяти вам добавить в комп?
Хотя, массив 30000*50 - это не так уж и много для новой версии Excel

2) оптимизировать функцию flopflip - есть подозрения, что утечка памяти происходит именно в ней
Покажите код этой функции - возможно, что после её незначительной переделки все начнет работать стабильно
EducatedFool вне форума Ответить с цитированием
Старый 12.02.2013, 11:44   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

пример можете скинуть файла с макросом и пару фалов для обработки?

и посмотрите вот эту тему:
http://www.programmersforum.ru/showt...60#post1095060

и именно этот пост с открытие файлов:
http://www.programmersforum.ru/showp...0&postcount=20
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось EducatedFool; 12.02.2013 в 12:27. Причина: staniiislav, не первый же день на форуме... зачем цитировать огромные сообщения целиком???
staniiislav вне форума Ответить с цитированием
Старый 12.02.2013, 12:00   #6
madace
Пользователь
 
Регистрация: 15.10.2009
Сообщений: 15
По умолчанию

Вот код функции и примерчик
но сбоит только на больших файлах

Устанавливал и последние сервис паки и гонял на 64разрядах
сбоит и на 4 гигах и на 2х


Код:
Function flopflip(data As Variant)
dobav_str = Asc(Left(data, 1))
dobav = Int(dobav_str) - 99
real_len = Int(Asc(Mid(data, 2, 1)) - 46) 
flipflop_base = Right(data, real_len)
flopflip = ""
For temp_counter_ecnrypt = 1 To Len(flipflop_base)
curr_enc_symb = Mid(flipflop_base, temp_counter_ecnrypt, 1)
addition = Chr(Asc(curr_enc_symb) + dobav)
flopflip = flopflip & addition
Next temp_counter_ecnrypt
End Function
Вложения
Тип файла: rar encript.rar (5.7 Кб, 10 просмотров)
madace вне форума Ответить с цитированием
Старый 12.02.2013, 13:12   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

у меня в вашем файле один лист и немного каких-то символов непонятных
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 12.02.2013, 13:28   #8
madace
Пользователь
 
Регистрация: 15.10.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от staniiislav Посмотреть сообщение
у меня в вашем файле один лист и немного каких-то символов непонятных
это и есть часть файла, зашифрованная- как пример
увидел ограничение на объем загруженных файлов - поэтому обрезал- а так копипастом его можно увеличить до любого объема

сами файлы из-за шифрования не поддаются архивации
а макрос уж очень большой - поэтому я и обрезал только сбоящую часть

Последний раз редактировалось madace; 12.02.2013 в 13:30.
madace вне форума Ответить с цитированием
Старый 12.02.2013, 13:39   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте такой вариант:
Код:
Function flopflip(data As Variant)
    flopflip = data
End Function
будет ли вылетать Excel?
(данные, конечно, не расшифруются - но причины проблем поможет понять)

А вообще, функцию лучше переделать так:

Код:
Function flopflip(ByRef data$) As String ' объявляем типы данных
    dobav_str& = Asc(Left(data, 1))
    dobav& = Int(dobav_str) - 99
    real_len& = Int(Asc(Mid(data, 2, 1)) - 46)
    flipflop_base$ = Right(data, real_len)

    For temp_counter_ecnrypt = 1 To Len(flipflop_base)
        res$ = res$ & Chr(Asc(Mid$(flipflop_base, temp_counter_ecnrypt, 1)) + dobav)
    Next temp_counter_ecnrypt
    data$ = res$    ' возвращаем результат в переданную по ссылке переменную
End Function
и вызывать её иначе:
Код:
    For y_runner = 1 To last_col
        flopflip temp_array_encryptor_me(x_runner, y_runner)
    Next y_runner
EducatedFool вне форума Ответить с цитированием
Старый 12.02.2013, 13:41   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

1.Я бы от activate избавлялся примерно так:

Код:
    Set wb = Workbooks.Open(filename, False, True)
'тут работа
    wb.Close False
    Set wb = Nothing
Так может быть и из памяти лишнее уйдёт.

2. ActiveSheet.UsedRange у Вас отрабатывает до открытия книги - т.е. думаю бессмысленно.
3. Открыли книгу и берёте что лежит на активном листе. Уверены, что лист нужный?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при открытии файла Klim Bassenger Microsoft Office Excel 2 16.09.2018 15:44
eclipse 4.2 – тормоза при открытии файлов Bustle Софт 0 24.08.2012 00:58
Падает Word при открытии файлов больших объемов 4-5 метров. Денис Алекс Microsoft Office Word 1 25.02.2012 10:33
ошибка при открытии Acina Microsoft Office Access 1 27.07.2011 17:04