Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Пн Авг 20, 2012 17:25 Заголовок сообщения: Макрос: копирование листа на следующий (Exсel) |
|
|
Всем доброго дня!
Прошу помощи в написании макроса для копирования содержимого листа на другой лист в Excel.
Столкнулся с такой задачей впервые, поэтому просьба критиковать максимально развернуто
Код: |
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), но дальше этого дело не идет, прерывается ошибкой.
Пока, конкретных предположений на счет источника ошибки у меня нет, поэтому хотелось бы с вашей помощью разобраться |
|
Вернуться к началу |
|
|
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Пт Авг 24, 2012 17:06 Заголовок сообщения: |
|
|
Эх.. ну что, все в отпусках? |
|
Вернуться к началу |
|
|
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 |
В общем поэкспериментируйте, а то навскидку ошибка не очевидна. Удачи! |
|
Вернуться к началу |
|
|
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Чт Сен 06, 2012 14:48 Заголовок сообщения: |
|
|
Спасибо, пробовал разные варианты прежде чем писать сюда
Сейчас задача немного изменилась: вместе с копированием необходимо использовать процедуру создания нового листа, т.к. имеющихся 3-х по умолчанию недостаточно. |
|
Вернуться к началу |
|
|
zhenya17
Зарегистрирован: 04.02.2009 Сообщения: 190 Откуда: Кемерово
|
Добавлено: Пт Сен 14, 2012 10:25 Заголовок сообщения: |
|
|
Mikhail писал(а): | Спасибо, пробовал разные варианты прежде чем писать сюда
Сейчас задача немного изменилась: вместе с копированием необходимо использовать процедуру создания нового листа, т.к. имеющихся 3-х по умолчанию недостаточно. | Так, и что теперь останавливает?
Ниже пример добавления листа...
Код: | 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;
...
|
|
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|