Delphi excel снять выделение

Модератор:Naeel Maqsudov

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

Программно копирую диапазон …
Range(«B13:L13»).Copy
Range(«N13»).Select
ActiveSheet.Paste

После этого остается выделенным «пунктирной рамкой копирования» диапазон B13:L13
и просто выделенным диапазон, куда копировали.
Как снять эти выделения. При ручном способе достаточно нажать ESC.

Так как правильно сделать, программно посылать ESC или еще как-то?

pashulka

Сообщения:831
Зарегистрирован:24 ноя 2004, 03:46
Контактная информация:

10 ноя 2005, 11:13

Избавиться о пунктирной линии можно, если использовать, например :

Хотя в Вашем случае достаточно просто использовать :

Код: Выделить всё

Range("B13:L13").Copy Destination:=Range("N13")
' Or
Range("B13:L13").Copy Range("N13")

P.S. Если параметры форматирования ячеек копировать не надо, то от применения метода .Copy можно отказаться.

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

10 ноя 2005, 13:55

pashulka,
Ваши варианты копирования диапазонов я взял на вооружение,

Application.CutCopyMode = False — у меня работает только когда его устанавливаешь в конце всех операций,
почему-то при автоматической записи макроса, Excel ставит ее перед командой Copy, и функция не работает.

Sub Макрос1()
‘ Макрос1 Макрос
‘ Макрос записан 10.11.2005 (HomePC)

Range(«B5:B12»).Select
Application.CutCopyMode = False
Selection.Copy
Range(«G5»).Select
ActiveSheet.Paste
End Sub

А можно ли упростить код для случая копирования только формата диапазона?
Мой исходный вариант:

Range(«B13:L23»).Copy
Range(«N13»).Select
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False

pashulka

Сообщения:831
Зарегистрирован:24 ноя 2004, 03:46
Контактная информация:

10 ноя 2005, 14:28

Устанавливать значение свойства .CutCopyMode действительно необходимо после применения метода .Copy

Что касается копирования форматов ячеек, то могу предложить вот этот вариант :

Код: Выделить всё

Range("B13:L23").Copy
Range("N13").PasteSpecial Paste:=xlFormats
Application.CutCopyMode = False

' Or

With Application
     .Range("B13:L23").Copy
     .Range("N13").PasteSpecial Paste:=xlFormats
     .CutCopyMode = False
End With

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

11 ноя 2005, 03:34

Спасибо,
устраняется как я понял лишнее действие выделения диапазона,
и лишние операнды в функции PasteSpecial также можно опустить.
Вот какой заботливый редактор записи макросов :)

А снятие обычного выделения с конечного диапазона после завершения копирования я решил простым выделение одной из ячеек, например Range(«A1»).Select.

Аватара пользователя

Игорь Акопян

Сообщения:1419
Зарегистрирован:13 окт 2004, 17:11
Откуда:СПБ
Контактная информация:

11 ноя 2005, 10:34

заботливый редактор записи макросов

Он просто повторяет то что делаешь ты — максимально точно ;) Любой клик в ячейки — он отметит select’ом
А уж ты, как программер, лезешь в доки и хелпы и убираешь лишнее ;)

Изображение

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

11 ноя 2005, 20:07

Да нет, претензий к редактору макросов у меня нет, наоборот код узнаешь при его работе.
А «заботливый» употребил в добром и благодарном смысле.


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

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

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Как снять выделение, в Excel 

V

   

Опции темы

neweraser
Дата 17.5.2010, 21:31 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Опытный
**

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

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

Здравствуйте, я копирую ячейки вот таким вот способом:

Код

Sheet.Range['A1','Z10'].Copy(EmptyParam);
Sheet.Range['A11','Z20'].PasteSpecial($FFFFEFE6,$FFFFEFD2,False,False);

подскажите, как снять после этого выделение с области ячеек?
нашел вот подробнее про PasteSpecial, но мало помогло, к тому же у меня не работает.
Да, и кстати, границы копирует, а объединения ячеек почему-то нет  smile

Это сообщение отредактировал(а) neweraser — 17.5.2010, 22:20

