Последняя строка excel delphi

0 / 0 / 0

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

Сообщений: 5

1

21.08.2015, 20:01. Показов 5749. Ответов 2


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

Добрый день! Импортирую данные из таблицы Excel,таблица состоит из двух столбцов.
Первый очень длинный столбец с числами, второй заполнен не полностью. Нужно импортировать только те строки в которых заполнены оба столбца. Какую функцию использовать для определения последней заполненной ячейки не во всей таблице, а во втором столбце!

Добавлено через 52 минуты
Точнее, нужен номер последней заполненной ячейки в столбце!



0



Камарит

0 / 0 / 1

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

Сообщений: 5

22.08.2015, 15:41

2

Лучший ответ Сообщение было отмечено 1412 как решение

Решение

Попробуй как-то так

Delphi
1
2
3
4
5
6
7
8
9
for I := 1 to 65535 do
       begin
         s:=sheet.cells[i,2];
         if sch='' then
            begin
              r:=i-1;
              break;
            end;
       end;

Я у себя так ищу, возможно есть более оптимальные варианты.



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32518 / 20999 / 8120

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

Сообщений: 36,265

Записей в блоге: 7

22.08.2015, 19:07

3

Лучший ответ Сообщение было отмечено 1412 как решение

Решение

Delphi
1
R := XL.ActiveSheet.Cells[XL.ActiveSheet.Rows.Count, 2].End[xlUp].Rows.Row;



1




Форум программистов Vingrad

Новости ·
Фриланс ·
FAQ

Правила ·
Помощь ·
Рейтинг ·
Избранное ·
Поиск ·
Участники

Форум -> Программирование -> Delphi, Kylix and Pascal -> Delphi: ActiveX/СОМ/CORBA
(еще)

Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> OLE Excel Найти последнюю заполненную строку 

V

   

Опции темы

superVad
Дата 4.7.2011, 22:54 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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

Пробовал по разному:

И как тут http://forum.vingrad.ru/topic-103479.html#st_0_view_0.
И как в макросе экселевском получается.

На все один ответ — Член группы не найден.
Получается, что через Ole такой функционал не доступен?

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




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

Цитата

Yersinia pestis
****

Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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

Код

Excel.ActiveSheet.UsedRange.rows.Count;

 — не то, что ли?

———————

There’s nothing left but silent epitaphs.

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




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

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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

Данкинг, большое спасибо.

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




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

Цитата

Yersinia pestis
****

Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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

Всё так просто оказалось. smile 

———————

There’s nothing left but silent epitaphs.

PM MAIL WWW   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: ActiveX/СОМ/CORBA»

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 

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

Подписаться на тему |
Подписка на этот форум |
Скачать/Распечатать тему

[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]

Реклама на сайте
   
Информационное спонсорство

 
Фуфик
 
(2009-10-19 10:04)
[0]

Здравствуйте
Подскажите как правильней определить последнею строку Excel, мне нужно пробежаться по циклу до последней строки  Excel’я что-то типа while not eof.
Придумал кривоватый вариант, но хотелось бы более оптимальный и правильный.
Для более лучшего понятия моей проблемы привожу весь код

Var
a: String;
XL: variant;
X: Integer;
Begin
XL := CreateOleObject(«Excel.Application»);
XL.DisplayAlerts := False;
XLS.WorkBooks.Open(‘Ostatki.xls’);  
x:= 2;
a:= XLS.Cells[x,4].value;

While a<>»» do   // то что пришло в голову
BEGIN
If
ADOTable1.Locate(«kod_tovara», XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey])=
  True  Then
   Begin
     ADOTable1.Edit;
     ADOTable1ostatok.AsInteger:= XLS.Cells[x,5].value;
     ADOTable1cena.AsCurrency:= XLS.Cells[x,6].value;
     ADOTable1.Post;
     x:= x+1;
   end else  begin
   ADOTable1.Insert;
     ADOTable1kod_tovara.AsInteger:=  XLS.activesheet.Cells[x,1].value;
     ADOTable1naimenov.AsString:= XLS.activesheet.Cells[x,4].value;
     ADOTable1ostatok.AsInteger:= XLS.activesheet.Cells[x,5].value;
     ADOTable1cena.AsCurrency:= XLS.activesheet.Cells[x,6].value;
   ADOTable1.Post;
   X:= x+1;
   end;
