Скопировать лист Excel через Delphi
6529
2
Все уже перерыл, ни одно решение не работает.
Пробовал это решение:

procedure TForm1.Button1Click(Sender: TObject);
var
Excel: Variant;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open('C:\book.xls');
Excel.Visible:=True;
Excel.Sheets:1:.Select;
Excel.Sheets:1:.Copy(Null, Excel.Sheets:1:);
end;

Ругается на Copy, говорит - ошибка на сервере.

RWorkBook.Sheets['Лист1'].Copy(RWorkBook.Sheets:1:)

тоже самое -- ошибка. Лист1 -- член группы не найден, если через индекс -- неверный индекс скажет.

Помогите, плиз, уже не знаю куда копать. Нужно N-ное количество раз скопировать один и тот же лист.

/PS: И зачем НГС самодеятельностью занимается??? Синтаксис проги показывает как смайлы! :шок:
Ivan_L
Самый действенный метод узнать, как надо написать - записать макрос на нужные действия, а потом посмотреть как это выглядит в редакторе VBA.
Ivan_L
Привожу, пару цитатт из справки Архангельского как работать с листами. Функцию копирования поищите как посоветовал Valico или же в хелпе к Вижуалбейсику в Excel-e
___________________________________

Класс сервера Excel

Модули Excel97, Excel2000, ExcelXP

Описание

Сервер COM класса TExcelApplication используется для управления из вашего приложения программой Excel. Сервер может использоваться в виде компонента, расположенного на странице Servers, или экземпляр сервера может создаваться программно во время выполнения. См. темы Работа с компонентами страницы библиотеки Servers, Работа с Microsoft Office как с серверами COM, в которых поясняется различие этих подходов, а также тему Адаптация к версии Microsoft Office, в которой рассмотрены вопросы адаптации приложения к версии Excel. Для работы со свойствами и методами серверов COM ознакомьтесь также с темой Обращение к свойствам и методам серверов COM.

Некоторые свойства и метода сервера вы можете найти по указанным выше ссылкам: Некоторые свойства и Некоторые методы. Методика получения информации по другим свойствам и методам изложена в теме Где найти свойства и методы серверов COM.

Среди множества свойств сервера следует отметить свойство ActiveWorkbook - активная рабочая книга Excel. Это объект ExcelWorkbook, реализующий интерфейс _Workbook и имеющий в свою очередь собственные свойства и методы.

Если в Excel открыто несколько книг, получить к ним доступ можно с помощью свойства Workbooks - собрания всех открытых в данный момент книг. Каждая книга представлена в этом собрании как объект ExcelWorkbook. К отдельной книге в массиве Workbooks можно обращаться по индексу. Например, ExcelApplication1.Workbooks:1: – это книга, которая была открыта первой.

Создание новой книги ExcelWorkbook и включение ее в собрание Workbooks осуществляется методом Add объекта Workbooks.

Объект ExcelWorkbook в свою очередь имеет собрание листов Worksheets. К отдельному листу – объекту ExcelWorkSheet можно получить доступ по индексу, как и в собрании Workbooks. В объекте ExcelWorkbook имеется свойство ActiveSheet – активный лист книги.

Создание нового листа ExcelWorkSheet и включение его в собрание Worksheets осуществляется методом Add объекта Worksheets.

Можно не создавать в приложении отдельных объектов для книги и листа, а работать с книгами и листами непосредственно через объект сервера. Но обычно все-таки удобнее создать такие объекты. В этом случае код получается более компактным и наглядным.

Создание объектов может выполняться тремя способами: с помощью компонентов страницы Servers, с помощью программного создания соответствующих объектов, и с помощью создания объектов интерфейсов.

При использовании компонентов вы должны поместить на форме компоненты TExcelWorkbook – рабочая книга, и – TExcelWorksheet – лист. Программное создание таких объектов, а заодно и программное создание объекта сервера, может выглядеть так:

var ExcelApplication1: TExcelApplication;

ExcelWorkbook1: TExcelWorkbook;

ExcelWorksheet1: TExcelWorkSheet;

...
// Создание объектов
ExcelApplication1 := TExcelApplication.Create(Self);
ExcelWorkbook1 := TExcelWorkbook.Create(Self);
ExcelWorksheet1 := TExcelWorkSheet.Create(Self);
... // Использование объектов
// Удаление объектов
ExcelApplication1.Free;
ExcelWorkbook1.Free;
ExcelWorksheet1.Free;


Остальное не зависит от того, используются компоненты или программно созданные объекты. Подключение объектов книги и листа к активной книге и листу сервера выполняется методом ConnectTo
, аргументом которого указывается объект сервера. Например:

ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);
ExcelWorksheet2.ConnectTo(
ExcelWorkbook2.ActiveSheet as ExcelWorksheet);

