Delphi excel поиск по ячейкам

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls
 
  ,ComObj;
 
type
  TForm1 = class(TForm)
    btnConnect: TButton;
    btnBookCreate: TButton;
    Button1: TButton;
    BtnSendToExcel: TButton;
    BtnGetFromExcel: TButton;
    edSetCell1: TEdit;
    edSetCell2: TEdit;
    edSetCell3: TEdit;
    edSetCell4: TEdit;
    edGetCell1: TEdit;
    edGetCell2: TEdit;
    edGetCell3: TEdit;
    edGetCell4: TEdit;
    btnExcelClose: TButton;
    btnDisconnect: TButton;
    EdTemplate: TEdit;
    BtnReplaceTemplate1: TButton;
    BtnReplaceTemplate2: TButton;
    procedure DisconnectFromExcel;
    procedure btnConnectClick(Sender: TObject);
    procedure btnBookCreateClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BtnSendToExcelClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnExcelCloseClick(Sender: TObject);
    procedure BtnGetFromExcelClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BtnReplaceTemplate1Click(Sender: TObject);
    procedure BtnReplaceTemplate2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
  //Ссылка на OLE-сервер - в данном случае это MS Excel.
  //Эта ссылка представляет собой ссылку на интерфейс IDispatch, который в свою
  //очередь подключен к объекту Excel.Application. Excel.Application это "главный"
  //объект в объектной структуре MS Excel. Через этот объект можно получить доступ
  //ко всем другим объектам MS Excel.
  //В дальнейшем подобные ссылки будем называть просто ссылками.
  exApp              : Variant;
  //Ссылка на коллекцию рабочих книг.
  exWorkBooks        : Variant;
  //Ссылка на конкретную рабочую книгу.
  exWorkBook         : Variant;
  //Ссылка на коллекцию рабочих листов в рабочей книге.
  //В рабочей книге есть 2, вернее, 3 коллекции листов:
  //- коллекция рабочих листов - её представляет объект WorkSheets.
  //- колллекция листов диаграмм - представлена объектом Charts.
  //- общая коллекция листов - представлена объектом Sheets - включает в себя WorkSheets и Charts.
  //К любому листу рабочей книги можно получить доступ через общую коллекцию - Sheets.
  //Но так как в нашем случае работа с диаграммами не требуется
  //то удобней пользоваться коллекцией WorkSheets.
  exWorkSheets       : Variant;
  //Ссылка на конкретный рабочий лист.
  exWorkSheet        : Variant;
 
implementation
 
{$R *.dfm}
 