a:= XLS.Cells[x,4].value;
END;


 
RWolf ©
 
(2009-10-19 10:07)
[1]

можно подключиться к экселевской таблице, как к источнику данных, через то же ADO; тогда, под идее, можно обходиться пресловутым Eof.


 
KilkennyCat ©
 
(2009-10-19 10:09)
[2]

последняя строка в листе Excel имеет номер 65536


 
Рамиль ©
 
(2009-10-19 10:18)
[3]


> KilkennyCat ©   (19.10.09 10:09) [2]

Это смотря какой Excel


 
McSimm ©
 
(2009-10-19 10:18)
[4]


> KilkennyCat ©   (19.10.09 10:09) [2]
>
> последняя строка в листе Excel имеет номер 65536

не обязательно, у меня это 1048576


 
Фуфик
 
(2009-10-19 10:35)
[5]

По гуглив нашел, вошем мой вариант намного оптимальней


> KilkennyCat ©   (19.10.09 10:09) [2]
> последняя строка в листе Excel имеет номер 65536

Мой зашкалил за 800000 проверять дальше нестал :)

Спасибо за внимание. Код лучше оставлю как есть.


 
sniknik ©
 
(2009-10-19 10:41)
[6]

> мой вариант намного оптимальней
не смеши людей ADOTable в принципе не может быть оптимальней… с ADODataSet-ом, это как напишешь.


 
Фуфик
 
(2009-10-19 10:49)
[7]


> не смеши людей ADOTable в принципе не может быть оптимальней.
> .. с ADODataSet-ом, это как напишешь.

Согласен стобой быть может в другом случае такое. В моем случае используются всего две переменные a и XL
И мне они нужны лишь при нажатии одной кнопки обновить, и раде этого закидывать на ыорму ещё один компонент мне кажется лишним


 
sniknik ©
 
(2009-10-19 11:16)
[8]

количество переменных здесь совершенно не причем…

и вообще, само появление ADOTable в коде, это как семафор с с мигающей красной надписью «пишет ламер».
заявления, что у него что-то оптимальней смешны независимо от того правда это или нет (даже ламер может написать хорошо. случайно.).


 
Anatoly Podgoretsky ©
 
(2009-10-19 11:28)
[9]


> Подскажите как правильней определить последнею строку Excel

А что такое последнея строка Экселя, по крайней мере есть три определения и это разные строки.


 
Anatoly Podgoretsky ©
 
(2009-10-19 11:28)
[10]


> Мой зашкалил за 800000 проверять дальше нестал :)

Это ты зря надо было продолжать дальше.


 
Anatoly Podgoretsky ©
 
(2009-10-19 11:31)
[11]


> While a<>»» do   // то что пришло в голову

Кстати это уже четвертое определение и вряд ли оно тебе подходит.
Кстати твои вопросы совсем не относятся к Дельфи, это вопросы по DOM Экселя, а его производит другой производитель, не Борланд, вот у него и надо искать ответ или хотя бы проштудировать файл excelXP.pas конечно если ты мазохист.


 
KilkennyCat ©
 
(2009-10-19 11:49)
[12]

Извини за оффтоп, но каким это макаром у вас больше чем у меня? 64-х битная версия что ли?


 
sniknik ©
 
(2009-10-19 11:59)
[13]

2007 офис.


 
KilkennyCat ©
 
(2009-10-19 12:03)
[14]

а, понятно. спасибо.


 
Anatoly Podgoretsky ©
 
(2009-10-19 12:17)
[15]

> KilkennyCat  (19.10.2009 12:03:14)  [14]

Ты спроси его еще о количестве колонок, то вообще в обморок упадешь.


 
Фуфик
 
(2009-10-19 13:09)
[16]