———————

Кто ищет, тот всегда найдет.

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




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

Цитата

Yersinia pestis
****

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

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

Как-нибудь так не работает?

Код

Excel.Application.CutCopyMode: =False;

———————

There’s nothing left but silent epitaphs.

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




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

Цитата

Опытный
**

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

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

все работает, спасибо smile а синее выделение снять можно?

Добавлено @ 22:53
хотя можно просто и Sheet.Cells[1,1].Select; )) только вот не пойму, почему объединения ячеек не копирует?

Это сообщение отредактировал(а) neweraser — 17.5.2010, 22:56

———————

Кто ищет, тот всегда найдет.

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




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

Цитата

Yersinia pestis
****

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

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

Цитата(neweraser @  17.5.2010,  23:48 Найти цитируемый пост)
а синее выделение снять можно?

Слушай, я не знаю, я сам только что попробовал в Excel’е и тебе предолжил! smile  smile  smile

Цитата(neweraser @  17.5.2010,  23:48 Найти цитируемый пост)
только вот не пойму, почему объединения ячеек не копирует?

Снова-таки, попробуй, как сам Excel это делает. 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 | Следующая тема »

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

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

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

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

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

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

Источник

Delphi excel убрать выделение

Автоматически синим цветом выделяется элемнт таблицы StringGrid[0,0]
Если потом кликнуть мышкой на таблицу , то выделение синим цветом пропадает.
Как убрать выделение синим цветом при запуске Stringgrid?


smartleds ( 2007-12-07 18:37 ) [1]

Да забыл сказать фиксированных элементов нет.


smartleds ( 2007-12-07 18:57 ) [2]

Вот нашед свойство goDrawFocusSelected текущая ячейка помечается цветом , Коллеги как убрать это св-во?


smartleds ( 2007-12-07 19:03 ) [3]

Я так понял этому св-ву нужно присвоить статус False
Какой там синтаксис?
StringGrid1.Options:=[goDrawFocusSelected:=false];


smartleds ( 2007-12-07 19:19 ) [4]

StringGrid1.Options.goDrawFocusSelected:=false;так тоже не выходит

Хоть бы ответил ктонить , что ерунду спросил?


Anatoly Podgoretsky © ( 2007-12-07 20:51 ) [6]


> StringGrid1.Options:=[goDrawFocusSelected:=false];

И что за подобное компилятор тебя не отругал.
Options это множество. Операции над множествами описаны в справке и относятся к базовым понятиям языка.


Германн © ( 2007-12-07 21:30 ) [7]


> smartleds (07.12.07 18:32)
>
> Автоматически синим цветом выделяется элемнт таблицы StringGrid[0,
> 0]
> Если потом кликнуть мышкой на таблицу , то выделение синим
> цветом пропадает.
> Как убрать выделение синим цветом при запуске Stringgrid?
>
>

хз. Я простых способов не нашел.


© ( 2007-12-07 21:44 ) [8]

