|
|
#1 |
|
Постигающий
|
Здравствуйте , уважаемые...
задача: "выводить отчет по кассовым операциям в Excel отдельной страницей на каждый день". проблема: неизвестно, как можно скопировать шаблон одного из листов, чтоб потом в него выводить данные за следующий день. Подскажите пожалуйста.Заранее спасибо. |
|
|
|
|
#2 |
|
Moderator
|
Ну, программно создать копию листа Excel на базе существующего в той же книге - дело не такое уж и хитрое.
Сложнее будет, если у вас вывод идет не тупо в ячейки с адресами типа A1, B1, а в именованные диапазоны (с именами уровня книги)... Это какой-то стандартный отчет из папки Template? P.S. Зайдём с другого конца. Вам же, наверное, не до бесконечности нужно будет собирать эти дни в одном файле? Подозреваю, что дело ограничится месяцем. Заготовьте вручную (или несложным макросом на VBA) 31 страницу в файле-шаблоне. С именами листов от "Day1" от "Day31". В конце месяца кассир вручную удалит листы неиспользованных выходных или тех дней месяца, которые не существуют в этом месяце (например, 29-31 в феврале). Можно, кстати и программно удалить. Это существенно легче, чем вставлять в нужном порядке (т.е. полностью справедлив принцип "ломать - не строить" )P.S.2. Насчет именованных диапазонов я несколько погорячился. Так что, если используются они - не бойтесь. Всё будет нормально при копировании. На каждом новом листе будут создаваться такие же имена, как на листе-источнике, но с локальной видимостью на новом листе. При этом перед выводом очередного дня вам нужно будет сначала позиционироваться на этот лист в файле. |
|
|
|
|
#3 |
|
Постигающий
|
Как раз таки создание копии листа и является камнем преткновения
модифицируется стандартный отчет RCashBook и шаблон для него не стандартный. К сожалению пока что вариант с 31 копией листов не может быть выбран как окончательный.Подскажите как же элегантнее поступить?
|
|
|
|
|
#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 |
|
|
|
|
#5 |
|
Постигающий
|
Спасибо,конечно..Если что,использую ваш макросец...А вот из аксапты никак не получается сделать копию
примерно так:WorkSheet=Worksheets.Item(1); WorkSheetBodyCopy=WorkSheetBody.Copy(). |
|
|
|
|
#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). | |
|
|
#7 |
|
Участник
|
а у меня выдает ошибку
Метод 'Copy' в COM-объекте класса 'Sheets' возвратил код ошибки 0x80010105 (<неизвестно>), который означает: <неизвестно>. Что делать? |
|
|
|
|
#8 |
|
Moderator
|
хм... т.е. джоб Create31days в исходном виде запускаете и не работает? А какие у вас версии Axapta и Excel?
|
|
|
|
|
#9 |
|
Участник
|
Axapta 3.0, Excel 2003
|
|
|
|
|
#10 |
|
Участник
|
Если делать средствами класса ComExcelDocument_RU методом insertSheet то ошибка выдаеться такая же...
|
|
|
|
|
#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. |
|
|
|
|
#12 |
|
Участник
|
Спасибо это помогло
|
|
|
|
|
#13 |
|
Постигающий
|
ВСЕ ИЗ-ЗА КАСПЕРСКОГО!!!!
|
|
|
| Теги |
| excel, законченный пример, программно, скопировать лист, экспорт |
|
|
|