Excel. Потеря ActiveSheet - VB
Формулировка задачи:
доброго времени суток, уважаемые
Подскажите пожалуйста существуют ли приемы условно говоря всех объектов Excel и заполнения только конкретного экземпляра?
Ситуация следущая: Имеется приложение, которое по кнопке выводит пользователю отчет с форматированием не только шапки, но и всего объема данных (условно говоря секционирование строк + форматирование по центру в первом столбце каждой секции)
в зависимости от объема данных отчет может заполняться до 50 секунд
В это время пользователь хочет работать в другом (своем) экземпляре Excel, и как только он позиционирует курсор на своем экселевом файле, то теряется ссылка на ActiveSheet, ну и возникает ошибка "Application-defined or object-defined error"
выгружать данные через буфер - не вариант, потому как не понимаю как можно будет задать указанное форматирование.
собственно, может ли кто-нибудь помочь советом по вопросу блокировки всех экземпляров Excel или поделиться опытом в случае удачного решения описанной проблемы.
_________________________________
Подскажите пожалуйста существуют ли приемы условно говоря всех объектов Excel и заполнения только конкретного экземпляра?
Ситуация следущая: Имеется приложение, которое по кнопке выводит пользователю отчет с форматированием не только шапки, но и всего объема данных (условно говоря секционирование строк + форматирование по центру в первом столбце каждой секции)
в зависимости от объема данных отчет может заполняться до 50 секунд
В это время пользователь хочет работать в другом (своем) экземпляре Excel, и как только он позиционирует курсор на своем экселевом файле, то теряется ссылка на ActiveSheet, ну и возникает ошибка "Application-defined or object-defined error"
выгружать данные через буфер - не вариант, потому как не понимаю как можно будет задать указанное форматирование.
собственно, может ли кто-нибудь помочь советом по вопросу блокировки всех экземпляров Excel или поделиться опытом в случае удачного решения описанной проблемы.
_________________________________
Решение задачи: «Excel. Потеря ActiveSheet»
textual
Листинг программы
<font color="blue">Sub</font> RollingData() <font color="00AA00">'</font> <font color="00AA00">' Макрос1 Макрос</font> <font color="00AA00">' Макрос записан 14.01.2009 (user)</font> <font color="00AA00">'</font> <font color="00AA00">'</font> <font color="blue">Dim</font> sCurrentFiltRange <font color="blue">As</font> <font color="blue">String</font> <font color="blue">Dim</font> r <font color="blue">As</font> Range <font color="blue">Dim</font> s <font color="blue">As</font> Worksheet, sh <font color="blue">As</font> Worksheet, shOut <font color="blue">As</font> Worksheet, w <font color="blue">As</font> Workbook, w1 <font color="blue">As</font> Workbook <font color="blue">Dim</font> vPriznak <font color="blue">As</font> Variant <font color="blue">Dim</font> vMonth <font color="blue">As</font> Variant <font color="blue">Dim</font> vGroup <font color="blue">As</font> Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual <font color="blue">Set</font> w = Application.ActiveWorkbook <font color="blue">Set</font> sh = Worksheets(<font color="teal">"филиал"</font>) sCurrentFiltRange = sh.AutoFilter.Range.Address <font color="blue">Set</font> w1 = Application.Workbooks.Add Application.DisplayAlerts = False w1.PrecisionAsDisplayed = True w1.Worksheets(<font color="teal">"Лист1"</font>).Delete w.Worksheets(<font color="teal">"Результат"</font>).Delete Application.DisplayAlerts = True <font color="blue">Set</font> s = w1.Worksheets.Add s.<font color="blue">Name</font> = <font color="teal">"Лист1"</font> <font color="blue">Set</font> s = <font color="blue">Nothing</font> <font color="blue">Set</font> s = w.Worksheets.Add s.<font color="blue">Name</font> = <font color="teal">"Результат"</font> <font color="00AA00">' Получаем список уникальных комбинаций из</font> <font color="00AA00">' признак филиал-Укрнафта или ещё какой-то,</font> <font color="00AA00">' месяца оплаты, номера платёжного поручения,</font> <font color="00AA00">' группы, вида и суммы оплаты</font> <font color="blue">Set</font> r = Worksheets(<font color="teal">"Лист1"</font>).Range(<font color="teal">"a1"</font>) sh.Range(<font color="teal">"P:U"</font>).AdvancedFilter xlFilterCopy, , r, True Application.DisplayAlerts = False w1.PrecisionAsDisplayed = False DoEvents w1.PrecisionAsDisplayed = True vGroup = r.Range(<font color="teal">"a2:F"</font> + CStr(r.SpecialCells(xlCellTypeLastCell).Row - <font color="darkblue"><b>1</b></font>)).Value2 Application.DisplayAlerts = True w.Activate s.<font color="blue">Select</font> <font color="blue">Dim</font> iPriz <font color="blue">As</font> <font color="blue">Long</font>, iMonth <font color="blue">As</font> <font color="blue">Long</font>, iGr <font color="blue">As</font> <font color="blue">Long</font>, i <font color="blue">As</font> <font color="blue">Long</font>, nCurrRow <font color="blue">As</font> <font color="blue">Long</font>, bFirst <font color="blue">As</font> <font color="blue">Boolean</font> nCurrRow = <font color="darkblue"><b>2</b></font> <font color="blue">Dim</font> ar <font color="blue">As</font> Areas <font color="blue">For</font> iGr = LBound(vGroup) <font color="blue">To</font> UBound(vGroup) <font color="blue">With</font> sh.Range(sCurrentFiltRange) .AutoFilter Field:=<font color="darkblue"><b>16</b></font>, Criteria1:=CStr(vGroup(iGr, <font color="darkblue"><b>1</b></font>)) <font color="00AA00">'<font color="teal">"январь"</font></font> .AutoFilter Field:=<font color="darkblue"><b>17</b></font>, Criteria1:=CStr(vGroup(iGr, <font color="darkblue"><b>2</b></font>)) <font color="00AA00">'<font color="teal">"филиал"</font></font> .AutoFilter Field:=<font color="darkblue"><b>18</b></font>, Criteria1:=CStr(vGroup(iGr, <font color="darkblue"><b>3</b></font>)) <font color="00AA00">'№ платежки</font> .AutoFilter Field:=<font color="darkblue"><b>19</b></font>, Criteria1:=CStr(vGroup(iGr, <font color="darkblue"><b>4</b></font>)) <font color="00AA00">'<font color="teal">"группа"</font></font> .AutoFilter Field:=<font color="darkblue"><b>20</b></font>, Criteria1:=CStr(vGroup(iGr, <font color="darkblue"><b>5</b></font>)) <font color="00AA00">'<font color="teal">"статья"</font></font> .AutoFilter Field:=<font color="darkblue"><b>21</b></font>, Criteria1:=Replace(Trim(Format(vGroup(iGr, <font color="darkblue"><b>6</b></font>), <font color="teal">"#,##0.00"</font>)), <font color="teal">","</font>, <font color="teal">"."</font>) <font color="00AA00">'w1.Worksheets(<font color="teal">"Лист1"</font>).Cells(iGr + 1, 5) 'Trim(Format(vGroup(iGr, 5), <font color="teal">"#,##0.00"</font>)) '<font color="teal">"62,76"</font></font> <font color="00AA00">'DoEvents</font> <font color="blue">For</font> <font color="blue">Each</font> r <font color="blue">In</font> sh.Range(sCurrentFiltRange).SpecialCells(xlCellTypeVisible).Areas i = i + r.Rows.Count <font color="00AA00">' .SpecialCells(xlCellTypeVisible).Rows.Count</font> <font color="blue">Next</font> r <font color="blue">If</font> i > <font color="darkblue"><b>1</b></font> <font color="blue">Then</font> bFirst = True <font color="blue">For</font> <font color="blue">Each</font> r <font color="blue">In</font> sh.Range(sCurrentFiltRange).SpecialCells(xlCellTypeVisible).Areas <font color="blue">If</font> r.Rows.Count > <font color="darkblue"><b>1</b></font> <font color="blue">Or</font> <font color="blue">Not</font> bFirst <font color="blue">Then</font> r.Rows(<font color="darkblue"><b>1</b></font> + -<font color="darkblue"><b>1</b></font> * CLng(bFirst)).Copy s.<font color="blue">Select</font> s.Rows(nCurrRow).<font color="blue">Select</font> s.Paste s.Cells(nCurrRow, <font color="darkblue"><b>21</b></font>).Value = <font color="teal">"="</font> + Replace(CStr(s.Cells(nCurrRow, <font color="darkblue"><b>21</b></font>).Value), <font color="teal">","</font>, <font color="teal">"."</font>) + <font color="teal">"*"</font> + CStr(i - <font color="darkblue"><b>1</b></font>) s.Cells(nCurrRow, <font color="darkblue"><b>31</b></font>).Value = CStr(i - <font color="darkblue"><b>1</b></font>) nCurrRow = nCurrRow + <font color="darkblue"><b>1</b></font> <font color="blue">Exit</font> <font color="blue">For</font> <font color="blue">Else</font> bFirst = False <font color="blue">End</font> <font color="blue">If</font> <font color="blue">Next</font> r <font color="blue">Else</font> i = i <font color="blue">End</font> <font color="blue">If</font> Debug.<font color="blue">Print</font> i - <font color="darkblue"><b>1</b></font>, Round(CDbl(vGroup(iGr, <font color="darkblue"><b>6</b></font>)), <font color="darkblue"><b>2</b></font>), CStr(vGroup(iGr, <font color="darkblue"><b>1</b></font>)), CStr(vGroup(iGr, <font color="darkblue"><b>2</b></font>)), CStr(vGroup(iGr, <font color="darkblue"><b>3</b></font>)), CStr(iGr) i = <font color="darkblue"><b>0</b></font> <font color="blue">End</font> <font color="blue">With</font> <font color="blue">Next</font> iGr <font color="00AA00">' Отключаем автофильтры</font> sh.ShowAllData <font color="00AA00">' Закрываем книгу с уникальным списком</font> sCurrentFiltRange = w1.<font color="blue">Name</font> <font color="blue">Set</font> w1 = <font color="blue">Nothing</font> Application.DisplayAlerts = False Application.Workbooks(sCurrentFiltRange).<font color="blue">Close</font> (False) Application.DisplayAlerts = True Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox <font color="teal">"Закончили!"</font> <font color="blue">End</font> <font color="blue">Sub</font>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д