|
04.06.2007, 18:32 | #1 |
Постигающий
|
Копирование листов в Excel
Здравствуйте , уважаемые...
задача: "выводить отчет по кассовым операциям в Excel отдельной страницей на каждый день". проблема: неизвестно, как можно скопировать шаблон одного из листов, чтоб потом в него выводить данные за следующий день. Подскажите пожалуйста.Заранее спасибо. |
|
04.06.2007, 18:49 | #2 |
Moderator
|
Ну, программно создать копию листа Excel на базе существующего в той же книге - дело не такое уж и хитрое.
Сложнее будет, если у вас вывод идет не тупо в ячейки с адресами типа A1, B1, а в именованные диапазоны (с именами уровня книги)... Это какой-то стандартный отчет из папки Template? P.S. Зайдём с другого конца. Вам же, наверное, не до бесконечности нужно будет собирать эти дни в одном файле? Подозреваю, что дело ограничится месяцем. Заготовьте вручную (или несложным макросом на VBA) 31 страницу в файле-шаблоне. С именами листов от "Day1" от "Day31". В конце месяца кассир вручную удалит листы неиспользованных выходных или тех дней месяца, которые не существуют в этом месяце (например, 29-31 в феврале). Можно, кстати и программно удалить. Это существенно легче, чем вставлять в нужном порядке (т.е. полностью справедлив принцип "ломать - не строить" ) P.S.2. Насчет именованных диапазонов я несколько погорячился. Так что, если используются они - не бойтесь. Всё будет нормально при копировании. На каждом новом листе будут создаваться такие же имена, как на листе-источнике, но с локальной видимостью на новом листе. При этом перед выводом очередного дня вам нужно будет сначала позиционироваться на этот лист в файле. |
|
04.06.2007, 19:17 | #3 |
Постигающий
|
Как раз таки создание копии листа и является камнем преткновения модифицируется стандартный отчет RCashBook и шаблон для него не стандартный. К сожалению пока что вариант с 31 копией листов не может быть выбран как окончательный.Подскажите как же элегантнее поступить?
|
|
04.06.2007, 19:36 | #4 |
Moderator
|
Цитата:
Код: Sub VBAmacro_Create31days() Dim newBook As Workbook Dim currSheet As Worksheet Dim iDay As Integer Set newBook = Workbooks.Add 'например, пусть самый первый лист книги - это наш лист-шаблон Set currSheet = newBook.Worksheets(1) currSheet.Name = "DayTemplate" 'также для примера создадим на шаблоне именованный диапазон MyRangeA1 с областью видимости только на этом листе newBook.Names.Add Name:="DayTemplate!MyRangeA1", RefersTo:="=DayTemplate!$A$1" For iDay = 1 To 31 currSheet.Copy after:=currSheet Set currSheet = ActiveSheet currSheet.Name = "Day" & CStr(iDay) Next iDay 'теперь можно встать на любой лист и, нажав F5 и выбрав MyRangeA1, убедиться, что курсор прыгает в ячейку A1 именно на этом листе End Sub |
|
04.06.2007, 19:58 | #5 |
Постигающий
|
Спасибо,конечно..Если что,использую ваш макросец...А вот из аксапты никак не получается сделать копию примерно так:
WorkSheet=Worksheets.Item(1); WorkSheetBodyCopy=WorkSheetBody.Copy(). |
|
04.06.2007, 20:10 | #6 |
Moderator
|
Вот тот же размножитель на X++:
X++: static void Create31days(Args _args) { COM xlApp, wbks, wbk, wkss, currSheet, names; int iDay; COMVariant dummy = new COMVariant(); xlApp = new COM('Excel.Application'); xlApp.Visible(true); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); currSheet = wkss.Item(1); currSheet.Select(); currSheet.Name('DayTemplate'); names = wbk.Names(); names.Add( 'DayTemplate!MyRangeA1', '=DayTemplate!$A$1' ); // также для примера создадим локальный именованный диапазон dummy.noValue(); for (iDay=1; iDay<= 31; iDay++) { currSheet.Copy( dummy, currSheet ); // вот создание копии текущего листа после текущего листа currSheet = xlApp.ActiveSheet(); currSheet.Name(strfmt('Day%1',iDay)); } } |
|
|
За это сообщение автора поблагодарили: Arahnid (1), Андрей К. (1). |
06.08.2007, 13:49 | #7 |
Участник
|
а у меня выдает ошибку
Метод 'Copy' в COM-объекте класса 'Sheets' возвратил код ошибки 0x80010105 (<неизвестно>), который означает: <неизвестно>. Что делать? |
|
06.08.2007, 15:58 | #8 |
Moderator
|
хм... т.е. джоб Create31days в исходном виде запускаете и не работает? А какие у вас версии Axapta и Excel?
|
|
07.08.2007, 08:04 | #9 |
Участник
|
Axapta 3.0, Excel 2003
|
|
07.08.2007, 08:08 | #10 |
Участник
|
Если делать средствами класса ComExcelDocument_RU методом insertSheet то ошибка выдаеться такая же...
|
|
07.08.2007, 09:21 | #11 |
Moderator
|
А какая Windows и какой ее Service Pack?
А то, например, в Список ошибок, исправленных в пакете обновления Microsoft Windows 2000 Service Pack 2 есть тема Passing IStorage Pointer to Local COM Server and Calling IStorage::CopyTo May Result in "0x80010105 (RPC_E_SERVERFAULT)" Посмотрите еще в сети информацию по теме ошибка 0x80010105. |
|
08.08.2007, 08:32 | #12 |
Участник
|
Спасибо это помогло
|
|
30.08.2007, 08:44 | #13 |
Постигающий
|
ВСЕ ИЗ-ЗА КАСПЕРСКОГО!!!!
|
|
Теги |
excel, законченный пример, программно, скопировать лист, экспорт |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|