Что-то я не понял сути. сегодня до меня туго доходит. (
проверте вот этот
object StringGrid1: TStringGrid
Left = 40
Top = 28
Width = 337
Height = 137
FixedCols = 0
FixedRows = 0
TabOrder = 0
end
или киньте свой «проблемный» грид
Хотя у меня D7, знаю что у Германна D6, может и у автора D6 — тогда в D7 получается этот вопрос решен.
Т.е. «при старте грида» ничего выделенного нет, все ячейки «белые».


Германн © ( 2007-12-07 21:56 ) [9]


> знаю что у Германна D6

И Д4 и BDS2006 тоже имеются, но ты прав. Это было в Д6.


> TabOrder = 0

Не помогает. Кстати кол-во FixedXX не играет рояля.


© ( 2007-12-07 22:11 ) [11]

> [10] Германн © (07.12.07 22:03)

А как ситуация в D4 или BDS2006 ?

ЗЫ А TabOrder — я его не трогал, он «случайно» в дфм попал, так как у этого свойства дефолт -1, а в ИО оно меняется (минимум 0)


boa_kaa © ( 2007-12-07 22:41 ) [12]


smartleds ( 2007-12-07 23:45 ) [13]

Cпасибо, но к сожалению не помогло.
А проблема такая , более детально.
Действительно когда рисуется Грид все ячейки белые,и ячейка с координатами [0,0] выделенна в еле заметную рамку, но как только я нажимаю на любую кнопку на форме выделенная в рамку ячейка автоматически закрашивается в синий цвет. Причем выделить я могу мышкой любую ячейку или даже несколько, и все они окрашиваются в синий цвет. А ао кнопке ничего не делаю , даже создал пустую кнопку все равно она влияет.

procedure TForm2.Button3Click(Sender: TObject);
var i:integer;
begin
i:=0;
end;

А Грид проинициализирован так:
StringGrid1.ColCount:=32;
StringGrid1.RowCount:=8;
StringGrid1.DefaultColWidth:=20;
StringGrid1.DefaultRowHeight:=20;
StringGrid1.FixedCols:=0;
StringGrid1.FixedRows:=0;
form2.StringGrid1.TabOrder:=0;
StringGrid1.Options:=StringGrid1.Options-[goDrawFocusSelected];
k:=1;
for i:=0 to 7 do
For j:=0 to 31 do
begin
StringGrid1.Cells[j,i]:=inttostr(k);
k:=k+1;
end;


smartleds ( 2007-12-07 23:45 ) [14]

Да использую D7

> [13] smartleds (07.12.07 23:45)
> [14] smartleds (07.12.07 23:45)

procedure TForm1.FormCreate(Sender: TObject);
var i,j,k: Integer;
begin
StringGrid1.ColCount:=32;
StringGrid1.RowCount:=8;
StringGrid1.DefaultColWidth:=20;
StringGrid1.DefaultRowHeight:=20;
StringGrid1.FixedCols:=0;
StringGrid1.FixedRows:=0;
k:=1;
for i:=0 to 7 do
For j:=0 to 31 do
begin
StringGrid1.Cells[j,i]:=inttostr(k);
k:=k+1;
end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if gdSelected in State then
with TStringGrid(Sender), TStringGrid(Sender).Canvas do begin
Brush.Color:=clWhite;
FillRect(Rect);
TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
end;
end;


© ( 2007-12-08 00:04 ) [16]

> Brush.Color:=clWhite;

Эту строку лучше замени на:
Brush.Color:=Color;
Если запутался с with то вот без него:
if not Sender is TStringGrid then Exit; //но и с with тоже нужно проверку делать
if gdSelected in State then begin
TStringGrid(Sender).Canvas.Brush.Color:=Color;
TStringGrid(Sender).Canvas.FillRect(Rect);
TextRect(Rect, Rect.Left+2, Rect.Top+2, TStringGrid(Sender).Cells[ACol, ARow]);
end;


© ( 2007-12-08 00:05 ) [17]

> TStringGrid(Sender).Canvas.Brush.Color:=Color;

Ну конечно же
TStringGrid(Sender).Canvas.Brush.Color:=TStringGrid(Sender).Color;
Я уже сам запутался 🙂


© ( 2007-12-08 00:09 ) [18]

> TextRect(Rect, Rect.Left+2, Rect.Top+2, TStringGrid(Sender).Cells[ACol, ARow]);

В общем понятно 🙂 TextRect — это метод канвы грида)
т.е.
TStringGrid(Sender).Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, TStringGrid(Sender).Cells[ACol, ARow]);
все ж с with это компактнее 🙂


smartleds ( 2007-12-08 00:11 ) [19]

Что то не работает , все равно выделенная ячейка синим выделяется при нажатии любой кнопки.
Может вообще запретить выделение мышкой какой либо ячейки?


© ( 2007-12-08 00:13 ) [20]

> [19] smartleds (08.12.07 00:11)
> Что то не работает , все равно выделенная ячейка синим выделяется
> при нажатии любой кнопки

Не может быть. В данном примере я вообще выделение убрал.


© ( 2007-12-08 00:15 ) [21]

> [19] smartleds (08.12.07 00:11)

