Страницы: 1 2 След.
RSS
Глючный офис попался? Или он просто глючный?
 
Я уже писал о плавающих ошибках...  
Теперь вот постоянная ошибка, но на ровном месте.  
Написал макро1(). Делает следующее:  
- копирует два листа в новую книгу.  
- удаляет лишние строки/столбцы  
- заменяет значениями  
- удаляет имена  
 
Все это в цикле для 16 объектов.  
На 13-м (может пора в мистику начать верить?) объекте встает с ошибкой, там где предыдущие 12 спокойно выполнялись.  
Эксель при этом "слегка подвисает": есть возможность менять листы, но ни одна ячейка не выбирается. Сохранить или просто закрыть невозможно - только снять задачу.  
При пошаговом выполнении - сбоев нет.  
Тот же 13-й объект ставлю в начало цикла - сбоев нет  
 
сделал так:  
Саб макро1()  
цикл по 12 объектам  
Call макро2  
енд саб  
 
Макро2()  
цикл по 4 объектам  
енд саб  
 
Кода в два раза больше, но работает без сбоев.  
Офис 2007 SP2
Bite my shiny metal ass!      
 
Ну не зря же ведь нет 13-го офиса.. есть 12-й и есть 14-й :)
 
А какая ошибка?
 
{quote}{login=Longines}{date=09.03.2011 08:25}{thema=}{post}А какая ошибка?{/post}{/quote}Метод Делете оф объект Ранге фэйлед  
строка: tmpRange.EntireRow.Delete xlShiftUp
Bite my shiny metal ass!      
 
а     tmpRange как себя чувствует?
Живи и дай жить..
 
Отлично чувствует при 12 предыдущих проходах цикла, при пошаговом прохождении цикла целиком, при урезании цикла до последних 4 объектов - это же один и тот же ранге.  
 
Как он чувствует себя в момент выпадения ошибки неизвестно, я уже писал, что экслель "слегка подвисает" есть возможность только снять задачу.
Bite my shiny metal ass!      
 
Это уже ни в какие ворота не лезет.  
Эксель начал просто падать на строке:  
tmpBook.Close False  
 
Только не надо спрашивать является ли книгой tmpBook.  
Перед это строкой выполняется:  
tmpBook.SaveAs FullName без ошибок  
 
КМП
Bite my shiny metal ass!      
 
события какие-нить обрабатываются?
Живи и дай жить..
 
А файл приложить нельзя? Или легче ругать "глючный" Excel?
 
{quote}{login=слэн}{date=12.03.2011 10:27}{thema=}{post}события какие-нить обрабатываются?{/post}{/quote}Во время работы макроса все отключаю  
Классов нет
Bite my shiny metal ass!      
 
остается нашпиговать дебагами через строчку или вернее писать лог
Живи и дай жить..
 
{quote}{login=longines}{date=12.03.2011 10:59}{thema=}{post}А файл приложить нельзя? Или легче ругать "глючный" Excel?{/post}{/quote}Он не будет работать вне корпоративной сети.  
Тесно завязан на эксченьж и сетевые хранилища. Да и весит столько...    
А если я все повыбрасываю, то останется обычный код, который у всех (и у меня) работает.  
В том то и беда, что всякие нетривиальные вещи работают без сбоев, а на простом валится.
Bite my shiny metal ass!      
 
{quote}{login=слэн}{date=12.03.2011 12:09}{thema=}{post}остается нашпиговать дебагами через строчку или вернее писать лог{/post}{/quote}Что можно дебагить или писать в лог на строке tmpBook.Close False?  
Я пошагово прошел и вышел на эту строку.  
Может все в новую книгу перенести?  
Как это лучше сделать? Учитывая наличие сводных, имен..
Bite my shiny metal ass!      
 
<Он не будет работать вне корпоративной сети.  
Тесно завязан на эксченьж и сетевые хранилища. Да и весит столько...>  
 
Так может в этом вся и проблема?  
 
P.S. Антивирус или еще какая-нибудь пакость...
<FONT COLOR="CadetBlue">
 
ну, хотя бы какие-то свойства tmpbook  
 