Во втором операторе используется операция as, чтобы привести интерфейс к требуемому типу.

Следующий оператор создает новую книгу и подключает к ней объект ExcelWorkbook1:
[/code]
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(
EmptyParam, LOCALE_USER_DEFAULT));

Тут использован метод Add объекта ExcelApplication1.Workbooks.

Несколько иначе выглядит работа с объектами интерфейсов:

var ExcelApplication1: TExcelApplication;
ExcelWorkbook1: ExcelWorkbook;
ExcelWorksheet1: ExcelWorkSheet;
...
ExcelApplication1 := TExcelApplication.Create(Self);
...
ExcelWorkbook1 := ExcelApplication1.Workbooks.Add(
EmptyParam, LOCALE_USER_DEFAULT);
ExcelWorksheet1 := ExcelWorkbook1.ActiveSheet;

Тут не требуется метод ConnectTo. Соответствующим переменным просто присваиваются значения интерфейсов объектов сервера.

Сервер Excel имеет также свойство Windows – коллекцию открытых окон. Метод Windows.Arrange позволяет упорядочить окна. Элементы Window коллекции Windows обеспечивают доступ к свойствам, описывающим отображение документа: свернутое, развернутое, разделенное, заголовок окна, полосы прокрутки.

Сервер Excel имеет свойство Dialogs, являющееся собранием объектов Dialog, которые соответствуют встроенным диалогам Word. Доступ к конкретному диалогу осуществляется через выражение вида

WordApplication1.Dialogs[WdWordDialog]

где константа WdWordDialog может принимать одно из предопределенных значений.
[/code]
 У объекта книги ExcelWorkbook сервера Excel TExcelApplication имеется свойство Worksheets -  собрание листов книги. Каждый лист представлен в этом собрании как объект ExcelWorksheet.

Worksheets - это объект (точнее, интерфейс Sheets), имеющий ряд свойств и методов. К конкретному листу из коллекции Worksheets можно обращаться по индексу или по имени. Например, следующие операторы открывают и активизируют первый лист книги, представленной объектом ExcelWorkbook1, передают указатель на этот лист в переменную интерфейса ExcelWorksheet1 и активизируют лист, т.е. выдвигают его на первый план в окне Excel:
[code]
ExcelWorksheet1 := ExcelWorkbook1.Worksheets[1] as
ExcelWorksheet;
ExcelWorksheet1.Activate(LOCALE_USER_DEFAULT);

Свойство Worksheets имеется также в объекте сервера. Это свойство относится к активной книге. Так что следующий оператор производит операции с активной книгой, открывая в ней лист, имя которого (например, "Лист1") задано в окне редактирования Edit1:

ExcelWorksheet1 := ExcelApplication1.
Worksheets[Edit1.Text] as ExcelWorksheet;
ExcelWorksheet1.Activate(LOCALE_USER_DEFAULT);

Если лист с заданным именем отсутствует в книге, будет генерироваться исключение. Так что если имеется подобная опасность, это исключение надо перехватить, например, следующим образом:
[/code]
try
ExcelWorksheet1 := ExcelApplication1.
Worksheets[Edit1.Text] as ExcelWorksheet;
ExcelWorksheet1.Activate(LOCALE_USER_DEFAULT);
except
ShowMessage('Не удалось открыть лист "' + Edit1.Text + '"');
end;
[/code]
Добавить новый лист в книгу можно методом Add объекта Worksheets:

function Add(Before: OleVariant; After: OleVariant;
Count: OleVariant; Type_: OleVariant;
lcid: Integer): IDispatch;

Параметры Before или After – это объект листа, перед которым или после которого осуществляется вставка. Обычно достаточно задать только один из этих параметров, а другой сделать равным EmptyParam. Если оба параметра равны EmptyParam, то новые листы вставляются перед текущим активным листом. Параметр Count указывает число вставляемых листов. Если этот параметр равен EmptyParam, то вставляется один лист. Параметр Type_ определяет тип вставки. При значении EmptyParam вставляется новый пустой лист.

Например, следующий код вставляет один новый лист перед активным листом активной книги и передает указатель на него в переменную ExcelWorksheet1:

ExcelWorksheet1 := ExcelApplication1.Worksheets.Add(
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, LOCALE_USER_DEFAULT) as ExcelWorksheet;

А следующий код вставляет два новых листа после третьего листа активной книги:

var After, Num: OleVariant;
...
After := ExcelApplication1.Worksheets[3];
Num := 2;
ExcelWorksheet1 := ExcelApplication1.Worksheets.Add(
EmptyParam,After,Num,EmptyParam,
LOCALE_USER_DEFAULT) as ExcelWorksheet;

Удалить лист из книги можно методом Delete:

ExcelWorksheet1.Delete(LOCALE_USER_DEFAULT);