Или тебе и ФокусРект тоже мешает.
Тогда StringGrid.DefaultDrawing = False и рисуюй грид так как тебе заблагорассудится.


smartleds ( 2007-12-08 00:22 ) [22]

Вставил StringGrid1.DefaultDrawing:=false;
в инициализацию и текст пропал.

procedure TForm1.FormCreate(Sender: TObject);
var i,j,k: Integer;
begin
StringGrid1.ColCount:=32;
StringGrid1.RowCount:=8;
StringGrid1.DefaultColWidth:=20;
StringGrid1.DefaultRowHeight:=20;
StringGrid1.FixedCols:=0;
StringGrid1.FixedRows:=0;
k:=1;
StringGrid1.DefaultDrawing:=false;


© ( 2007-12-08 00:36 ) [23]

> [22] smartleds (08.12.07 00:22)
> Вставил StringGrid1.DefaultDrawing:=false;

DefaultDrawing — это не просто так. это говорит о том, что полностью(!) вывод грида лежит на совести программиста
Т.е. тут уже нужно учитывать все и вся за исключением самой сетки, она помоему рисуется гридом.
Так вот выставив данное свойство в ложь, ты теперь должен сам рисовать и фон ячейки и содержимое (текст).
учитывая состояние ячейки, в этом поможет параметр State. Это хорошо у тебя нет фиксированных ячеек, а то и их пришлось бы рисовать «вручную».
Еще раз. проверь код в [15]. возможно ты не подключил обработчик ОнДравКэлл.


smartleds ( 2007-12-08 00:50 ) [24]

Не все правильно, выделения ячеек нет, только синим автоматически выделяется ячейка которая предварительно выделенна мышкой в рамке.
А те ячейки хоторые я хотел выделить красным не выделяются.
Может как то запретить выделять ячейки в рамку мышкой? Потому что потом при нажатии любой кнопки эта выделенная в рамку ячейка становится синей. Код [15] проверял два раза не выделяется только те ячейки которые я сам хочу выделить.


smartleds ( 2007-12-08 00:57 ) [25]

Что интересно, нарисовал грид вижу нулевая ячейка выделена в рамку, жму кнопку
procedure TForm2.Button3Click(Sender: TObject);
var i:integer;
begin
i:=0;
end;
Она становиться синей , жму мышкой на ячейку , синева пропадает , но остается выделена в рамку, жму на соседнюю ячеку , она становимться выделенной в рамку , жму на кнопку , теперь эта соседняя ячейка становиться синей. Как избавиться от этого, чтобы этот грид стал только способом отображения инфы , и не на какие дейчтвия мышкой не реагировал?


© ( 2007-12-08 01:02 ) [26]

> [24, 25] smartleds (08.12.07 00:50)

Ну не знаю. у меня все ОК)
Можешь тестовый проект с «проблемой» кинуть на почту cemvol2005(c)smtp.ru (c) — собака, гляну. только код — без экзешника.


smartleds ( 2007-12-08 01:17 ) [27]


© ( 2007-12-08 01:18 ) [28]

> [27] smartleds (08.12.07 01:17)

Ок. Сейчас гляну)


© ( 2007-12-08 01:32 ) [29]

> [27] smartleds (08.12.07 01:17)

А вот теперь сделай как в [15] и все работает. ) Я не шучу)
У тебя не срабатывает условие
if (onezero512[index]>0) then
begin
.
end;
Почему? Сам разбирайся. 🙂
Ну и соответственно тот кусок кода из [15] который находится в then begin . end «в пролете». отсюда и все твои беды)
Почему бы сразу не проверить код на новом пустом проекте без лишних строк кода. Давно бы сообразил в чем дело. )
Удачи)


smartleds ( 2007-12-08 01:34 ) [30]


© ( 2007-12-08 01:43 ) [31]

> [30] smartleds (08.12.07 01:34)

У тебя везде проверка элементов этого(onezero512) массива, но нигде нет его наполнения, т.е. все элементы массива содержат 0.
Отсюда в TForm2.StringGrid1DrawCell, проверка элемента массива с любым индексом, провалена и код «стирания синего выделения» — не выполняется 🙁