кстате, постоянное добавление и удаление листов( макросом в цикле) быстро выводило из себя офис..  с книгами не пробовал
Живи и дай жить..
 
{quote}{login=слэн}{date=12.03.2011 12:42}{thema=}{post}ну, хотя бы какие-то свойства tmpbook  
 
кстате, постоянное добавление и удаление листов( макросом в цикле) быстро выводило из себя офис..  с книгами не пробовал{/post}{/quote}  
Вот целиком код:  
 
Sub export()  
Dim tmpBook As Workbook, sh As Worksheet, pvtTable As PivotTable  
Dim rPer As Date, rPerStr As String, tmpFullName As String  
Dim rMN As Range  
appCalc = Application.Calculation  
Application.Calculation = xlCalculationManual  
Application.EnableEvents = False  
Application.ScreenUpdating = False  
ThisPath = Split(ThisWorkbook.FullName, "\")  
 
For i = LBound(ThisPath) To UBound(ThisPath) - 1  
 If IsDate(ThisPath(i) & "/" & ThisPath(i + 1) & "/01") Then Exit For  
 SourcePath = SourcePath & ThisPath(i) & "\"  
Next  
myYear = ThisPath(i)  
myMonth = ThisPath(i + 1)  
rPerStr = Format(DateSerial(myYear, myMonth, 1), "mmmm yyyy")  
Application.StatusBar = "Сворачиваем..."  
ThisWorkbook.Sheets("Свод").PivotTables("Свод").PivotFields("Наименование МН").ClearAllFilters  
ThisWorkbook.Sheets("отчет").PivotTables("отчет").PivotFields("Наименование МН").ClearAllFilters  
 
ThisWorkbook.Sheets("Свод").Outline.ShowLevels rowLevels:=1, columnLevels:=1  
ThisWorkbook.Sheets("отчет").Outline.ShowLevels rowLevels:=1, columnLevels:=1  
Application.StatusBar = "Копируем..."  
Sheets(Array("отчет", "Свод")).Copy  
Set tmpBook = ActiveWorkbook  
For Each sh In tmpBook.Sheets  
 With sh  
   .Select  
   For Each pvtTable In .PivotTables  
     With pvtTable.TableRange2  
       Application.StatusBar = "Заменяем значениями " & pvtTable.Name  
       .Copy  
       .PasteSpecial Paste:=xlPasteValues  
     End With  
   Next  
   Application.StatusBar = "Заменяем значениями лист " & .Name  
   .UsedRange.Value = .UsedRange.Value  
   Application.StatusBar = "Удаляем впомогательные данные листа " & .Name  
   .Range("assistedRow").EntireRow.Delete xlShiftUp  
   .Range("assistedClmn").EntireColumn.Delete xlShiftToLeft  
 End With  
Next  
Application.CutCopyMode = False  
Application.DisplayAlerts = False  
tmpFullName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "") & "Сравнительный анализ результатов планирования за " & _  
             rPerStr & ".xls"  
Application.StatusBar = "Сохраняем..."  
tmpBook.SaveAs tmpFullName, xlExcel8  
'tmpBook.Close False  -- умирает здесь  
Application.DisplayAlerts = True  
 
If ThisWorkbook.Sheets("Ruling").Range("andSendMail").Value Then Call Posting(tmpFullName, rPerStr)  
Application.StatusBar = ""  
Application.Calculation = appCalc  
Application.EnableEvents = True  
Application.ScreenUpdating = True  
End Sub  
 
 
Нету ничего такого-этакого в коде.  
Я собственно конкретики не жду. Врядли можно что-то конкретно сделать.  
 
может не листы копировать, а создавать новую книгу, а в нее копировать значения?
Bite my shiny metal ass!      
 
да, у меня возникла та же мысль..(я сначала код смотрел, а потом дочитал сообщение :) )
Живи и дай жить..
 
Set tmpBook = ActiveWorkbook  
tmpBook.SaveAs tmpFullName, xlExcel8  
'tmpBook.Close False -- умирает здесь  
 
возможно эксель не понимает что же теперь tmpbook?  
 