//Отключение от MS Excel.
//Чтобы отключиться от всех объектов Excel необходимо унчтожить связанные с ними
//интерфейсы. Только в этом случае объекты Excel будут полностью выгружены из
//памяти.
//Интерфейсы OLE автоматизации обслуживаются механизмом "уборки мусора". Т. е. время
//жизни этих объектов определяется значением в их счётчиках ссылок.
//В момент, когда ссылке на интерфейс присваивается другое значение или значение = nil,
//компилятор для прежней ссылки вызывает метод:
//IUnknown(<Прежняя ссылка на интерфейс OLE автоматизации>)._Release;
//Тем самым, значение счётчика ссылок на данный интерфейс уменьшается на единицу.
//Если значение счётчика ссылок оказалось равным нулю, то интерфейс уничтожается.
procedure TForm1.DisconnectFromExcel;
begin
 
  //Освобождаем (уничтожаем) интерфейсы.
 
  (*Можно действовать так:
 
  if TVarData(exWorkSheet).VDispatch <> nil then begin
    TVarData(exWorkSheet).VDispatch := nil;
  end;
 
  if TVarData(exWorkSheets).VDispatch <> nil then begin
    TVarData(exWorkSheets).VDispatch := nil;
  end;
 
  if TVarData(exWorkBook).VDispatch <> nil then begin
    TVarData(exWorkBook).VDispatch := nil;
  end;
 
  if TVarData(exWorkBooks).VDispatch <> nil then begin
    TVarData(exWorkBooks).VDispatch := nil;
  end;
 
  if TVarData(exApp).VDispatch <> nil then begin
    TVarData(exApp).VDispatch := nil;
  end;
  //*)
 
  (*Либо так:
 
  if TVarData(exWorkSheet).VDispatch <> nil then begin
    Finalize(exWorkSheet);
  end;
 
  if TVarData(exWorkSheets).VDispatch <> nil then begin
    Finalize(exWorkSheets);
  end;
 
  if TVarData(exWorkBook).VDispatch <> nil then begin
    Finalize(exWorkBook);
  end;
 
  if TVarData(exWorkBooks).VDispatch <> nil then begin
    Finalize(exWorkBooks);
  end;
 
  if TVarData(exApp).VDispatch <> nil then begin
    Finalize(exApp);
  end;
  //*)
 
  //(*Либо так:
 
  exWorkSheet := Unassigned;
  exWorkSheets := Unassigned;
  exWorkBook := Unassigned;
  exWorkBooks := Unassigned;
  exApp := Unassigned;
  //*)
 
end;
 
//В начале работы обнуляем ссылки на объекты MS Excel.
procedure TForm1.FormCreate(Sender: TObject);
begin
  DisconnectFromExcel;
end;
 
//Подключение к MS Excel.
procedure TForm1.btnConnectClick(Sender: TObject);
begin
  //Кодключение к MS Excel.
  //При этом приложение MS Excel запустится и в переменную
  //exApp будет помещена ссылка на интерфейс IDispatch. (см. описание выше).
  exApp := CreateOleObject('Excel.Application');
  //Делаем видимым главное окно MS Excel.
  exApp.Visible := True;
  //Получаем ссылку на коллекцию рабочих книг.
  exWorkBooks := exApp.WorkBooks;
end;
 
//Создание новой рабочей книги.
procedure TForm1.btnBookCreateClick(Sender: TObject);
begin
  if TVarData(exWorkBooks).VDispatch = nil then begin
    ShowMessage('Нет ссылки на коллекцию рабочих книг. Подключитесь к MS Excel.');
    Exit;
  end;
  //Создаём новую рабочую книгу и получаем на неё ссылку.
  exWorkBook := exWorkBooks.Add;
  //Получаем ссылку на коллекцию рабочих листов этой книги.
  exWorkSheets := exWorkBook.WorkSheets;
end;
 
//Создание нового рабочего листа.
procedure TForm1.Button1Click(Sender: TObject);
begin
  if TVarData(exWorkSheets).VDispatch = nil then begin
    ShowMessage('Нет ссылки на коллекцию рабочих листов. Создайте рабочую книгу MS Excel.');
    Exit;
  end;
  //Создаём новый рабочий лист и получаем на него ссылку.
  exWorkSheet := exWorkSheets.Add;
end;
 
//Запись данных в ячейки на рабочем листе MS Excel.
procedure TForm1.BtnSendToExcelClick(Sender: TObject);
begin
  if TVarData(exWorkSheet).VDispatch = nil then begin
    ShowMessage('Нет ссылки на рабочий лист. Создайте рабочий лист MS Excel.');
    Exit;
  end;
  //Ячейки в MS Excel адресуются парой индексов: строки и столбца. Индексы начинаются с 1.
  exWorkSheet.Cells.Item[1, 1].Value := edSetCell1.Text;
  exWorkSheet.Cells.Item[1, 2].Value := edSetCell2.Text;
  exWorkSheet.Cells.Item[1, 3].Value := edSetCell3.Text;
  exWorkSheet.Cells.Item[1, 4].Value := edSetCell4.Text;
end;
 
//Чтение данных из ячеек на рабочем листе MS Excel.
procedure TForm1.BtnGetFromExcelClick(Sender: TObject);
begin
  if TVarData(exWorkSheet).VDispatch = nil then begin
    ShowMessage('Нет ссылки на рабочий лист. Создайте рабочий лист MS Excel.');
    Exit;
  end;
  //Ячейки в MS Excel адресуются парой индексов: строки и столбца. Индексы начинаются с 1.
  edGetCell1.Text := exWorkSheet.Cells.Item[1, 1].Value;
  edGetCell2.Text := exWorkSheet.Cells.Item[1, 2].Value;
  edGetCell3.Text := exWorkSheet.Cells.Item[1, 3].Value;
  edGetCell4.Text := exWorkSheet.Cells.Item[1, 4].Value;
end;
 
//Закрытие MS Excel.
procedure TForm1.btnExcelCloseClick(Sender: TObject);
begin
  if TVarData(exApp).VDispatch = nil then begin
    ShowMessage('В настоящее время связь с MS Excel отсутствует. Отключение не требуется.');
    Exit;
  end;
  //Попытка закрыть MS Excel. При этом, если в книгах остались не сохраненные
  //изменения, то пользователю будет показано окно с предложением сохранить изменения.
  //Пользователь может сохранить или не сохранить данные.
  //Либо вообще может отказаться от закрытия MS Excel выбрав: "Отмена".
  exApp.Quit;
  //Независимо от того: закрыл пользователь MS Excel или нет - отключаемся от MS Excel.
  DisconnectFromExcel;
end;
 
//Обнуление ссылок на объекты MS Excel. (Отключение от MS Excel).
//(см. описание к процедуре DisconnectFromExcel).
procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
  DisconnectFromExcel;
end;
 
//Медленный метод.
procedure TForm1.BtnReplaceTemplate1Click(Sender: TObject);
var
  //Ссылка на используемый диапазон. - Это прямоугольная область, охватывающая
  //все непустые ячейки на листе.
  exUsedRange : Variant;
  //Индексы для циклов.
  i, j : Integer;
  //Строка шаблона.
  StrTemplate : String;
  //Строка, содержащая представление текущей даты. Предназначена для замены строки
  //шаблона в ячейках Excel.
  StrDate : String;
  //Строка, содержащая весь текст текущей ячейки.
  StrTmp : String;
  //Позиция первого символа, принадлежащего шаблону.
  Pos1 : Integer;
begin
  if TVarData(exWorkSheet).VDispatch = nil then begin
    ShowMessage('Нет связи с рабочим листом. Действие отменено.');
    Exit;
  end;
  //Строка шаблона.
  StrTemplate := AnsiUpperCase(EdTemplate.Text);
  if StrTemplate = '' then begin
    EdTemplate.Text := '##date##';
    StrTemplate := AnsiUpperCase(EdTemplate.Text);
  end;
  //Строка замены шаблона.
  DateTimeToString(StrDate, 'dd.mm.yyyy', Date);
  //Ссылка на объект, представляющий "используемый диапазон".
  exUsedRange := exWorkSheet.UsedRange;
  //Цикл по всем ячейкам листа, принадлежащим используемому диапазону.
  for i := 1 to exUsedRange.Rows.Count do begin
    for j := 1 to exUsedRange.Columns.Count do begin
      //Читаем текст из очередной ячейки.
      StrTmp := exUsedRange.Cells[i, j].Value;
      //Ищем шаблон в тексте.
      Pos1 := Pos(StrTemplate, AnsiUpperCase(StrTmp));
      //Если шаблон найден, заменяем его на строковое представление текущей даты.
      if Pos1 <> 0 then begin
        //Удаляем шаблон из строки.
        Delete(StrTmp, Pos1, Length(StrTemplate));
        //В место, где раньше находился шаблон вставляем строковое представление
        //текущей даты.
        Insert(StrDate, StrTmp, Pos1);
        //Записываем полученный текст в ячейку.
        exUsedRange.Cells[i, j].Value := StrTmp;
      end;
    end;
  end;
 
  //Обнуляем ссылку на интерфейс объекта автоматизации - тем самым уничтожаем его
  //и освобождаем выделенную для него память.
  exUsedRange := Unassigned;
end;
 
//Замена шаблона. Быстрый метод.
procedure TForm1.BtnReplaceTemplate2Click(Sender: TObject);
const
  xlValues = -4163;
var
  //Ссылка на используемый диапазон. - Это прямоугольная область, охватывающая
  //все непустые ячейки на листе.
  exUsedRange : Variant;
  //Ссылки на ячейки.
  exCell, exCellStart : Variant;
  //Строка шаблона.
  StrTemplate : String;
  //Строка, содержащая представление текущей даты. Предназначена для замены строки
  //шаблона в ячейках Excel.
  StrDate : String;
  //Строка, содержащая весь текст текущей ячейки.
  StrTmp : String;
  //Позиция первого символа, принадлежащего шаблону.
  Pos1 : Integer;
begin
  if TVarData(exWorkSheet).VDispatch = nil then begin
    ShowMessage('Нет связи с рабочим листом. Действие отменено.');
    Exit;
  end;
  //Строка шаблона.
  StrTemplate := AnsiUpperCase(EdTemplate.Text);
  if StrTemplate = '' then begin
    EdTemplate.Text := '##date##';
    StrTemplate := AnsiUpperCase(EdTemplate.Text);
  end;
  //Строка замены шаблона.
  DateTimeToString(StrDate, 'dd.mm.yyyy', Date);
  //Ссылка на объект, представляющий "используемый диапазон".
  exUsedRange := exWorkSheet.UsedRange;
  //Поиск. MatchCase:=False - поиск независит от регистра букв.
  exCell := exUsedRange.Find(What:=StrTemplate, LookIn:=xlValues, MatchCase:=False);
  exCellStart := exCell;
  while TVarData(exCell).VDispatch <> nil do begin
    //Читаем текст из очередной найденной ячейки.
    StrTmp := exCell.Value;
    //Ищем шаблон в тексте.
    Pos1 := Pos(StrTemplate, AnsiUpperCase(StrTmp));
    //Если шаблон найден, заменяем его на строковое представление текущей даты.
    if Pos1 <> 0 then begin
      //Удаляем шаблон из строки.
      Delete(StrTmp, Pos1, Length(StrTemplate));
      //В место, где раньше находился шаблон вставляем строковое представление
      //текущей даты.
      Insert(StrDate, StrTmp, Pos1);
      //Записываем полученный текст в ячейку.
      exCell.Value := StrTmp;
    end;
    //Ищем следующую ячейку.
    exCell := exUsedRange.FindNext(After:=exCell);
    //Если вновь найденная ячейка совпадает со стартовой ячейкой - выходим.
    if TVarData(exCell).VDispatch = TVarData(exCellStart).VDispatch then begin
      Break;
    end;
  end;
 
  //Обнуляем ссылки на интерфейсы объектов автоматизации.
  exCell := Unassigned;
  exCellStart := Unassigned;
  exUsedRange := Unassigned;
 
end;
 
end.


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

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

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Организация поиска текста в файле Excel 

:(

   

Опции темы

Dukalys
Дата 6.9.2010, 20:50 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Новичок

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

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

День добрый. Подскажите каким инструментом Delphi можно организовать поиск в Excel (2007), желательно с примером.

Поиск должен осуществляться ТОЛЬКО по столбцу A Excel, при этом, при нахождении нужного, необходимо записывать данные текущей строки из ячеек B, C в переменные/массив (неважно).
Результатом поиска является МНОЖЕСТВО строк. Хорошо бы если результатом поиска являлись бы строки или конкретные ячейки A101 …

P.S. Перерыл кучу материала ( в том числе книг), нашёл следующее — 
Ссылка1 — поиск определяет только найдено (true) или ненайдено (false) — а хочется номер ячейки ( лучше строки) — чегото материального.
Ссылка2 — поиск данных на листе, в конце интересный repeat until которого я непонимаю, может через него можно выйти на нужное мне.
Ссылка3 — тоже поиск данных, который резко оканчивается Find().Activate; что этот активейт, куда он что возвращает, для меня загадка.

На вашем форуме почитал темы интересные про работу с Excel, но тем с подробным решением данной задачи так и не нашёл.

Это сообщение отредактировал(а) Dukalys — 6.9.2010, 20:55

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




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

Цитата

Yersinia pestis
****

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

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

Ну, проходи циклом по листу и ищи, что нужно. Способ медленный, но верный.

———————

There’s nothing left but silent epitaphs.

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




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

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

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

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

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




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

Цитата

Yersinia pestis
****

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

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

Цитата(okkonst @ 6.9.2010,  23:34)
а еще лучше — запиши макрос, который бы делал то, что тебе нужно (имеется ввиду — нажми «запись макроса» и соверши нужные действия), а сгенеренный код транслируй в дельфи. Там же отличный поиск есть…

Согласен, это ещё лучше: я сиё предположил, но не стал пока озвучивать.

———————

There’s nothing left but silent epitaphs.

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




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

Цитата

Новичок

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

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

Ребят спасиб. С макросами я ещё не работал, если честно то даже ммм не представляю что придётся делать. можете это описать как-то. как придётся транслировать …

А что касается цикла с проверкой каждой ячейки совпадает ли значение (true) то это наверное долго — в файле Excel 200 000 строк. и перебирать в цикле и обращаться к каждой ячейке это жёстко.

P.S. Возможно ли все данные их Excel как-то по-умному рассовать по массивам в Дельфи ? (получается 3 столбца(массива) of String по 200 000) так чтобы вначале программы это заняло секунд 15-20 или меньше. Мне кажется что потом в итоге это съэкономит кучу времени и сил. спасибо за ответы.

Это сообщение отредактировал(а) Dukalys — 7.9.2010, 06:44

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




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

Цитата

Evil Skynet
****

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

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

Цитата(Dukalys @  6.9.2010,  20:50 Найти цитируемый пост)
Ссылка3 — тоже поиск данных, который резко оканчивается Find().Activate; что этот активейт, куда он что возвращает, для меня загадка.

выделяется найденная ячейка

координаты можно получить дав команды в стиле:

Код

column:= ExcelWorksheet1.Columns.Column; 
row:=ExcelWorksheet1.Rows.Row;

———————

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

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




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

Цитата

Новичок

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

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

Попробовал …
Итого — не работает.
подробнее:

Выдержки из первоисточника (книги):

1. «Если задана область ячеек и получена ссылка на неё, то количество столбцов будет определяться свойством Count коллекции Columns объекта Range, а количество строк — свойством Count коллекции Rows объекта Range». Доступ ко всем строкам и столбцам листа рабочей книги предоставляют коллекции Rows и Columns объекта ActiveSheet — активного листа рабочей книги.

2. «Мы определились, что ячейка всегда определяется объектами Range или Cells»

Такая многозначность + отсутствие в Delphi предввода методов, свойств (Excel. пусто) для работы с Excel меня загоняет в тупик.

Код

FindRange := WB.ActiveSheet.Cells.Find(What:=Edit2.Text).Activate; //находит и выделяет

Form1.Edit3.Text := IntToStr(WB.ActiveSheet.Rows.Row); //ролсрой
Form1.Edit4.Text := IntToStr(WB.ActiveSheet.Columns.Column);

Form1.Edit5.Text := IntToStr(WB.ActiveSheet.Cells.Row);
Form1.Edit6.Text := IntToStr(WB.ActiveSheet.Cells.Column);

Во всех эдитах значение = 1   (реальное расположение ПРАВИЛЬНО НАЙДЕННОЙ И ВЫДЕЛЕННОЙ ячейки = ‘B3’=(2,3))

Методом подбора — получить какое либо свойство из FindRange (типа Row) так и не получилось.

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

прога прикреплена.

P.S. есть у когонить идеи по этому поводу ??? Я в нете коечто нарыл — Ссылко Похоже от туда можно коечто выдернуть, через 2 часика проверю и отпишусь.

Это сообщение отредактировал(а) Dukalys — 8.9.2010, 13:28

Присоединённый файл ( Кол-во скачиваний: 8 )

Присоединённый файл
 pr138_1.zip 394,04 Kb

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




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

Цитата

Evil Skynet
****

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

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

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

Код
...
 Form1.Edit3.Text := E.ActiveCell.Row;
 Form1.Edit4.Text := E.ActiveCell.Column;
...

———————

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

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




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

Цитата

Новичок

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

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

Цитата

 Form1.Edit3.Text := E.ActiveCell.Row;
 Form1.Edit4.Text := E.ActiveCell.Column;

Оргомное спасибо код работает !!!

Ребят а вот смотрите заметил какую особенность при выполнении метода «Find» для Cells и для Range

Код
 FindRange := WB.ActiveSheet.Cells.Find(What:=Edit2.Text).Activate; 

Выделяет правильную ячейку 3,2

Код
 FindRange := WB.ActiveSheet.Range[Edit1.Text].Find(What:=Edit2.Text).Activate; 

Выделяет 4 ячейку вместо третьей и по выше приведённых свойствам возвращает 4,2

ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ?

Это сообщение отредактировал(а) Dukalys — 8.9.2010, 14:59

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




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

Цитата

Evil Skynet
****

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

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

Цитата(Dukalys @  8.9.2010,  14:36 Найти цитируемый пост)
ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ?

Это если запускать в любой последовательности???

———————

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

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




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

Цитата

Новичок

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

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

Несовсем догоняю что имеете ввиду здесь про последовательность (начало поиска — с начала документа или конца ?). результат поиска с начала документа — искомой строки, ссылается на последующую строку, вродебы всё время …

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




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

Цитата

Evil Skynet
****

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

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

хм… у тебя в приложенном проекте, если не ошибаюсь, было 2 кнопки, где реализовано 2-мя способами поиск, вот я и спрашиваю в какой последовательности запускаешь…

———————

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

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




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

Цитата

Новичок

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

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

Код

Function FindValueInCell(ExcelWS : TExcelWorksheet; What : string; var CellsFound : TList<TPositionCell>) : Boolean;
var
Found : ExcelRange;
Addr, Addr2 : String;
Position : TPositionCell;
begin
 Result := False;
 //Выполняем поиск в пределах используемого дипазона.
 //Поиск. MatchCase:=False - поиск не зависит от регистра букв.
 // xlPart - по сопадению
 // xlWhole - точное
 Found := ExcelWS.Cells.Find(What, EmptyParam, xlValues, xlWhole, xlByRows, xlNext, False, EmptyParam);
 if Assigned(Found) then
 begin
   Result := True;
   Addr   := Found.Address[True, True, xlA1, EmptyParam, EmptyParam];
   Position.Col  := Found.Column;
   Position.Row  := Found.Row;
   CellsFound.Add(Position);
   repeat
       Found := ExcelWS.Cells.FindNext(Found);
       if Assigned(Found) then
       begin
          Addr2  := Found.Address[True, True, xlA1, EmptyParam, EmptyParam];
          // адрес совпал (круг завершен)
          if SameText(Addr, Addr2) then Break;

          Position.Col  := Found.Column;
          Position.Row  := Found.Row;
          CellsFound.Add(Position);
       end;
   // выход если не найдено
   until not Assigned(Found)
 end;
end;

Procedure Find;
var
 ListCellFound : TList<TPositionCell>;
 I, Row, Col : Integer;
begin
 ListCellFound := TList<TPositionCell>.Create;
 if FindValueInCell(ExcelWS, 'Что искать', ListCellFound) then
 begin
    for I := 0 to ListCellFound.Count-1 do
    begin
        Col := ListCellFound.Items[I].Col;
        Row := ListCellFound.Items[I].Row;
    end;
 end;
 if Assigned(ListCellFound) then FreeAndNil(ListCellFound);
end;

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «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 | Следующая тема »

Delphi excel поиск по ячейкам

Junior Member Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Код:

function FindExcel(const fnd: string; var aCol, aRow: Word): String;
procedure CloseWorkBook(WorkBookName: Ansistring);
procedure CheckExtension(Name: Ansistring);
function WorkBookIndex(WorkBookName: Ansistring): integer;
procedure OpenWorkBook(WorkBookName: Ansistring);
procedure CloseExcel;
procedure CallExcel(Show: boolean);
function WorkSheetIndex(WorkBookName, WorkSheetName: Ansistring): integer;

type
TForm1 = class(TForm)
.
.
.
Var Excel: Variant;

procedure CallExcel(Show: boolean);
begin
if VarIsEmpty(Excel) = true then
begin
Excel := CreateOleObject(‘Excel.Application’);
if Show then Excel.Visible := true;
end;
end;

procedure CloseExcel;
begin
if VarIsEmpty(Excel) = false then
begin
Excel.Quit; Excel := 0;
end;
end;

procedure OpenWorkBook(WorkBookName: Ansistring);
var
k: integer;
begin
CheckExtension(WorkBookName);
if VarIsEmpty(Excel) = true then
begin
Excel := CreateOleObject(‘Excel.Application’); Excel.Visible := true;
end;
k := WorkBookIndex(WorkBookName);
if k = 0 then Excel.Workbooks.Open(WorkBookName)
else
MessageDlg(‘. ‘, mtWarning, [mbOk], 0);
end;

procedure CheckExtension(Name: Ansistring);
var s: string;
begin
s := ExtractFileExt(Name);
if LowerCase(s) <> ‘.xls’ then
if LowerCase(s) <> ‘.xlsx’ then
if MessageDlg(‘Расширение не соответствует. Открыть ?’,
mtWarning, [mbYes, mbCancel], 0) = mrCancel then Abort;
end;

Источник

Adblock
detector

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    user posted image

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

    Соблюдайте общие правила форума

    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как запустить программу/файл? (и дождаться ее завершения)
    5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
    … (продолжение следует) …


    Внимание:
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки — бан.
    Мат в разделе — бан на три месяца…


    Полезные ссылки:
    user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


    Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

    >
    DELPHI.EXCEL.необычная задача программы
    , Поиск ячейки с по определенному слову в «комментарии» и опре

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    11.07.07, 18:07

      Junior

      *

      Рейтинг (т): 0

      Всем доброго времени суток ;)

      Есть такая задача:
      Нужно программным способом организовать поиск в ячейках excel документа на наличие «коментария».
      Если ячейка с «комментарием» найдена, то:
      a) получить текст «комментария»;
      b) получить координаты ячейки;

      Прошу помогите, очень наболевший вопрос.
      Заранее бесконечно благодарен ;)


      Санчес



      Сообщ.
      #2

      ,
      11.07.07, 18:47

        Senior Member

        ****

        Рейтинг (т): 59

        Если умеешь работать с Excel через OLE-автоматизацию, то запиши в Excele макрос, проделав при этом поиск вручную, через Ctrl-F. Исходный текст этого макроса повтори в Delphi-программе. Плюс см. хелп по Visual Basic for Applications (вроде так), эта справка по умолчанию вместе с MS Office не ставится, но можно доустановить.


        ERrorMAKros



        Сообщ.
        #3

        ,
        11.07.07, 19:34

          Junior

          *

          Рейтинг (т): 0

          Макросы буду исключать… Вы как то писали:

          Цитата

          У меня была задача, для решения которой написал макросы в Excel. Позже обнаружилось, что антивирусы (в моем случае Kaspersky) могут блокировать выполнение макросов. Сначала долго удивлялся, почему не работает :). Также Windows XP прибивала Excel при исполнении макроса, если была включена защита DEP (Data Execution Protection).

          Вообщем случилось мне на это попасть… :'(
          Топик: CheckBox в MS-Word

          Спасибо за участие, проблему решил =)

          ExpandedWrap disabled

            procedure TForm1.Button2Click(Sender: TObject);

                 type ExcelVars_=Record

                                 Comm_Count_       : Integer; // кол-во комментариев в ячейках;

                                 pos_comment_String: String;  // сохраняем содержимое комм. ячейки;

                                 pos_comment_positN: String;  // сохраняем позицию;

                                 end; // type

                  var Excel    : Variant;

                      MainData_: ExcelVars_;

                begin Excel := CreateOleObject(‘Excel.Application.9’);

                      Excel .  Application.EnableEvents:= false;

                      Excel .  Visible := True;

                      Excel .  Workbooks.Open(‘x:мои документыкнига1.xls’);

                      MainData_.Comm_Count_:=Excel.ActiveSheet.Comments.Count;

                      MainData_.pos_comment_String:=Excel.ActiveSheet.Comments[MainData_.Comm_Count_].text;

                      MainData_.pos_comment_positN:=Excel.ActiveSheet.Comments[MainData_.Comm_Count_].parent.address;

                      Memo1.Lines.Add(‘  Кол-во комментов на листе: ‘+IntToStr(MainData_.Comm_Count_));

                      Memo1.Lines.Add(‘  Текст последнего коммента: ‘+MainData_.pos_comment_String);

                      Memo1.Lines.Add(‘Позиция последнего коммента: ‘+MainData_.pos_comment_positN);

                      end; // procedure

          Сообщение отредактировано: ERrorMAKros — 11.07.07, 20:07

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • Delphi: Система, Windows API
          • Следующая тема

          Рейтинг@Mail.ru

          [ Script execution time: 0,0207 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

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