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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 09:49   #1
legion-mia
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 14
По умолчанию Out of stack space (Error 28)

В поиске не нашел.. потому прошу помощи у зала

у меня во время работы макроса вываливается ошибка
Out of stack space (Error 28)

я так понял заканчивается память (стека?) в определенный момент работы макроса...
он у меня циклически выполняет ряд действий.. затыкается где-то на 150 цикле...

есть какая-нить команда чтобы память очистить


если книгу закрыть с макросом.. а потом открыть.
макрос продолжает нормально работать опять 150 циклов
я не программист и программировать не умею...
просто имел несчастье сделать пару макросов для бухгалтеров... теперь они меня считают программером >_<
legion-mia вне форума Ответить с цитированием
Старый 11.06.2009, 09:55   #2
pivas
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 412
По умолчанию

Хорошо бы взглянуть на сам цикл...
pivas вне форума Ответить с цитированием
Старый 11.06.2009, 09:57   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если бы Вы приложили файл с проблемным кодом, то скорее всего получили бы нужный ответ. А просто, на вскидку, могу предположить, что в процессе выполнения макроса, запускаются еще какие-то не нужные для данного случая процедуры (например, по какому-либо событию), которые постепенно "забивают" стек.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 11.06.2009, 10:14   #4
legion-mia
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 14
По умолчанию

выложить код прабла... типа секьюрные элементы

там несколько макросов которые запускают друг друга в зависимости от условий проверки
основные действия...
там происходит копирование строки.. с листа
ее "обработка" и копирование результатов обработки на три других листа...
когда обработано 50 строк
листы сохраняются в создаваемую папку в отдельные текстовые файлы... и процедура повторяется


оптимизировать код времени уже нет...
пока есть идея ограничить входной файл 150 строками


я так понял команды типа clear stack нету?
я не программист и программировать не умею...
просто имел несчастье сделать пару макросов для бухгалтеров... теперь они меня считают программером >_<

Последний раз редактировалось legion-mia; 11.06.2009 в 10:17.
legion-mia вне форума Ответить с цитированием
Старый 11.06.2009, 10:36   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
я так понял команды типа clear stack нету?
Нету. Она и не нужна. Проблема в алгоритме или реализации макроса, а стек чистить не надо.

Цитата:
выложить код прабла... типа секьюрные элементы
Тогда разбирайтесь с кодом самостоятельно.
Словесное описание кода здесь не поможет.
Да и что в коде может быть такое секретное?

Цитата:
оптимизировать код времени уже нет...
Это почему же?
Вы не готовы потратить несколько минут на то, чтобы код наконец-то начал работать без ошибок, и в несколько раз быстрее.

Короче, будет код - будут советы.
EducatedFool вне форума Ответить с цитированием
Старый 11.06.2009, 10:38   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
я так понял команды типа clear stack нету?
В VBA - нет.
1. Если совсем нет времени для отладки, попробуйте первой строкой в каждом макросе поставить
Код:
Application.EnableEvents = False
, а перед каждой точкой выхода из текущего макроса поставить
Код:
Application.EnableEvents = True
2. Проверьте, не происходит ли лишних вызовов одной процедуры из другой.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 11.06.2009, 12:27   #7
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

характерно для рекурсии..
slan вне форума Ответить с цитированием
Старый 15.06.2009, 15:36   #8
legion-mia
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 14
По умолчанию

первоочередную задачу мы все-таки решили..
однако хотелось бы макрос использовать в будущем..

пошарился по форуму... немного дооптимизировал скрипт после макрорекордера

выиграл буквально пару позиций... виснет теперь на 184 цикле...


почищенный код вот

Код:


    Sub GLAVworks()
        
        
work_status = Range("monitor!c10").Value
kolvo = Range("monitor!b13").Value


If kolvo = 50 Or work_status = 0 Then
Application.Run "'Key-MASTER.xls'!save_files"
End If


If work_status = 1 Then

Application.Run "'Key-MASTER.xls'!works"
Application.Run "'Key-MASTER.xls'!GLAVworks"
End If


         

     
End Sub


Sub works()

nomerK = Range("monitor!c13").Value
nomerK2 = Range("monitor!c14").Value
nomer12 = Range("monitor!c15").Value


    Sheets("ENTER").Range("A1:B14").Copy
    Sheets("WORK").Range("A1").PasteSpecial (xlPasteValues)
    Sheets("WORK").Range("A25:B27").Copy
    Sheets("OUT-1k").Range("A" + LTrim((nomerK))).PasteSpecial (xlPasteValues)
    Sheets("WORK").Range("A29:B31").Copy
    Sheets("OUT-2k").Range("A" + LTrim((nomerK2))).PasteSpecial (xlPasteValues)
    Sheets("WORK").Range("A18:B22").Copy
    Sheets("OUT-12").Range("A" + LTrim((nomer12))).PasteSpecial (xlPasteValues)
    Sheets("ENTER").Range("A1:B14").Delete (xlUp)

    
End Sub

     
Sub save_files()