варианты  
1)Set tmpBook = thisWorkbook  
2)Workbooks(tmpFullName).Close False
 
Макро2()  
цикл по 4 объектам  
енд саб  
 
здесь кстати тоже присмотреться что происходит с tmprng  
существенное различие заклбючается в том что  
в макро2(), как я понимаю есть дополнительная операция переприсвоения  
set tmprng =....  
может если в цикле по 12 объектам также на каждом шаге делать    
переприсвоение set tmprng =....  
то вдруг заработает.  
 
ключевое слово вдруг)
 
вопрос не в этом, а в том, что несколько раз оно прекрасно понимает, а потом перестает..  
 
Лузер, я правильно сказал ? :)
Живи и дай жить..
 
{quote}{login=слэн}{date=14.03.2011 12:11}{thema=}{post}вопрос не в этом, а в том, что несколько раз оно прекрасно понимает, а потом перестает..  
 
Лузер, я правильно сказал ? :){/post}{/quote}  
 
правильно понимает не более 12 раз  
 
Слэн! я просто по профански, пытаюсь стимулировать мозговой штурм более компетентных товарищей)
 
лузер, а может правда в конце шага поставить set tmpbook=nothing ?
Живи и дай жить..
 
>лузер, а может правда в конце шага поставить set tmpbook=nothing ?  
Этот код без цикла. Негде поставить set tmpbook=nothing  
Это не тот же код, что в первом посте.  
 
>возможно эксель не понимает что же теперь tmpbook?  
Видимо не понимает настолько, умирает совсем.  
Это не просто брэйк. Это "прекращена работа Эксель, Винда пытается где-то чего-то найти, бла-бла" и нету процесса Эксель в памяти.  
 
>варианты  
>1)Set tmpBook = thisWorkbook  
нет. tmpBook <> thisWorkbook, на то она и tmpBook.  
>2)Workbooks(tmpFullName).Close False - тоже не пройдет. надо из tmpFullName выделять просто Name.
Bite my shiny metal ass!      
 
tmpBook.SaveAs tmpFullName, xlExcel8  
'tmpBook.Close False -- умирает здесь  
Application.DisplayAlerts = True  
 
Попробуйте сохранять без указания формата, т.е. в "родном" формате:  
tmpBook.SaveAs tmpFullName  
И не отключайте Application.DisplayAlerts - может, какое-нибудь полезное сообщение будет.
 
Возможны несколько причин для такой ошибки.  
 
1. Ошибка возникает, если в копируемом листе есть именованный диапазон  
Подробнее здесь: http://support.microsoft.com/kb/210684/en  
Если в конце этой ссылки убрать /en , то страница отобразиться по-русски, но так как используется машинный перевод, то лучше все же читать оригинальный английский вариант текста.    
 
Шуточное решение: немного покопировать, сохранить, выгрузить загрузить, ещё немного покопировать, и т.д.  
 
Корректное решение (есть по указанной ссылке) – создать новую книгу, скопировать в неё лист, удалить все остальные пустые личссты, сохранить книгу как шаблон, и тогда уже добавлять куда угодно на основе созданного шаблона: Sheets.Add Type:=path\filename  
 
2. Если на копируемом листе присутсвуют какие-нибудь ActiveX элементы, например, кнопки с панели инструментов Visual Basic, то при копировании VB проект, по сути, меняется и создаются все предпосылки для утечки внутренней памяти Excel, используемых для таких операций.    
 
Решение – копировать только форматы, формулы и ширины столбцов:  
.PasteSpecial xlPasteColumnWidths  
.PasteSpecial xlPasteFormulasAndNumberFormats  
.PasteSpecial xlPasteFormats  
Пример можно посмотреть здесь: http://www.planetaexcel.ru/forum.php?thread_id=24290  
 
3. Возможна еще одна экзотическая причина. Известно, у листа помимо имени есть ещё и кодовое имя (видно в VBE project explorer), которое при копировании в пределах книги инкрементируется: Лист4, Лист5 и т.п. Имеются в виду  номера 4, 5 и т.д.  
Если листы копируются, затем удаляются, то при последующем копировании номер кодового имени начинается с последнего, которое было до удаления. Рано или поздно длина имени становится несовместимой для VBA.  Не знаю, кто доживал до такой ситуации, но теоретически она возможна.  
 
