Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Макрос: копирование листа на следующий (Exсel)

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mikhail



Зарегистрирован: 16.08.2012
Сообщения: 177
Откуда: Москва

СообщениеДобавлено: Пн Авг 20, 2012 17:25    Заголовок сообщения: Макрос: копирование листа на следующий (Exсel) Ответить с цитатой

Всем доброго дня!
Прошу помощи в написании макроса для копирования содержимого листа на другой лист в Excel.
Столкнулся с такой задачей впервые, поэтому просьба критиковать максимально развернуто Smile

Код:

let sheet_ := 1; -- № листа шаблона

--создаем таблицу для данных
$if object_id('tempdb..#aktpfr') is not null drop table tempdb..#aktpfr;
create table #aktpfr
(
ntab varchar (30) NULL,
fname varchar (150) NULL,
sname varchar (255) NULL,
scode int NULL
);

insert into #aktpfr (ntab, fname, sname, scode)

select pl.num_tab, cd.full_name, st1.struct_name, st1.struct_code
from people as pl, card as cd, z_rep_pach as rp, z_pachka as p, structs as st, structs as st1
where rp.id_pachka = p.id
   and rp.auto_card = cd.auto_card
   and cd.auto_card = pl.auto_card
   and pl.struct_code = st.struct_code
   and st.struct_root = st1.struct_code
   and p.id = _pachka_ -- id пачки, на которой установлен курсор
order by 2;

--открываем шаблон
execute xocxfree{*};

Local PathTemplate;
alias PathTemplate := @@xReport(open USER_ПЕРЕДАЧА_СТРАХОВЫХ_ПФР.xlt);
if PathTemplate[''] = '' then {
 Error [\3Файл Шаблон отчета USER_ПЕРЕДАЧА_СТРАХОВЫХ_ПФР.xlt не найден!];
 con;
 --free _mib, *;
};

Excel.Application as Excel;
Excel.Visible=True;
Excel.Workbooks.Open(PathTemplate[""]);

VB {
Dim Ex
Dim Sh
};

VB {
Set Ex = GetObject(,"Excel.Application")
Set Sh = Ex.ActiveSheet
};

vb{
Dim n1V
};

vb{
Dim n2V
};


_begin:; -- точка возвращения GO TO

--выбираем max(struct_code) магазина из текущей пачки
select max(scode)
into :max_
from #aktpfr;


--выгружаем данные из временной таблицы в шаблон
stable @x
select ntab, fname, sname
from #aktpfr
where scode = max_
order by 2;

let n := 9; -- № строки в шаблоне для начала выгрузки

scan @x
execute {
Excel.ActiveWorkbook.sheets(sheet_).cells(n, 1) = @x:1[''];
Excel.ActiveWorkbook.sheets(sheet_).cells(n, 2) = @x:2[''];
Excel.ActiveWorkbook.sheets(sheet_).cells(n, 5) = @x:3[''];
let n := n + 1;
};

--рисуем рамку в Excel
let n := n-1;
   Alias vb.n1V := n;
   vb {
            Sh.Range(Sh.Cells(9,1),Sh.Cells(n1V,5)).Select
                Ex.Selection.wraptext=true
                         Ex.Selection.Borders(5).LineStyle = -4142
                         Ex.Selection.Borders(6).LineStyle = -4142
                With Ex.Selection.Borders(7)
                      .Weight = 2
                End With
                With Ex.Selection.Borders(8)
                      .Weight = 2
                End With
                With Ex.Selection.Borders(9)
                      .Weight = 2
                End With
                With Ex.Selection.Borders(10)
                      .Weight = 2
                End With
                With Ex.Selection.Borders(11)
                      .Weight = 2
                End With
                With Ex.Selection.Borders(12)
                      .Weight = 2
                End With
   };
--копируем шапку отчета на следующий лист
let sheet_ := sheet_ + 1;
vb {
    Sh.Range(Sh.Cells(1,1),Sh.Cells(6,5)).Select
   Ex.Selection.Copy
   Ex.ActiveWorkbook.sheets(sheet_).Select
   Ex.ActiveSheet.Paste
};

delete #aktpfr where scode = max_;

