AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.06.2007, 18:32   #1  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
? Копирование листов в Excel
Здравствуйте , уважаемые...
задача:
"выводить отчет по кассовым операциям в Excel отдельной страницей на каждый день".
проблема:
неизвестно, как можно скопировать шаблон одного из листов, чтоб потом в него выводить данные за следующий день.
Подскажите пожалуйста.Заранее спасибо.
Старый 04.06.2007, 18:49   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, программно создать копию листа Excel на базе существующего в той же книге - дело не такое уж и хитрое.
Сложнее будет, если у вас вывод идет не тупо в ячейки с адресами типа A1, B1, а в именованные диапазоны (с именами уровня книги)...
Это какой-то стандартный отчет из папки Template?

P.S. Зайдём с другого конца. Вам же, наверное, не до бесконечности нужно будет собирать эти дни в одном файле? Подозреваю, что дело ограничится месяцем. Заготовьте вручную (или несложным макросом на VBA) 31 страницу в файле-шаблоне. С именами листов от "Day1" от "Day31". В конце месяца кассир вручную удалит листы неиспользованных выходных или тех дней месяца, которые не существуют в этом месяце (например, 29-31 в феврале). Можно, кстати и программно удалить. Это существенно легче, чем вставлять в нужном порядке (т.е. полностью справедлив принцип "ломать - не строить" )

P.S.2. Насчет именованных диапазонов я несколько погорячился. Так что, если используются они - не бойтесь. Всё будет нормально при копировании. На каждом новом листе будут создаваться такие же имена, как на листе-источнике, но с локальной видимостью на новом листе. При этом перед выводом очередного дня вам нужно будет сначала позиционироваться на этот лист в файле.
Старый 04.06.2007, 19:17   #3  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Как раз таки создание копии листа и является камнем преткновения модифицируется стандартный отчет RCashBook и шаблон для него не стандартный. К сожалению пока что вариант с 31 копией листов не может быть выбран как окончательный.Подскажите как же элегантнее поступить?
Старый 04.06.2007, 19:36   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
К сожалению пока что вариант с 31 копией листов не может быть выбран как окончательный.
Ну это зря... Смотрите... А то я вам уже и макросик-размножитель слепил :
Код:
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  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Спасибо,конечно..Если что,использую ваш макросец...А вот из аксапты никак не получается сделать копию примерно так:
WorkSheet=Worksheets.Item(1);
WorkSheetBodyCopy=WorkSheetBody.Copy().
Старый 04.06.2007, 20:10   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Вот тот же размножитель на 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));
    }
}
В классе ComExcelDocument_RU есть метод insertSheet. Он включает и копирование тоже.
За это сообщение автора поблагодарили: Arahnid (1), Андрей К. (1).
Старый 06.08.2007, 13:49   #7  
Люда is offline
Люда
Участник
 
15 / 10 (1) +
Регистрация: 04.08.2005
Адрес: г.Екатеринбург
а у меня выдает ошибку
Метод 'Copy' в COM-объекте класса 'Sheets' возвратил код ошибки 0x80010105 (<неизвестно>), который означает: <неизвестно>.
Что делать?
Старый 06.08.2007, 15:58   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
хм... т.е. джоб Create31days в исходном виде запускаете и не работает? А какие у вас версии Axapta и Excel?
Старый 07.08.2007, 08:04   #9  
Люда is offline
Люда
Участник
 
15 / 10 (1) +
Регистрация: 04.08.2005
Адрес: г.Екатеринбург
Axapta 3.0, Excel 2003
Старый 07.08.2007, 08:08   #10  
Люда is offline
Люда
Участник
 
15 / 10 (1) +
Регистрация: 04.08.2005
Адрес: г.Екатеринбург
Если делать средствами класса ComExcelDocument_RU методом insertSheet то ошибка выдаеться такая же...
Старый 07.08.2007, 09:21   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А какая 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  
Люда is offline
Люда
Участник
 
15 / 10 (1) +
Регистрация: 04.08.2005
Адрес: г.Екатеринбург
Спасибо это помогло
Старый 30.08.2007, 08:44   #13  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
ВСЕ ИЗ-ЗА КАСПЕРСКОГО!!!!
Теги
excel, законченный пример, программно, скопировать лист, экспорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Копирование листов в Excel с шаблоном Zoe DAX: Программирование 8 20.11.2008 15:50
Копирование в Excel Михаил Петрович DAX: Программирование 4 15.02.2008 15:35
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Копирование из Грида в Excel ArturK DAX: Программирование 5 09.03.2004 19:55
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:02.