> sniknik ©   (19.10.09 11:16) [8]
> количество переменных здесь совершенно не причем…и вообще,
>  само появление ADOTable в коде, это как семафор с с мигающей
> красной надписью «пишет ламер».заявления, что у него что-
> то оптимальней смешны независимо от того правда это или
> нет (даже ламер может написать хорошо. случайно.).

Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров? Не приведеш полный список этих компонентов


> Anatoly Podgoretsky ©   (19.10.09 11:28) [9]
> > Подскажите как правильней определить последнею строку
> ExcelА что такое последнея строка Экселя, по крайней мере
> есть три определения и это разные строки.


> Для более лучшего понятия моей проблемы привожу весь код


> Anatoly Podgoretsky ©   (19.10.09 11:28) [10]
> > Мой зашкалил за 800000 проверять дальше нестал :)Это ты
> зря надо было продолжать дальше.

Оффтоп


> Anatoly Podgoretsky ©   (19.10.09 11:31) [11]
> > While a<>»» do   // то что пришло в головуКстати это уже
> четвертое определение и вряд ли оно тебе подходит.Кстати
> твои вопросы совсем не относятся к Дельфи, это вопросы по
> DOM Экселя, а его производит другой производитель, не Борланд,
>  вот у него и надо искать ответ или хотя бы проштудировать
> файл excelXP.pas конечно если ты мазохист.

Спасибо что просветил, следующий раз буду знать.


 
sniknik ©
 
(2009-10-19 13:59)
[17]

> Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров?
нет, не так, скорее есть компоненты которые предназначены и подходят для чего то конкретного, и использовать их совсем не по назначению признак ламеризма.

ADOTable не предназначен для того чтобы писать с его использованием… он был предназначен (вообще, имхо, это ошибка борланда, что они его сделали) для быстрого перевода программ с BDE на ADO (идея была, что простой заменой компонент)… те времена когда что то так переводили давно прошли, т.что теперь это просто признак ламеризма.


 
sniknik ©
 
(2009-10-19 14:20)
[18]

кстати это не единственное
If
ADOTable1.Locate("kod_tovara", XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey]) = True  
Then

клевая конструкция ;)
хотя это еще можно списать на «экстравагантность письма», т.я. явной ошибки тут нет, но вот логику…
ищется kod_tovara, и что то делается, и при поиске используется loPartialKey, частичное совпадение… т.е. получается для тебя товары для примера, зеленый горошек и виски урожая 1788 года, одно и тоже…
в общем либо ты не знаешь зачем что такое этот ключ, либо у тебя логика хромает… хорошая, но хромает. © Вини Пух

и кстати loCaseInsensitive в ADO не используется (но тут хоть без ошибок в логике, оно просто игнорируется).


 
Anatoly Podgoretsky ©
 
(2009-10-19 14:34)
[19]

> Фуфик  (19.10.2009 13:09:16)  [16]

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

> Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров?
> Не приведеш полный список этих компонентов

Это достаточно объекная работа и выполнять ее без коммерциализации как то не умно. Но пример функци для ламеров, это например IncDay но и это им особо не помогает, поскольку Борланд не сообразил, что для них нужна еще функция DecDay, без нее они впадают в полный ступор. А ты знаешь как сделать DecDay без этой функции.


 
Anatoly Podgoretsky ©
 
(2009-10-19 14:40)
[20]

> sniknik  (19.10.2009 14:20:18)  [18]

Особенно красиво это для цифровых кодов, наряду с loCaseInsensitive


 
Фуфик
 
(2009-10-19 14:59)
[21]


> нет, не так, скорее есть компоненты которые предназначены
> и подходят для чего то конкретного, и использовать их совсем
> не по назначению признак ламеризма.

Хорошо я тот саммый ламер который попался на этикомпоненты.


> ADOTable не предназначен для того чтобы писать с его использованием.
> .. он был предназначен (вообще, имхо, это ошибка борланда,
>  что они его сделали) для быстрого перевода программ с BDE
> на ADO (идея была, что простой заменой компонент)… те
> времена когда что то так переводили давно прошли, т.что
> теперь это просто признак ламеризма.

