Delphi excel пустые строки

Dr@gon.

19 / 19 / 9

Регистрация: 22.11.2010

Сообщений: 321

1

11.12.2013, 07:10. Показов 4281. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте! Есть такой код который по нажатию на CheckBox добавляет значение в ячейку в Excel и при снятии галочки очищает эту же запись :

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.sCheckBox23Click(Sender: TObject);
begin
if (Sender as TsCheckBox).Checked then
 begin
    Edt1.Text := IntToStr(StrToInt(Edt1.Text) + (Sender as TsCheckBox).Tag);
    Excel.Range['A2']:= sCheckBox23.Caption;
    Excel.Range['B2']:= sCheckBox23.Tag;
 end
  else
   begin
    Edt1.Text := IntToStr(StrToInt(Edt1.Text) - (Sender as TsCheckBox).Tag);
    Excel.Range['A2:B2'].Select;
    Excel.Selection.Clear;
   end;
end;

При отжатии CheckBox в документе Excel остаются пустые строки как их можно удалить?

Добавлено через 22 часа 25 минут

Не по теме:

Так все же есть же способ какой нибудь помогите



0



MaximFegorsk

32 / 53 / 9

Регистрация: 05.12.2013

Сообщений: 261

11.12.2013, 08:27

2

Строку можно удалить так

Delphi
1
2
row := XL.WorkBooks[1].WorkSheets['Отчет'].Rows;
row.Rows[1].Delete;



0



19 / 19 / 9

Регистрация: 22.11.2010

Сообщений: 321

11.12.2013, 08:29

 [ТС]

3

спасибо! Но главный вопрос как определить что она пустая



0



32 / 53 / 9

Регистрация: 05.12.2013

Сообщений: 261

11.12.2013, 09:06

4

С такого рода проверкой не сталкивался, но как вариант можно проверять конкретные ячейки в интересующей строке. Например ячейку А и В, если опираться на Ваш пример.



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

11.12.2013, 10:43

5

Dr@gon., попробуйте так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses ComObj;
..........
const xlUp=3;
var
 ExApp, Sheet, FirstCell : Variant;
begin
ExApp :=CreateOleObject('Excel.Application');
ExApp.Workbooks.Open(FileName, False); //открываем книгу
 Sheet := ExApp.Workbooks[1].Worksheets[1]; //ссылка на рабочий лист
FirstCell := Sheet.Cells[1, 1]; //первая ячейка листа
 FirstCell.Activate; 
 if VarIsEmpty(FirstCell.Value) then //если ячейка пустая
   Sheet.Rows[1].Delete(xlUp); //удаляем строку
 While Sheet.Cells.CurrentRegion.Rows.Count < Sheet.Usedrange.Rows.Count do //до конца листа
begin
   Sheet.Rows[Sheet.Cells.CurrentRegion.Rows.Count + 1].Delete(xlUp);
end;
  Sheet := Unassigned;
  ExApp.Quit; // отвязываем Excel 
  ExApp :=Unassigned;
end;



0



 
Glivera ©
 
(2006-05-28 23:15)
[0]

Из своего приложения открываю Excel»евский файл (прайс), нахожу количество строк, но файл может содержать и пустые строки. Вопрос заключается в том, как мне удалить эти строки?


 
Palladin ©
 
(2006-05-28 23:22)
[1]

Проще провести экспорт в csv и обработать в текстовом виде.


 
Glivera ©
 
(2006-05-28 23:40)
[2]

а по существу?


 
Palladin ©
 
(2006-05-28 23:54)
[3]


> Glivera ©   (28.05.06 23:40) [2]

а что по существу? сохранение в текстовом файле это не по существу?


 
sniknik ©
 
(2006-05-29 00:17)
[4]

не нравится предложенный вариант с выгрузкой? аргументируйте… по существу.

а то такое чуство, что вариант не понят. и нет гарантий, что другое «поймется»… не хочется «метать бисер» вхолостую.

p.s. в зависимости от способа открытия есть возможность, что пустые строки не совсем пустые… просто неопределенный тип отбрасывается (бывает).


 
DevilDevil ©
 
