Dr@gon. 19 / 19 / 9 Регистрация: 22.11.2010 Сообщений: 321 |
||||
1 |
||||
11.12.2013, 07:10. Показов 4281. Ответов 4 Метки нет (Все метки)
Здравствуйте! Есть такой код который по нажатию на CheckBox добавляет значение в ячейку в Excel и при снятии галочки очищает эту же запись :
При отжатии CheckBox в документе Excel остаются пустые строки как их можно удалить? Добавлено через 22 часа 25 минут Не по теме: Так все же есть же способ какой нибудь помогите
0 |
MaximFegorsk 32 / 53 / 9 Регистрация: 05.12.2013 Сообщений: 261 |
||||
11.12.2013, 08:27 |
2 |
|||
Строку можно удалить так
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 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
11.12.2013, 10:43 |
5 |
|||
Dr@gon., попробуйте так
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 |
|
||
Шустрый Профиль Репутация: нет
|
как организовать цикл до конца строк? ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
http://forum.vingrad.ru/index.php?showtopi…34&view=all ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
там про word есть но про excel я не нашел ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
плохо смотрел… Добавлено @ 12:41
Добавлено @ 12:42 ——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
Akella |
|
||
Творец Профиль
Репутация: 2
|
поищи по форуму, я выкладывал примеры работы с Excel`ем |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
мне нужно для нужной книги для нужного листа узнать кол-во строк
но так не работает! ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
В чём это выражается? ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
Я не испоьзую компоненту, а просто через ОЛЕ, как правильно записать получение количества строк?
на эту запись он выдает такую ошибку: ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
попробуй вот так:
Что за ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
с
тоже самое ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
попробуй так:
если не прокатит,то делай стандартным способом:
WorkSheet : OleVariant; у последнего только один недостаток: если на странице стоит защита, то будет вылетать ошибка… ——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
ура, это сработало, но к сожалению работает только если строки идут подподряд и между ними нету пропуска
а если вот так ф1 ф2 ф3 ф4 ф5 ф6 то ответ будет 3 строки а не 6(вкл и пустую), как подсчитать количество, если есть пропуски? ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
у меня много Excel файлов, в каждом не менее 30000 строк, перед обработкой каждогго файла мне нужно узнать количество строк чтобы знать до куда запускать цикл, но попадаются и пустые строки, даже не знаю что делать, может это как-то по другому можно сделать? нужна помощь! ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
сделай вторым способом… ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
вторым способом попробывал пишет метод Activate из класса Range завершен не верно ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
у меня excel 2000 может из-за этого? ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
нет не из-за этого… если посмотреть, то второй код применяется довольно давно и успешно… и если будешь искать примеры по инету, то почти везде найдёшь именно второй способ… а ошибка возможно в строчках позже… на какой строчке ошибка вылезает? ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
ошибка именно на этой строке: ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
код в студию… ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
var
эта ошибка вылетает если открыты две книги как ы этом примере, если же открыть только одну книгу то все нормально, считает как надо, у меня в программе открыто несколько книг, что делать? Это сообщение отредактировал(а) Girder — 26.3.2007, 10:04 ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
ура получилось. просто нужно активировать книгу ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
честно говоря по твоему коду ничего не понятно…. к примеру:
зачем открывать две книги… связь-то у тебя только со второй… ну да ладно… может код не весь…
зато здесь мы возвращаемся к первой книге… тогда зачем вторая (?)… и далее не понятно зачем в цикле четыре раза вычеслять количество строк на одном и том же листе?… ——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
отсюда кстати и ошибка вылезала… работал со второй книгой… а число строк на листе пытался получить из первой книги… Это сообщение отредактировал(а) Albinos_x — 14.7.2006, 14:06 ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
sgentstuff |
|
||
Шустрый Профиль Репутация: нет
|
отсюда кстати и ошибка вылезала… ЭТО ТОЧНО, теперь все понятно! ——————— Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда. |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
Удачи! ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
oleg153 |
|
||||
Новичок Профиль Репутация: нет
|
Господа! Перепробовал все, но и в delphi7 и delphi 2006 (studio) одна и таже проблемма : Я не понимаю в чем дело, ЧТО я не так пишу ???
Случайно наткнулся по яндексу на пример где отдельно обьявлялся этот параметр
Тогда ошибка пропала и все заработало. |
||||
|
|||||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
1. Следовало бы создать отдельную тему.
4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут…), в справке по VB можно посмотреть значение любой из этих констант… ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
RosemaN |
|
||||||
Новичок Профиль Репутация: нет
|
1. в таком варианте пишет «could not convert variant of type OleStr into type Double».
2. думал что переменная max_rows должна быть типа int, ошибка, описанная выше… |
||||||
|
|||||||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
код в студию ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
kuzduk |
|
||
Новичок Профиль Репутация: нет
|
|
||
|
|||
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодняшняя статья блога будет целиком посвящена работе с 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
Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.
Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:
То есть каждый из диапазонов 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);
В итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя 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 примет следующий вид:
Как видите все столбцы второго диапазона 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 метода автозаполнения ячеек диапазона:
- FillDown
- FillUp
- FillRight
- 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. |
0
0
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.