У меня стоит база Access, и причем здесь BDE. я например умею бращаться к базам Access только через ADOTable, ну и я как умею так и сделал. Ты как мастер может посоветуешь как лучше. Как ни как я ещё новичок в этом


> кстати это не единственноеIfADOTable1.Locate(«kod_tovara»,
>  XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey])
> = True  Thenклевая конструкция ;)хотя это еще можно списать
> на «экстравагантность письма», т.я. явной ошибки тут нет,
>  но вот логику…ищется kod_tovara, и что то делается, и
> при поиске используется loPartialKey, частичное совпадение.
> .. т.е. получается для тебя товары для примера, зеленый
> горошек и виски урожая 1788 года, одно и тоже…в общем
> либо ты не знаешь зачем что такое этот ключ, либо у тебя
> логика хромает… хорошая, но хромает. © Вини Пухи кстати
> loCaseInsensitive в ADO не используется (но тут хоть без
> ошибок в логике, оно просто игнорируется).

Ну это я привык использовать в BDE ну и туда тоже вписал. Понятии не имел для чего они. А что тогда посоветуешь использовать?


> Anatoly Podgoretsky ©   (19.10.09 14:34) [19]
> поведение тебе пойдет на пользу.

У кого тут агрессивное поведения? Я не сколько не зол ни на кого из вас.


> Anatoly Podgoretsky ©   (19.10.09 14:40) [20]
> Это достаточно объекная работа и выполнять ее без коммерциализации
> как то не умно. Но пример функци для ламеров, это например
> IncDay но и это им особо не помогает, поскольку Борланд
> не сообразил, что для них нужна еще функция DecDay, без
> нее они впадают в полный ступор. А ты знаешь как сделать
> DecDay без этой функции.

По мне так Оффтоп


 
sniknik ©
 
(2009-10-19 15:42)
[22]

> У меня стоит база Access, и причем здесь BDE
читай внимательнее уже написанное и узнаешь.

> я например умею бращаться к базам Access только через ADOTable, ну и я как умею так и сделал
ну так и не говори, что то что ты сделал оптимальнее чего то (тем более всего найденного в гугле, где есть куча кода от профессионалов)… «как умею» это не оптимально, вот когда будешь уметь разными способами, тогда и будет один в конкретном случае оптимальнее другого, но даже в этом случае не оптимальнее всего гугля.

> Ты как мастер может посоветуешь как лучше. Как ни как я ещё новичок в этом
т.е. сначала огрызаешься на очевидное, а после «я новичок» помогите мне… ну, ну. а где гарантия, что следующее очевидное (совет) ты поймешь и применишь, а не проигнорируешь или опять не начнешь огрызаться думая что все непонятое это обидные для тебя лично слова?
ладно, совет — для того чтобы полноценно работать с ADO нужно первым делом удалить с палитры ADOTable, ADOQuery, ADOStoredProc, и учится пользоваться только тем что осталось…
ну вот, я попробовал.

> Ну это я привык использовать в BDE ну и туда тоже вписал.
в BDE с логикой поиска по части кода тоже будет та же проблема. и если у тебя ее не было значит очень везло.

> Понятии не имел для чего они. А что тогда посоветуешь использовать?
учится, учится, и еще раз учится. (другого на банальные вопросы не посоветуешь, ну может еще в хелп заглянуть…). тем более уже объяснил почему, в чем глюк. но похоже непонятое тебе проще проигнорировать чем вникнуть в смысл написаного.


 
Фуфик
 
(2009-10-19 15:45)
[23]


> sniknik ©   (19.10.09 14:20) [18]

Фигня получается
loPartialKey тебе не нравится а loCaseInsensitive ты говоришь в  ADO не используется. Так третьего та не дано ведь, может я ошибаюсь но вот по справке нашел что TLocateOption = (loCaseInsensitive, loPartialKey)


 
Фуфик
 
(2009-10-19 15:58)
[24]