(2006-05-29 02:23)
[5]

1) открываешь нужный файл
2) создаёшь новый лист Excel
3) копируешь заголовок из старого в новый
4) перебираешь все строки старой таблицы, если не пустая, то заносишь в новую
5) закрываешь старый лист, сохраняешь новый под старым именем

Только это приходит в голову… Может у листа есть метод типа Delete, попробуй


 
evvcom ©
 
(2006-05-29 08:27)
[6]


> заключается в том, как мне удалить эти строки?

А зачем? Если юзер не умеет работать с Excel, пусть получает то, что наработал. Ну а ты его научи, как надо.


 
_RusLAN ©
 
(2006-05-29 10:16)
[7]

Glivera ©   (28.05.06 23:15)
Сначала надо поределится что такое «пустые строки» и  от этого плясать.
Excel считает что строка заполнена, даже если в ней меняли только форматирование.
Сначала надо определить что строка пустая, а потом удалить:
Удаляется типа так (макрос)
   Rows(«4:5»).Select
   Selection.Delete Shift:=xlUp


 
umbra ©
 
(2006-05-29 13:30)
[8]

если считать пустой строкой строку, ни в одной ячейке нет значения, то можно использовать что-то вроде

procedure TForm1.Button2Click(Sender: TObject);
var
 mysheet, firstcell : Variant;

begin
 mysheet := FXLApp.Workbooks[1].Worksheets[1];
 firstcell := mysheet.Cells[1, 1];
 firstcell.Activate;
 if VarIsEmpty(firstcell.Value) then
   mySheet.Rows[1].Delete(xlUp);
 while mySheet.Cells.CurrentRegion.Rows.Count < mySheet.Usedrange.Rows.Count do
   mySheet.Rows[mySheet.Cells.CurrentRegion.Rows.Count + 1].Delete(xlUp);
 firstcell := Unassigned;
 mysheet := Unassigned;
end;


 
Glivera ©
 
(2006-05-31 00:52)
[9]

> umbra
Спасибо большое… самое то…
Все работает, все отлично.. ;)


> Как узнать, закончились ли строки в excel файле? 