smartleds ( 2007-12-08 01:52 ) [32]

Этот массив наполняется при нажатии кнопки insert DMX Channel , элементы этого массива либо 0 либо 1, если 1 то каналы считаются занятыми, и на Гриде эти каналы должны быть выделены красным, чтобы юзер знал что у него занято , а что нет.
Массив содержит 256 байт по количеству ячеек.

Источник

Adblock
detector

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
procedure TForm1.Button1Click(Sender: TObject);
const
  //Количество строк.
  M = 10;
  //Количество столбцов.
  N = 5;
 
  //Константы Excel.
 
  //Группа констант XlInsertShiftDirection.
  xlShiftDown = -4121;
  xlShiftToRight = -4161;
  //Группа констант XlDeleteShiftDirection.
  xlShiftToLeft = -4159;
  xlShiftUp = -4162;
  //Группа констант XlPasteType.
  xlPasteAll = -4104;
  xlPasteAllExceptBorders = 7;
  xlPasteColumnWidths = 8;
  xlPasteComments = -4144;
  xlPasteFormats = -4122;
  xlPasteFormulas = -4123;
  xlPasteFormulasAndNumberFormats = 11;
  xlPasteValidation = 6;
  xlPasteValues = -4163;
  xlPasteValuesAndNumberFormats = 12;
var
  //Ссылки на OLE-интерфейсы объектов Excel.
 
  //Объект Excel.Application.
  ExApp : Variant;
  //Коллекция рабочих книг.
  ExBooks : Variant;
  //Отдельная рабочая книга.
  ExBook : Variant;
  //Коллекция листов рабочей книги.
  ExSheets : Variant;
  //Отдельный рабочий лист рабочей книги.
  ExSheet1 : Variant;
  ExSheet2 : Variant;
  //Диапазон ячеек на листе.
  ExRange1 : Variant;
  ExRange2 : Variant;
  //Диапазон, состоящий из одной ячейки рабочего листа.
  ExCell1 : Variant;
  ExCell2 : Variant;
 
  i, j : Integer;