> ну так и не говори, что то что ты сделал оптимальнее чего
> то (тем более всего найденного в гугле, где есть куча кода
> от профессионалов)… «как умею» это не оптимально, вот
> когда будешь уметь разными способами, тогда и будет один
> в конкретном случае оптимальнее другого, но даже в этом
> случае не оптимальнее всего гугля.

Говоря об оптимальности я имел виду поиск последней (заполненной) строки в Excele, и несколько небыл задан вопросом об использовании другого кроме ADOTable для доступа к своей базе, вы б и неузнали об этом не привел бы я полный код


> т.е. сначала огрызаешься на очевидное, а после «я новичок»
> помогите мне… ну, ну. а где гарантия, что следующее очевидное
> (совет) ты поймешь и применишь, а не проигнорируешь или
> опять не начнешь огрызаться думая что все непонятое это
> обидные для тебя лично слова?

насчет огрезатся извини если тебе чет не понравилось, а советы за спасибо буду дальше гуглить и
> учится, учится, и еще раз учится


 
sniknik ©
 
(2009-10-19 16:00)
[25]

и что это доказывает?
тип интеджер это тоже к примеру дофига чисел, а в качестве кодов исключений честь используется… или в любом другом частном случае. а  в стпвке тем не менее можно найти — Integer — 2147483648..2147483647
и что?

еще советы, не путай тип и значение, ищи инфу не просто в справке а в нужном разделе.

и потом, ты опять не пытаешься понять, ты пытаешься опровергнуть… (сейчас в ход пойдут заезженные аргументы типа — «в споре рождается истина»… :)


 
sniknik ©
 
(2009-10-19 16:01)
[26]

> честь используется
часть не используется


 
sniknik ©
 
(2009-10-19 16:09)
[27]

> Говоря об оптимальности я имел виду поиск последней (заполненной) строки в Excele
тебе в начале говорили о подключение к книге как к базе,  вместо того чтобы спросить, если/что непонятно, ты предпочел спор (ни о чем), т.е. ты на самом деле не хотел оптимального ты хотел чтобы тебя похвалили сказав «молодец, правильно написал, ну может вот тут можно чуть ускорить, но в общем идеал…», извини но это было бы вранье.
вот тебе оптимальное, если бы пошел по тому пути, с подключением
ADODataSet.Last;
готово. ни короче, ни быстрее врядли сделаешь (если конечно имеется ввиду именно последняя в наборе, а не просто одна запись которую можно было бы вернуть запросом, тогда это было бы быстрее но писать больше).


 
Anatoly Podgoretsky ©
 
(2009-10-19 16:15)
[28]

> sniknik  (19.10.2009 16:09:27)  [27]

Мы к Микрософту посылали, за изучением DOM?
Так там есть функция поиска последней заполненой строчки, надо сходить и найти как она называется.


 
sniknik ©
 
(2009-10-19 16:21)
[29]

> Мы к Микрософту посылали, за изучением DOM?
ну, так я тоже говорил, есть не один путь что то сделать… ;)


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

Сегодняшняя статья блога  будет целиком посвящена работе с 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
голоса

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

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

To locate the last cell in a row you need the End property of a Range.

As per the documentation:

Returns a Range object that represents the cell at the end of the
region that contains the source range. Equivalent to pressing END+UP
ARROW, END+DOWN ARROW, END+LEFT ARROW, or END+RIGHT ARROW. Read-only
Range object.

For example (VB code)

Range("B4").End(xlToRight)

would move the current cell to the last cell before the first empty cell to the right of B4

Range("B4").End(xlToRight).Select

would select that cell.

Note

Just bear in mind though that you may need to do this several times when you are dealing with a worksheet that has empty cells in the row you are doing this on. End+Right only moves to the «last non-empty before the first empty cell» starting from the current. If there are other non-empty cells after that first empty cell, you will have to do repeat. The last non-empty cell would thus be the one before the «End» that returns the absolute last column in the sheet.

Like this post? Please share to your friends:
  • Последняя операция в excel
  • Последний столбец в excel название
  • Последняя непустая ячейка в строке excel
  • Последний столбец в excel макрос
  • Последняя непустая ячейка в столбце excel