nomerK = Range("monitor!c13").Value
nomer12 = Range("monitor!c15").Value
work_status = Range("monitor!c10").Value
kolvo = Range("monitor!b13").Value
kolvoK = Range("monitor!b10").Value
f_nomer = Range("monitor!b6").Value
l_nomer = Range("monitor!c6").Value - 1


Application.DisplayAlerts = False


MkDir "C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer)
     
Sheets("OUT-1k").Range("A1:B" + LTrim((nomerK))).Copy
    
    
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    Application.CutCopyMode = False
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .Orientation = 0
        .IndentLevel = 0
        .ReadingOrder = xlContext
    End With
    With Selection.Font
        .Name = "Courier New"
        .Size = 10
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Columns("A:B").EntireColumn.AutoFit
    
ChDir "C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer)

ActiveWorkbook.SaveAs Filename:="C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer) + "\" + "tmk1 - " + LTrim(f_nomer) + " - " + LTrim(l_nomer) + " - Clear.txt", FileFormat:=xlText, _
        CreateBackup:=False
 ActiveWindow.Close
        
Sheets("OUT-1k").Range("A1:B" + LTrim((nomerK))).Clear
    

    
Sheets("OUT-2k").Range("A1:B" + LTrim((nomerK))).Copy
    
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    Application.CutCopyMode = False
    With Selection.Font
        .Name = "Courier New"
        .Size = 10
    End With
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .Orientation = 0
        .IndentLevel = 0
        .ReadingOrder = xlContext
    End With
    Columns("A:B").EntireColumn.AutoFit

ActiveWorkbook.SaveAs Filename:="C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer) + "\" + "tmk2 - " + LTrim(f_nomer) + " - " + LTrim(l_nomer) + " - Clear.txt", FileFormat:=xlText, _
        CreateBackup:=False
    ActiveWindow.Close
    Sheets("OUT-2k").Range("A1:B" + LTrim((nomerK))).Clear
    
    

    
Sheets("OUT-12").Range("A1:B" + LTrim((nomer12))).Copy
    
       
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    Application.CutCopyMode = False
    With Selection.Font
        .Name = "Courier New"
        .Size = 10
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .Orientation = 0
        .IndentLevel = 0
        .ReadingOrder = xlContext
    End With
    Columns("A:B").EntireColumn.AutoFit

ActiveWorkbook.SaveAs Filename:="C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer) + "\" + "tmk1-2 - " + LTrim(f_nomer) + "-" + LTrim(l_nomer) + " - RLINE.txt", FileFormat:=xlText, _
        CreateBackup:=False
    ActiveWindow.Close
    
 
    
    Sheets("MONITOR").Range("C6").Copy
    Sheets("MONITOR").Range("B6").PasteSpecial (xlPasteValues)
 

   Sheets("OUT-12").Range("A1:B" + LTrim((nomer12))).Clear
   
       
    Application.DisplayAlerts = True

End Sub

сдается мне это все из за того что типа "счетчики" берутся со страниц экселя... и каждый цикл это по сути ctrl+c / ctrl+v
у меня пока знаний не хватает как это сделать так чтобы все типа автоматом делалось
я не программист и программировать не умею...
просто имел несчастье сделать пару макросов для бухгалтеров... теперь они меня считают программером >_<
legion-mia вне форума Ответить с цитированием
Старый 15.06.2009, 15:39   #9
legion-mia
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 14
По умолчанию

хотя есть еще идея просто тупо указать чтобы макрос work 50 раз срабатывал а потом сохранялись страницы...

но это уже завтра буду думать
я не программист и программировать не умею...
просто имел несчастье сделать пару макросов для бухгалтеров... теперь они меня считают программером >_<
legion-mia вне форума Ответить с цитированием
Старый 15.06.2009, 16:21   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Поставьте хотя бы первой строкой в макросе
Application.ScreenUpdating = False
Значительно быстрее будет работать...

Ещё могу посоветовать заменить
Код:
    Sheets("OUT-1k").Range("A1:B" + LTrim((nomerK))).Copy
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    Application.CutCopyMode = False
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
    End With
    With Selection.Font
        .Name = "Courier New"
        .Size = 10
    End With
    Columns("A:B").EntireColumn.AutoFit
на что-то вроде этого:
Код:
Sheets("OUT-1k").Copy
    ActiveWorkbook.SaveAs Filename:="C:\" + LTrim(f_nomer) + " - " + LTrim(l_nomer) + _
                                    "\" + "tmk1 - " + LTrim(f_nomer) + " - " + LTrim(l_nomer) + _
                                    " - Clear.txt", FileFormat:=xlText
    ActiveWorkbook.Close
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите справиться с java.lang.OutOfMemoryError: Java heap space Levilaulada Помощь студентам 1 17.05.2009 10:59
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/main.exe : fatal error LNK11 prefak Win Api 0 19.04.2009 16:51
Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow OWERFLAW ERROR prikolist Общие вопросы C/C++ 4 10.04.2009 20:27
Space Master 1994 deltashadow Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 08.08.2007 11:14