begin
  try
    ExApp := CreateOleObject('Excel.Application');
    ExApp.Visible := True;
    ExBooks := ExApp.Workbooks;
 
    ExBook := ExBooks.Add;
    //ExBook.Name := 'Рабочая книга для тестирования';
    //Либо так:
    //ExBooks.Add(Name:='Рабочая книга для тестирования');
    //ExBook := ExBooks[1];
 
    //Ссылка на коллекцию рабочих листов в первой
    //рабочей книге.
    ExSheets := ExApp.Workbooks[1].Worksheets;
    //Ссылка на первый рабочий лист в книге.
    ExSheet1 := ExSheets.Item[1];
    //Ссылка на второй рабочий лист в книге.
    ExSheet2 := ExSheets.Item[2];
 
    //Ссылка на ячейку с координатами (1, 1) на
    //первом рабочем листе.
    ExCell1 := ExSheet1.Cells[1, 1];
    //Ссылка на ячейку с координатами (M, N) на
    //первом рабочем листе.
    ExCell2 := ExSheet1.Cells[M, N];
    //Ссылка на диапазон ячеек, охватывающий квадрат
    //(1, 1) - (M, N) на первом рабочем листе.
    ExRange1 := ExSheet1.Cells.Range[ExCell1, ExCell2];
    //Записываем значения в ячейки диапазона ExRange1.
    for i := 1 to M do begin
      for j := 1 to N do begin
        ExRange1.Cells[i, j].Value := 0;
      end;
    end;
 
    //Аналогично для диапазона ячеек на втором рабочем листе.
    ExCell1 := ExSheet2.Cells[1, 1];
    ExCell2 := ExSheet2.Cells[M, N];
    ExRange2 := ExSheet2.Cells.Range[ExCell1, ExCell2];
    for i := 1 to M do begin
      for j := 1 to N do begin
        ExRange2.Cells[i, j].Value := i;
      end;
      //Устанавливаем оформление для ячеек строки.
      case i of
        1..3 : ExRange2.Rows[i].Interior.Color := RGB((i - 1) * 60, (i - 1) * 60, 255);
        4..6 : ExRange2.Rows[i].Interior.Color := RGB((i - 1) * 60, 255, (i - 1) * 60);
        7..9 : ExRange2.Rows[i].Interior.Color := RGB(255, (i - 1) * 60, (i - 1) * 60);
        10   : ExRange2.Rows[i].Interior.Color := RGB(210, 120, 50);
      end;
    end;
 
    //Способы копирования групп (диапазонов) ячеек.
    //Копируем на втором листе, вставляем - на первый лист.
    //Также можно копировать/вставлять на одном и том же листе.
 
    //1. Копирование с перезаписью в целевом диапазоне.
 
    //Скопировать и вставить с перезаписью весь диапазон.
    //ExRange2.Copy( Destination:=ExRange1 );
 
    //Скопировать и вставить с перезаписью отдельную ячейку диапазона.
    //ExRange2.Cells[1, 1].Copy( Destination:=ExRange1.Cells[1, 1] );
 
    //Скопировать и вставить с перезаписью первую строку диапазона.
    //Аналогично делается для столбцов: Columns(1).
    ExRange2.Rows[1].Copy( Destination:=ExRange1.Rows[1] );
 
    //1. Копирование с перезаписью в целевом диапазоне с помощью
    //опций "специальной вставки". - Т. е., можно копировать только
    //значения ячеек или только формулы или только оформление и пр.
 
    //Скопировать и вставить с перезаписью весь диапазон.
    //Копировать только значения ячеек.
    //ExRange2.Copy;
    //ExRange1.Rows[2].PasteSpecial(Paste:=xlPasteValues);
 
    //Скопировать и вставить с перезаписью отдельную ячейку диапазона.
    //Копировать только значения ячеек.
    //ExRange2.Cells[2, 2].Copy;
    //ExRange1.Cells[2, 2].PasteSpecial(Paste:=xlPasteValues);
 
    //Скопировать и вставить с перезаписью вторую строку диапазона.
    //Копировать только значения ячеек.
    //Аналогично делается для столбцов: Columns[2].
    ExRange2.Rows[2].Copy;
    ExRange1.Rows[2].PasteSpecial(Paste:=xlPasteValues);
 
    //Скопировать и вставить с перезаписью третью строку диапазона.
    //Копировать только оформления ячеек.
    //Аналогично делается для столбцов: Columns[3].
    ExRange2.Rows[3].Copy;
    ExRange1.Rows[3].PasteSpecial(Paste:=xlPasteFormats);
 
    //Копирование и вставка в целевом диапазоне со сдвигом ячеек вниз.
 
    //Скопировать и вставить со сдвигом вниз четвёртую строку диапазона.
    ExRange2.Rows[4].Copy;
    ExRange1.Rows[4].Insert(Shift:=xlShiftDown);
    //Для столбцов делается так:
    //Копирование и вставка столбца со сдвигом ячеек вправо.
    //ExRange2.Columns[4].Copy;
    //ExRange1.Columns[4].Insert(Shift:=xlShiftToRight);
 
    //Копирование и вставка в целевом диапазоне со сдвигом ячеек вниз.
    //С применением опций "Специальной вставки".
 
    //Скопировать и вставить со сдвигом вниз пятую строку диапазона.
    //Вставлять только значения.
    ExApp.CutCopyMode := False;
    ExRange1.Rows[5].Insert(Shift:=xlShiftDown, CopyOrigin:=True);
    ExRange2.Rows[5].Copy;
    ExRange1.Rows[5].PasteSpecial(Paste:=xlPasteValues);
  finally
    ExApp := Unassigned;
    ExBooks := Unassigned;
    ExBook := Unassigned;
    ExSheets := Unassigned;
    ExSheet1 := Unassigned;
    ExSheet2 := Unassigned;
    ExRange1 := Unassigned;
    ExRange2 := Unassigned;
    ExCell1 := Unassigned;
    ExCell2 := Unassigned;
  end;
end;

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