Решение – скопировать или перенести все листы в новую книгу и продолжать работать уже с ней.
 
1. Судя по всему у меня получилось шуточное решение, когда я разбил на две процедуры.  
Прочитав по ссылке, понял, что хотя я и сохранял и закрывал книгу, у меня не было строчки  
Set tmpBook = Nothing  
Не понимаю зачем нужно  
Set oBook = Nothing, если вслед сразу идет:  
Set oBook = Application.Workbooks.Open("c:\test2.xls")  
Память экономится?  
 
2. ActiveX - не пользую.  
Но видимо придется воспользоваться PasteSpecial    
3. Я не доживал ^_^  
 
Спасибо за советы, ZVI!
Bite my shiny metal ass!      
 
{quote}{login=Казанский}{date=14.03.2011 10:45}{thema=}{post}tmpBook.SaveAs tmpFullName, xlExcel8  
'tmpBook.Close False -- умирает здесь  
Application.DisplayAlerts = True  
 
Попробуйте сохранять без указания формата, т.е. в "родном" формате:  
tmpBook.SaveAs tmpFullName  
И не отключайте Application.DisplayAlerts - может, какое-нибудь полезное сообщение будет.{/post}{/quote}В родном формате, а потом пересохранять или что?  
Полезное сообщение будет, так как файл все время с одним именем сохраняется. Для этого и подавляю алерты.
Bite my shiny metal ass!      
 
{quote}{login=Лузер™}{date=15.03.2011 12:58}{thema=}{post}1. Судя по всему у меня получилось шуточное решение, когда я разбил на две процедуры.  
Прочитав по ссылке, понял, что хотя я и сохранял и закрывал книгу, у меня не было строчки  
Set tmpBook = Nothing  
Не понимаю зачем нужно  
Set oBook = Nothing, если вслед сразу идет:  
Set oBook = Application.Workbooks.Open("c:\test2.xls")  
Память экономится?  
 
2. ActiveX - не пользую.  
Но видимо придется воспользоваться PasteSpecial    
3. Я не доживал ^_^  
 
Спасибо за советы, ZVI!{/post}{/quote}  
 
видимо при nothing срабатывает так называемый деструктор, который производит действия по освобождению памяти..
Живи и дай жить..
 
{quote}{login=ZVI}{date=15.03.2011 12:06}{thema=Причины сбоя Excel при копировании листов}{post}Подробнее здесь: http://support.microsoft.com/kb/210684/en  
{/post}{/quote}  
Как и где нужно искать, чтобы выходить на эти статьи мелкомягких?  
Я много раз видел, как на форумах дают такие ссылки, но гугля и поиск по майкрософту меня ни разу не выводили на то что нужно.  
может я запрос не умею строить?
Bite my shiny metal ass!      
 
{quote}{login=Лузер™}{date=15.03.2011 01:41}{thema=Re: Причины сбоя Excel при копировании листов}{post}Как и где нужно искать, чтобы выходить на эти статьи мелкомягких?  
Я много раз видел, как на форумах дают такие ссылки, но гугля и поиск по майкрософту меня ни разу не выводили на то что нужно.  
может я запрос не умею строить?{/post}{/quote}  
Вообще-то, эту страницу MS по ссылке я когда-то уже видел, т.е. знал, что она есть. Более того, эта страничка у меня скопирована в папке Bugs.  
 
Чтобы в поисковике получить ссылки не просто по теме, а преимущественно ссылки на Microsoft, я начинаю строку поиска так: Microsoft Excel  
Затем пишу ключевые слова: копирование листов  
И чтобы акцентировать именно ошибки, связанные с копированием листов, добавляю: проблема  
 
В итоге строка поиска: Microsoft Excel копирование листов проблема  
 
В полученном списке смотрю прежде всего ссылки, содержащие microsoft.com  
Если страница отображается в автоматическом русском переводе, то в конце добавляю /en или меняю /ru на /en
Страницы: 1 2 След.
Наверх