:(

   

Опции темы

sgentstuff
Дата 10.7.2006, 09:52 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

как организовать цикл до конца строк? 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 10.7.2006, 11:09 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

http://forum.vingrad.ru/index.php?showtopi…34&view=all 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 10.7.2006, 11:30 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

там про word есть но про excel я не нашел 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 10.7.2006, 12:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

плохо смотрел… smile

Добавлено @ 12:41 
там аж 2 варианта:

Цитата(Albinos_x @  21.2.2006,  16:22 Найти цитируемый пост)
 Точно также как и с WordApplication, решил я разобраться с компанентой ExcelApplication… Ну что ж приступим:

Немного теории

Цитата(Albinos_x @  21.2.2006,  16:46 Найти цитируемый пост)
…Количество строк и столбцов

Тут тоже существует несколько вариантов:

1.
код Pascal/Delphi    
…    
ExcelWorksheet1.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;    
// количество строк и столбцов    
Caption:=’Строк: ‘+inttostr(ExcelApplication1.ActiveCell.Row)+’ Столбцов: ‘+ inttostr(ExcelApplication1.ActiveCell.Column);    
…    

2. 
код Pascal/Delphi    
…    
// Количество столбцов    
caption:=inttostr(ExcelWorksheet1.UsedRange[0].Columns.Count );    
…    

Со строками по аналогии

Добавлено @ 12:42 
и пример ещё к тому же есть… 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
Akella
Дата 11.7.2006, 08:46 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 2
Всего: 329

Код

Var
 WorkSheet : _WorkSheet; //  определяем WorkSheet
 iLastRow:integer;
...

        WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
        // Получаем значение последней строки
        iLastRow:=(ex1.ActiveCell.Row)-1;

поищи по форуму, я выкладывал примеры работы с Excel`ем 

PM MAIL   Вверх
sgentstuff
Дата 11.7.2006, 13:27 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

мне нужно для нужной книги для нужного листа узнать кол-во строк
например вот так:

Код

max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[1].Columns.Count;

но так не работает!

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 11.7.2006, 15:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

В чём это выражается? 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 11.7.2006, 17:51 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

Я не испоьзую компоненту, а просто через ОЛЕ, как правильно записать получение количества строк?

Код

var
Excel:Variant;
max_rows:integer;
begin
max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[1].Columns.Count;
end;

на эту запись он выдает такую ошибку:
EOleSysError with message ‘Ivalid number of parameters’ 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 12.7.2006, 11:40 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

попробуй вот так:

Код

var    
Excel:Variant;    
max_rows:integer;    
begin    
max_rows:=Excel.WorkBooks[p+1].WorkSheets[1].UsedRange[0].Columns.Count;    
end;

Что за 
[p+1]

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 12.7.2006, 12:10 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

с 

Код

UsedRange[0]

тоже самое
p+1  — это просто номер книги, в других местах с  p+1 все нормально, можешь у себя проверить как этот код работает, но только без компоненты ExcelAplication

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 12.7.2006, 14:03 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

попробуй так:

Код
...
WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];
max_rows:=WorkSheet.Cells.CurrentRegion.Rows.Count;
...

если не прокатит,то делай стандартным способом:

Код
...
    WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];
    WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;    
    max_rows := XLApp.ActiveCell.Row;
...

WorkSheet : OleVariant;

у последнего только один недостаток: если на странице стоит защита, то будет вылетать ошибка…

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 13.7.2006, 05:56 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

ура, это сработало, но к сожалению работает только если строки идут подподряд и между ними нету пропуска

Код

WorkSheet:=Excel.WorkBooks[p+1].WorkSheets[1];    
max_rows:=WorkSheet.Cells.CurrentRegion.Rows.Count;

а если вот так
ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6

ф1 ф2 ф3 ф4 ф5 ф6
ф1 ф2 ф3 ф4 ф5 ф6

то ответ будет 3 строки а не 6(вкл и пустую), как подсчитать количество, если есть пропуски? 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
sgentstuff
Дата 13.7.2006, 06:52 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

у меня много Excel файлов, в каждом не менее 30000 строк, перед обработкой каждогго файла мне нужно узнать количество строк чтобы знать до куда запускать цикл, но попадаются и пустые строки, даже не знаю что делать, может это как-то по другому можно сделать? нужна помощь! 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 13.7.2006, 09:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

сделай вторым способом… 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 13.7.2006, 13:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

вторым способом попробывал пишет

метод Activate из класса Range завершен не верно
в чем загвоздка? 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
sgentstuff
Дата 13.7.2006, 14:00 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

у меня excel 2000 может из-за этого? 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 13.7.2006, 19:10 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

нет не из-за этого… если посмотреть, то второй код применяется довольно давно и успешно… и если будешь искать примеры по инету, то почти везде найдёшь именно второй способ…

а ошибка возможно в строчках позже… 

на какой строчке ошибка вылезает? 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 05:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

ошибка именно на этой строке:
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 08:28 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

код в студию… 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 09:43 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

var

Код

i:integer;
begin
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:excelhi');
Excel.Workbooks.Open('D:excelhi2');
Excel.Visible := true;

for i:=1 to 4 do
begin
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
{$O-}
 max_rows := Excel.ActiveCell.Row;
{$O+}
end;

эта ошибка вылетает если открыты две книги как ы этом примере, если же открыть только одну книгу то все нормально, считает как надо, у меня в программе открыто несколько книг, что делать?

 Это сообщение отредактировал(а) Girder — 26.3.2007, 10:04

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
sgentstuff
Дата 14.7.2006, 10:47 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

ура получилось. просто нужно активировать книгу
Excel.WorkBooks[1].Activate;
тогда все работает нормально
Albinos_x — спасибо, выручил! 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 13:43 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

честно говоря по твоему коду ничего не понятно….

к примеру:

Код
...
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:excelhi');
Excel.Workbooks.Open('D:excelhi2');
Excel.Visible := true;
...

зачем открывать две книги… связь-то у тебя только со второй… ну да ладно… может код не весь…

Код
...
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
...

зато здесь мы возвращаемся к первой книге… тогда зачем вторая (?)…

и далее не понятно зачем в цикле четыре раза вычеслять количество строк на одном и том же листе?… 

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
Albinos_x
Дата 14.7.2006, 14:03 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

отсюда кстати и ошибка вылезала…

работал со второй книгой…

а число строк на листе пытался получить из первой книги…  

Это сообщение отредактировал(а) Albinos_x — 14.7.2006, 14:06

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 14:47 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 116
Регистрация: 13.9.2005

Репутация: нет
Всего: 1

отсюда кстати и ошибка вылезала…
работал со второй книгой…
а число строк на листе пытался получить из первой книги…  

ЭТО ТОЧНО, теперь все понятно! 

———————

Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  

PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 15:07 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

Удачи! smile  

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
oleg153
Дата 2.3.2007, 22:59 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет

Господа!
Подскажите пожалуйста, все что можно прочитать я перечитал и рад что у всех работает.
Но я потратил сутки но не смог добится номера последней заполненной строки на листе Excel.

Перепробовал все, но и в delphi7 и delphi 2006 (studio) одна и таже проблемма :
компилятор наотрез не понимает xlCellTypeLastCell.
И там и там ошибка Undeclired Identifire ‘xlCellTypeLastCell’. И все. Процесс умирает.

Я не понимаю в чем дело, ЧТО я не так пишу ???
Вот мой код , в таком виде он не работает:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

{$R *.dfm}

{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject);
var BookName1: string;
var j: integer;
begin
 // Выбираем файл базы.
 if OpenDialog1.Execute then
  begin
   BookName1:= OpenDialog1.FileName; // имя книги с полным путем
   //Запускаем Excel
   try
    //Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение
    Excel := GetActiveOleObject('Excel.Application');
    //Проверяем что открыта нужная книга
    for j:=1 to Excel.Workbooks.Count do
     begin
      if Excel.Workbooks.Item[j].FullName=BookName1 then break;
     end;
    // Выбираем WorkBook
    WorkBook := Excel.WorkBooks.Item[j];
   except
    //Запускаем Excel
    Excel := CreateOleObject('Excel.Application');
    //Открываем нужную книгу
    WorkBook := Excel.WorkBooks.Open(BookName1);
   end;
  Excel.Visible:=True;
  end
  else
   begin
    SysUtils.Beep;
    ShowMessage('Не могу открыть Excel!');
    Exit;
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if not VarIsEmpty(Excel) then
  begin
   Excel.Quit;
   Excel := Unassigned;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var X,Y:integer;
begin
  WorkSheet:=WorkBook.WorkSheets[1];
  WorkSheet.Activate;
  WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  X := Excel.ActiveCell.Row;
  Y := Excel.ActiveCell.Column;
  Memo1.Lines.Add('Строк: '+ inttostr(x));
  Memo1.Lines.Add('Столбцов : '+inttostr(y));
end;

end.

Случайно наткнулся по яндексу на пример где отдельно обьявлялся этот параметр
таким образом

Код

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

const 
  xlCellTypeLastCell = $0000000B;  // ВОТ ТАКИМ ОБРАЗОМ.

{$R *.dfm}

{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject); ..................

Тогда ошибка пропала и все заработало.
Получается что если не используем компоненту ExcelApp то это нужно ОБЯЗАТЕЛЬНО делать ?
тогда почему об этом никто не упоминает ???

PM MAIL   Вверх
Albinos_x
Дата 2.3.2007, 23:43 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

1. Следовало бы создать отдельную тему.
2. константа — xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:

Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут…), в справке по VB можно посмотреть значение любой из этих констант…

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
RosemaN
Дата 7.11.2007, 00:52 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 19
Регистрация: 4.11.2007

Репутация: нет
Всего: нет

Цитата(Albinos_x @ 2.3.2007,  23:43)
1. Следовало бы создать отдельную тему.
2. константа — xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:

Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут…), в справке по VB можно посмотреть значение любой из этих констант…

1. в таком варианте пишет «could not convert variant of type OleStr into type Double».

Код

 Excel.WorkBooks[1].Activate; // активация рабочей книги 1
  WorkSheet:=Excel.WorkBooks[1].WorkSheets[1]; //активация листа 1 рабочей книги 1
  WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate; // эту строчку я не совсем понял. Что она активирует?
  max_rows := Excel.ActiveCell.Row; // записывает в переменную номер ячейки (последней непустой?) 

2. думал что переменная max_rows должна быть типа int, ошибка, описанная выше…  smile 
3. где можно взять справочник по этим всем функциям и свойствам?

PM MAIL   Вверх
Albinos_x
Дата 7.11.2007, 22:32 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Evil Skynet
****

Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

код в студию

———————

«Кто владеет информацией, тот владеет миром»    
Уинстон Черчилль

PM MAIL ICQ   Вверх
kuzduk
Дата 10.4.2020, 13:23 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.9.2011

Репутация: нет
Всего: 2

Код

XL := CreateOleObject('Excel.Application');
XL.Workbooks.Open(ExcelFilePath);

//Первый вариант:
UsedRowCount := iSheet.UsedRange.Rows.Count;  //Если у тебя заняты первые десять строк то вернёт 10. Однако если идут первые две строки пустые, а потом 10 занятых, то один хрен вернёт 10, ибо возвращает количество занятых строк.
UsedColCount := iSheet.UsedRange.Columns.Count;
FirstUsedRow := iSheet.UsedRange.Row; //Номер первой строки в которой прописана ячейка
FirstUsedCol := iSheet.UsedRange.Column; //Номер первой колонки в которой прописана ячейка
LastUsedRow  := FirstUsedRow + UsedRowCount - 1;
LastUsedCol  := FirstUsedCol + UsedColCount - 1;

     //Второй вариант: через активацию последней непустой ячейки
//const xlCellTypeLastCell = $0000000B;
iSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; //Если лист пуст(ни одна ячейка не прописана), то строка вызывает ошибку
LastUsedRow := XL.ActiveCell.Row;
LastUsedCol := XL.ActiveCell.Column;

PM MAIL WWW   Вверх
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) 0 Пользователей: « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодняшняя статья блога  будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.

Про работу с этими объектами я уже вкратце говорил, а сегодня хотел бы поделиться с вами более полной информацией. Итак, начнем с самого простого.

1. Что такое Range и как его получить?

Согласно официальному определению Microsoft, Range :

представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.

Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа.  Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:

var  MyRange: OLEVariat;
begin
{объект Range, состоящий из одной ячейки}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1'];
{объект Range в виде строки из четырех ячеек}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D1'];
{объект Range в виде столбца из четырех ячеек}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:A4'];
{объект Range в виде таблицы 4х4 ячейки}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D4'];
end;

Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:

var  MyRange: OLEVariat;
     Cell_1, Cell2: OLEVariant;
begin
{получаем ссылку на объект Cells, соответствующей ячейке A1}
  Cell_1:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[1,1];
{получаем ссылку на объект Cells, соответствующей ячейке C5}
  Cell_2:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3];
{получаем объект Range размером 3х5}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range[Cell_1, Cell_2]
end;

Какой из способов Вы будете использовать в Delphi — не важно, так как результат будет один и тот же. Получив в свое распоряжение диапазон Вы можете использовать его далее, например, для того, чтобы установить вид его границ.

2. Свойства объекта Excel Range.

Рассмотрим основные свойства объекта Range и их применение работе в Excel в Delphi.

Вначале перечислю свойства, которые будут далее рассмотрены в статье.

Свойство Описание
Formula Возвращает или помещает в диапазон формулу
Value Возвращает или устанавливает значение для диапазона
Text возвращает текст из ячейки
Column Возвращает номер первого столбца в первой области, в указанном диапазоне
Columns возвращает объект Range, представляющий собой один столбец из всего диапазона
Comment Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.
Address Возвращает реальный адрес диапазона Range

Formula

Возвращает или помещает в диапазон формулу.

Value

Возвращает или устанавливает значение для диапазона.Свойство Value замечательно тем, что с помощью него можно записать в ячейки абсолютно любые данные, особо не задумываясь о формате данных. Например, запишем в ячейки диапазона строку, число типа integer и число типа single: чтобы каждый раз не повторяться в листингах и не писать одни и те же элементы по 100 раз, будем считать, что в переменной Sheet уже содержится ссылка на активный лист (ActiveWorkSheet) активной книги (ActiveWorkBook) Excel (MyExcel)

var i:integer;
    s: single;
    str: string;
    Sheet: OLEVariant;
begin
  i:=100;
  s:=2.12;
  str:='Hello World!';
  Sheet.Range['A1'].Value:=i;
  Sheet.Range['A2'].Value:=s;
  Sheet.Range['A3'].Value:=str;
end;

Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.

Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:

Sheet.Range['A1:A10'].Value:=str;

и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:

var  val: Variant;
     Sheet: OLEVariant;
     i:integer;
begin
  Val:=Sheet.Range['A1:A3'].Value;
  for i:=1 to 3 do
    ShowMessage(val[i,1]);
end;

Если Вам необходимо читать/писать большое количество данных, то наиболее быстрым способом работы с данными будет использование вариантных массивов. О том, как использовать вариантные массивы при работе с Excel в Delphi рассказывается в статье «Быстрая обработка данных Excel в Delphi.«

Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.

Text

Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.

Column

Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.

Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:

Excel_RangeТо есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.

После того, как диапазоны будут созданы — посмотрим, что вернет нам свойство Column для каждого из диапазонов.

Листинг процедуры создания двух несвязных диапазонов Range следующий:

var Range1,Range2,BigRange: OLEVariant;
begin
{создаем первый диапазон}
  Range1:=Sheet.Range['A1:C4'];
  Range2:=Sheet.Range['E6:H9'];
  BigRange:=Sheet.Range[Range1,Range2];
  ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
{создаем второй диапазон}
  Range1:=Sheet.Range['B7:C13'];
  Range2:=Sheet.Range['E1:H3'];
  BigRange:=Sheet.Range[Range1,Range2];
  ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
end;

Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.

Columns

В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.

Посмотрим как, например, используя это свойство можно изменять столбцы во всем диапазоне Range.

Для демонстрации воспользуемся предыдущим примером, изменим только окончание:

...
BigRange:=Sheet.Range[Range1,Range2];
for i:=1 to BigRange.Columns.Count do
  BigRange.Columns[i].Value:='Столбец №'+IntToStr(i);

Excel_Range_ColumnsВ итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.

Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.

Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:

Range2:=Sheet.Range['E6'];
{записали комментарий}
Range2.AddComment('Это комментарий ячейки области');
{прочитали}
ShowMessage(Range2.Comment.Text);

Address

Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:

Range2:=Sheet.Range['A1:E6'];
Свойство Address будет содержать строку "$A$1:$E$6"

Это свойство удобно использовать, когда Вы оперируете в программе только числовыми значениями (номерами столбцов и строк) и появляется необходимость показать пользователю адреса ячеек из диапазона.

Помимо перечисленных выше свойств к объекту Range применимы все свойства, описанный в статье об изменении внешнего вида ячеек Excel, т.е. borders, color и пр.

3. Методы объекта Excel Range.

Теперь рассмотрим несколько полезных методов, которые могут Вам пригодиться при работе с Excel в Delphi.

Метод Описание
CheckSpelling Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены
PrintPreview Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек
AutoFill Автозаполнение диапазона ячеек на основе данных из другого диапазона
AutoFit Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.
Clear Удаляет все данные из диапазона
ClearComments Удаляет все комментарии в диапазоне Range
ClearContents Удаляет все формулы из диапазона Range
ClearFormats Очищает форматы в диапазоне Range
ClearNotes Очищает все заметки в диапазоне Range
Copy Копирует содержимое диапазона Range в буфер обмена или в другой диапазон
PasteSpecial Специальная вставка диапазона
Cut Вырезает данные и при необходимости вставляет их в новый диапазон
Merge Объединение ячеек диапазона

CheckSpelling

Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены. Замечательной особенностью этого метода является то, что окно замены появляется даже при скрытом окне Excel, то есть, когда свойство Visible у объекта Excel равно false.

Вызывается метод без каких-либо дополнительных параметров:

Range['A1:H6'].CheckSpelling

PrintPreview

Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек. Также как и предыдущий метод PrintPreview не имеет дополнительных параметров. Однако при попытке вызвать метод при скрытом окне Excel в лучшем случае возникнет исключительная ситуация, в худшем — зависание Вашего приложения. Так что перед вызовом:

не забывайте включить свойство Visible у Excel:

AutoFill

Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.

Вызов метода:

Range.AutoFill(Destination, Type)
Параметр Тип Описание
Destination Variant представляет собой объект Range уже заполненных ячеек. Эти ячейки должны входить в автозаполняемый диапазон
Type Integer тип автозаполнения (возможные значения см. ниже)

Рассмотрим применение метода на примере.

Sheet.Range['A1'].Value:=1;
Sheet.Range['A2'].Value:=2;
Source:=Sheet.Range['A1:A6'];
Range2:=Sheet.Range['A1:E6'];
Source.AutoFill(Range2, xlFillDefault)

В результате лист Excel примет следующий вид:

Excel_Range_AutoFillКак видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.

При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.

При использовании метода мы использовали одну из констант в параметре Type xlFillDefault = 0. Используя её мы скопировали данные один-к-одному. Дополнительно Вы можете использовать следующие константы при автозаполнении:

Имя Значение Описание
xlFillDefault 0 скопировать данные один-к-одному
xlFillDays 5 копирование дней недели с расширением, т.е., если Вы запишете в ячейку слово «Понедельник» и попробуете провести автозаполнение ещё на 2 строки, то во второй и третьей строке появятся «Вторник» и «Среда»
xlFillCopy 1 копирует все данные и форматы, повторяя при необходимости
xlFillFormats 3 копирует только форматы источника
xlFillMonths 7 копирует названия месяцев. Работает аналогично xlFillDays
xlFillSeries 2 копирует данные с расширением, например 1,2,3 будут при копировании расширены до 4,5,6 и т.д. Также копирует форматы данных
xlFillValues 4 копирует только значения
xlFillWeekdays 6 копирует дни рабочей недели, работает аналогично xlFillDays, но только до пятницы
xlFillYears 8 копирует года. Работает аналогично xlFillDays
xlGrowthTrend 10 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее, но умноженное на некоторую величину. Например 1,2 раскопируются в 4, 8, 16 и т.д. Формат данных также копируется
xlLinearTrend 9 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее + некоторая величина. Например 1,2 раскопируются в 3, 4, 5 и т.д. Формат данных также копируется

AutoFit

Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.

Пример вызова:

Sheet.Range['A1'].Value:=1234567891012;
Sheet.Range['A2'].Value:=23456789;
Source:=Sheet.Range['A1:A2'];
Source.Columns.AutoFit

Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.

Методы очистки данных диапазона Range

Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.

1. Clear

Удаляет все данные из диапазона.

Пример вызова:

2. ClearComments

Удаляет все комментарии в диапазоне Range.

Пример вызова:

3. ClearContents

Удаляет все формулы из диапазона Range

Пример вызова:

4. ClearFormats

Очищает форматы в диапазоне Range

Пример вызова:

5. ClearNotes

Очищает все заметки в диапазоне Range

Пример вызова:

Методы работы с буфером обмена Excel

1. Copy

Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.

Попробуем реализовать работу метода следующим образом: заполним столбец А некоторыми значениями, а затем скопируем его сначала в буфер, а потом в столбец Е:

Sheet.Range['A1'].Value:=1;
Sheet.Range['A2'].Value:=2;
Sheet.Range['A3'].Value:=3;
Sheet.Range['A4'].Value:=4;
Sheet.Range['A5'].Value:=5;
Sheet.Range['A6'].Value:=6;
Source:=Sheet.Range['A1:A6'];
Source.Copy; //скопировали в буфер
Range2:=Sheet.Range['E1:E6'];
Source.Copy(Range2)//скопировали в новый диапазон

А для того, чтобы вставить данные из буфера обмена существует ещё один метод

2. PasteSpecial

Вызов метода:

MyRange.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
Параметр Тип Описание
Paste Integer определяет какая часть данных диапазона будет вставлена (возможные значения см. ниже)
Operation Integer операция, которая будет выполнена при вставке данных (возможные значения см. ниже)
SkipBlanks boolean True, для того чтобы пустые ячейки из буфера обмена не вставлялись в диапазон назначения. Значение по умолчанию False
Transpose boolean транспонирование столбцов и строк после вставки. По умолчанию устанавливается значение False

При определении параметра Paste следует использовать следующие константы:

Имя Значение Описание
xlPasteAll -4104 Вставка всех данных
xlPasteAllExceptBorders 7 Вставка всего содержимого за исключением вида границ диапазона
xlPasteAllUsingSourceTheme 13 Вставка всего содержимого, используя тему оформления источника
xlPasteColumnWidths 8 Копирует ширину столбцов
xlPasteComments -4144 Вставка комментариев
xlPasteFormats -4122 Вставка форматов данных
xlPasteFormulas -4123 Вставка формул
xlPasteFormulasAndNumberFormats 11 Вставка формул и чисел
xlPasteValidation 6 Вставка проверок
xlPasteValues -4163 Вставка значений
xlPasteValuesAndNumberFormats 12 Вставка значений и чисел

При использовании параметра Operation следует использовать следующие константы:

Имя Значение Описание
xlPasteSpecialOperationAdd 2 К скопированным данным будут добавлены значения из целевых ячеек
xlPasteSpecialOperationDivide 5 Скопированные данные будут разделены на значения в целевых ячейках
xlPasteSpecialOperationMultiply 4 Скопированные данные будут умножены на значения в целевых ячейках
xlPasteSpecialOperationNone -4142 При вставке значений никакие операции не будут применяться
xlPasteSpecialOperationSubtract 3 Из скопированных данных будут вычитаться значения целевых ячеек

Теперь рассмотрим применение метода на примере. В качестве исходных данных возьмем данные из предыдущего примера, но для вставки используем метод PasteSpecial:

...
Range2.PasteSpecial(Operation:=xlPasteSpecialOperationAdd);

После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.

3. Cut

Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.

Merge

Объединение ячеек диапазона.

Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:

Параметр Тип Описание
Across boolean True, чтобы объединить ячейки в каждой строке указанного диапазона как отдельные объекты. Значение по умолчанию False

Например, объединим ячейки в диапазоне Range2 из предыдущего примера:

После выполнения этой операции в диапазоне останется только верхнее значение, т.е. 1.

Дополнительные методы автозаполнения ячеек диапазона Range

В отдельную группу методов можно выделить 4 метода автозаполнения ячеек диапазона:

  1. FillDown
  2. FillUp
  3. FillRight
  4. FillLeft

Принцип действия этих методов один и тот же за исключением направления автозаполнения.

Например, давайте запишем в ячейку A1 какое-нибудь значение и воспользуемся методами FillDown и FillRight:

Sheet.Range['A1'].Value:=1;
Sheet.Range['A1:A6'].FillDown;
Sheet.Range['A1:F1'].FillRight;

После этого в строк 1 и столбце A появятся числа 1. Аналогичным образом можно заполнять не только строки или столбцы, но и таблицы целиком — достаточно знать в какую сторону двигаться при автозаполнениии и применять соответствующие методы Excel для Range.

Вот в принципе краткий обзор возможностей работы с объектов Range в Excel. В целом можно отметить, что работа с этим объектом в Delphi один из самых эффективных способов организации пресылки/получения данных между Excel и Delphi, не считая работы через XML формат.

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

0
0
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Понравилась статья? Поделить с друзьями:
  • Delphi excel поиск по ячейкам
  • Delphi excel открыть один лист
  • Delphi excel объединенные ячейки в excel
  • Delphi excel не найдено
  • Delphi excel не закрывать