if exists (select scode from #aktpfr)
then {goto _begin};

CON Открытие Excel ...;
con;
execute xOcxFree(*); -- Закрыть программу EXCEL
 
--set Excel = Nothing;
ALIAS :_Result=-1;  free mif, *;


При выполнении происходит заполнение первого листа данными из #akfpfr, выделение и копирование шапки (проврил ctrl+v), но дальше этого дело не идет, прерывается ошибкой.

Пока, конкретных предположений на счет источника ошибки у меня нет, поэтому хотелось бы с вашей помощью разобраться Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mikhail



Зарегистрирован: 16.08.2012
Сообщения: 177
Откуда: Москва

СообщениеДобавлено: Пт Авг 24, 2012 17:06    Заголовок сообщения: Ответить с цитатой

Эх.. ну что, все в отпусках? Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Сб Сен 01, 2012 21:56    Заголовок сообщения: Ответить с цитатой

После копирования шапки у Вас написано
Цитата:
delete #aktpfr where scode = max_
, попробуйте всё-таки delete FROM #aktpfr where scode = max_.
Или что за ошибка выдаётся?[/code]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mikhail



Зарегистрирован: 16.08.2012
Сообщения: 177
Откуда: Москва

СообщениеДобавлено: Пн Сен 03, 2012 11:53    Заголовок сообщения: Ответить с цитатой

zhenya17, привет!
Каюсь, что не описал подробнее ошибку и ввел в заблуждение.
Ошибка следующая:
Код:

Source:'Microsoft VBScript compilation error'
File:" Line:4 Char:1
Error:0 'Expected statement'

-- Ex.sheets(sheet_).activate


Если включить в цикл блок отвечающий за открытие шаблона, то весь отчет работает исправно и корректно выгружает данные, но при этом открывается не один, а несколько отдальных файлов. А хотелось бы попробовать все поместить в один, но на разных листах.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Ср Сен 05, 2012 22:33    Заголовок сообщения: Ответить с цитатой

Попробуйте вместо
Цитата:
Ex.ActiveWorkbook.sheets(sheet_).Select
написать
Цитата:
Ex.sheets(sheet_).Select

Также в качестве эксперимента можно попробовать заменить sheet_ на номер листа, т.е.
Цитата:
Ex.sheets(2).Select

В общем поэкспериментируйте, а то навскидку ошибка не очевидна. Удачи! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mikhail



Зарегистрирован: 16.08.2012
Сообщения: 177
Откуда: Москва

СообщениеДобавлено: Чт Сен 06, 2012 14:48    Заголовок сообщения: Ответить с цитатой

Спасибо, пробовал разные варианты прежде чем писать сюда Smile
Сейчас задача немного изменилась: вместе с копированием необходимо использовать процедуру создания нового листа, т.к. имеющихся 3-х по умолчанию недостаточно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Пт Сен 14, 2012 10:25    Заголовок сообщения: Ответить с цитатой

Mikhail писал(а):
Спасибо, пробовал разные варианты прежде чем писать сюда Smile
Сейчас задача немного изменилась: вместе с копированием необходимо использовать процедуру создания нового листа, т.к. имеющихся 3-х по умолчанию недостаточно.
Так, и что теперь останавливает? Smile
Ниже пример добавления листа...

Код:
Excel.Application as Excel;
Excel.Visible = True;
Excel.Workbooks.Add();

local vb.Excel==&Excel; -- передача в VBScript
vb{
  if Excel.Sheets.Count < 2 then
    Excel.Sheets.Add()
  end if
  Excel.Sheets(1).Select
  Excel.Sheets(1).Name = "После 1967г.р."
  With Excel.ActiveSheet.PageSetup
    .Orientation = 2
    .LeftMargin = Excel.InchesToPoints(0.275590551181102)
    .RightMargin = Excel.InchesToPoints(0.275590551181102)
    .TopMargin = Excel.InchesToPoints(0.393700787401575)
    .BottomMargin = Excel.InchesToPoints(0.393700787401575)
    .HeaderMargin = Excel.InchesToPoints(0)
    .FooterMargin = Excel.InchesToPoints(0)
    .Zoom = 90
  End With
};


Let Row = 1;
Excel.Cells(Row,1).Value = 'Таб. №';
Excel.Columns(1).ColumnWidth = 8;

Excel.Cells(Row,2).Value = 'Фамилия Имя Отчество';
Excel.Columns(2).ColumnWidth = 50;

Excel.Cells(Row,3).Value = 'Месяц';
Excel.Columns(3).ColumnWidth = 8;

Excel.Cells(Row,4).Value = 'Дата рождения';
Excel.Columns(4).ColumnWidth = 10;

Excel.Cells(Row,5).Value = 'Выплаты ВСЕГО';
Excel.Columns(5).NumberFormat = '#,##0.00';
Excel.Columns(5).ColumnWidth = 15;
...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU