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 |
|
||
Новичок Профиль Репутация: нет
|
День добрый. Подскажите каким инструментом Delphi можно организовать поиск в Excel (2007), желательно с примером. Поиск должен осуществляться ТОЛЬКО по столбцу A Excel, при этом, при нахождении нужного, необходимо записывать данные текущей строки из ячеек B, C в переменные/массив (неважно). P.S. Перерыл кучу материала ( в том числе книг), нашёл следующее — На вашем форуме почитал темы интересные про работу с Excel, но тем с подробным решением данной задачи так и не нашёл. Это сообщение отредактировал(а) Dukalys — 6.9.2010, 20:55 |
||
|
|||
Данкинг |
|
||
Yersinia pestis Профиль
Репутация: 5
|
Ну, проходи циклом по листу и ищи, что нужно. Способ медленный, но верный. ——————— There’s nothing left but silent epitaphs. |
||
|
|||
okkonst |
|
||
Новичок Профиль
Репутация: нет
|
а еще лучше — запиши макрос, который бы делал то, что тебе нужно (имеется ввиду — нажми «запись макроса» и соверши нужные действия), а сгенеренный код транслируй в дельфи. Там же отличный поиск есть… |
||
|
|||
Данкинг |
|
||
Yersinia pestis Профиль
Репутация: 5
|
Согласен, это ещё лучше: я сиё предположил, но не стал пока озвучивать. ——————— There’s nothing left but silent epitaphs. |
||
|
|||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Ребят спасиб. С макросами я ещё не работал, если честно то даже ммм не представляю что придётся делать. можете это описать как-то. как придётся транслировать … А что касается цикла с проверкой каждой ячейки совпадает ли значение (true) то это наверное долго — в файле Excel 200 000 строк. и перебирать в цикле и обращаться к каждой ячейке это жёстко. P.S. Возможно ли все данные их Excel как-то по-умному рассовать по массивам в Дельфи ? (получается 3 столбца(массива) of String по 200 000) так чтобы вначале программы это заняло секунд 15-20 или меньше. Мне кажется что потом в итоге это съэкономит кучу времени и сил. спасибо за ответы. Это сообщение отредактировал(а) Dukalys — 7.9.2010, 06:44 |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
выделяется найденная ячейка координаты можно получить дав команды в стиле:
——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Попробовал … Выдержки из первоисточника (книги): 1. «Если задана область ячеек и получена ссылка на неё, то количество столбцов будет определяться свойством Count коллекции Columns объекта Range, а количество строк — свойством Count коллекции Rows объекта Range». Доступ ко всем строкам и столбцам листа рабочей книги предоставляют коллекции Rows и Columns объекта ActiveSheet — активного листа рабочей книги. 2. «Мы определились, что ячейка всегда определяется объектами Range или Cells» Такая многозначность + отсутствие в Delphi предввода методов, свойств (Excel. пусто) для работы с Excel меня загоняет в тупик.
Во всех эдитах значение = 1 (реальное расположение ПРАВИЛЬНО НАЙДЕННОЙ И ВЫДЕЛЕННОЙ ячейки = ‘B3’=(2,3)) Методом подбора — получить какое либо свойство из FindRange (типа Row) так и не получилось. Выкладываю пример программы — теста, с которой работаю. за основу взята криво написанная (в том числе и мной) программа из нета и неудачно адаптирована под поиск координат ячейки. прога прикреплена. P.S. есть у когонить идеи по этому поводу ??? Я в нете коечто нарыл — Ссылко Похоже от туда можно коечто выдернуть, через 2 часика проверю и отпишусь. Это сообщение отредактировал(а) Dukalys — 8.9.2010, 13:28 Присоединённый файл ( Кол-во скачиваний: 8 ) |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
сделай так, это самый простой вариант:
——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Dukalys |
|
||||||
Новичок Профиль Репутация: нет
|
Оргомное спасибо код работает !!! Ребят а вот смотрите заметил какую особенность при выполнении метода «Find» для Cells и для Range
Выделяет правильную ячейку 3,2
Выделяет 4 ячейку вместо третьей и по выше приведённых свойствам возвращает 4,2 ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ? Это сообщение отредактировал(а) Dukalys — 8.9.2010, 14:59 |
||||||
|
|||||||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
Это если запускать в любой последовательности??? ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Несовсем догоняю что имеете ввиду здесь про последовательность (начало поиска — с начала документа или конца ?). результат поиска с начала документа — искомой строки, ссылается на последующую строку, вродебы всё время … |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
хм… у тебя в приложенном проекте, если не ошибаюсь, было 2 кнопки, где реализовано 2-мя способами поиск, вот я и спрашиваю в какой последовательности запускаешь… ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Deeptown12 |
|
||
Новичок Профиль Репутация: нет
|
|
||
|
|||
|
Правила форума «Delphi: ActiveX/СОМ/CORBA» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, 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
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Соблюдайте общие правила форума
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
… (продолжение следует) …
Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки — бан.
Мат в разделе — бан на три месяца…
Полезные ссылки:
MSDN Library FAQ раздела Поиск по разделу Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid
DELPHI.EXCEL.необычная задача программы
, Поиск ячейки с по определенному слову в «комментарии» и опре
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): 0 |
Всем доброго времени суток Есть такая задача: Прошу помогите, очень наболевший вопрос. |
Санчес |
|
Senior Member Рейтинг (т): 59 |
Если умеешь работать с Excel через OLE-автоматизацию, то запиши в Excele макрос, проделав при этом поиск вручную, через Ctrl-F. Исходный текст этого макроса повтори в Delphi-программе. Плюс см. хелп по Visual Basic for Applications (вроде так), эта справка по умолчанию вместе с MS Office не ставится, но можно доустановить. |
ERrorMAKros |
|
Junior Рейтинг (т): 0 |
Макросы буду исключать… Вы как то писали: Цитата У меня была задача, для решения которой написал макросы в Excel. Позже обнаружилось, что антивирусы (в моем случае Kaspersky) могут блокировать выполнение макросов. Сначала долго удивлялся, почему не работает . Также Windows XP прибивала Excel при исполнении макроса, если была включена защита DEP (Data Execution Protection). Вообщем случилось мне на это попасть… Спасибо за участие, проблему решил =)
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
- Следующая тема
[ Script execution time: 0,0207 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]