| 
| 
 | Вопрос # 5 501/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Прошу помочь разобраться почему не работает код (см.приложение)
 Суть программы в следующем.
 В ListBox занесены имена нескольких файлов Excel
 Задача - пройтись циклом по файлам Excel и найти строки, удовлетворяющие определенному условию.
 В дальнейшем (пока не реализовано, потому как не знаю как делать) найденные строки переносятся в новый лист Excel.
 Программа выдает ошибку "OLE Error" при поиске строки....
 Помогите .
 Al_Sha
 Приложение:Переключить в обычный режим procedure TForm2.Button2Click(Sender: TObject);var  XLApp, XLWorkBook, XLSheet, XLRng: Variant;  k, m: Integer;  Rows, Columns: Integer;  //exApp, exBook, exSheet, XLRng, XLCell: Variant; begin  XlApp := CreateOleObject('Excel.Application');  for k := 0 to ListBox1.Items.Count - 1 do begin    XLWorkBook := XlApp.WorkBooks.Open(ListBox1.Items.Strings[k]);    XLSheet := XLWorkBook.WorkSheets[1];    XLRng := XLSheet.UsedRange;        XlApp.Visible := True;    // showmessage(Listbox1.Items.Strings[k]);    //showmessage(XLSheet.UsedRange.Rows.Count);    /////////////////////////////////////////////////    for m := 1 to XLSheet.UsedRange.Rows.Count dobegin  begin end;   ///////////////////////////////////////////    XlApp.ActiveWorkbook.Close(sListbox1.Items.Strings[k]);end;      XlApp.Quit;end;end;
|  |   Вопрос задал: Al_Sha (статус: Посетитель)Вопрос отправлен: 13 июля 2011, 22:22
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Gooddy Здравствуйте, Al_Sha!Подозреваю, что нужно заменить:
 XLSheet.UsedRange.Rows.Count
 
 На:
 XLRng.Rows.Count + XLRng.Row - 1
 
|  | Ответ отправил: Gooddy (статус: 3-ий класс)Время отправки: 13 июля 2011, 22:35
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Шичко Игорь Здравствуйте, Al_Sha!В цикле у Вас недопустимое обращение к ячейке
 XlApp.Cells[m, 1].Value
 Ячейка принадлежит листу. Поэтому правильный код для цикла:
 
 ...
 for m := 1 to XLSheet.UsedRange.Rows.Count do
 begin
 if VarToStr(XLSheet.Cells[m, 1].Value) = 'Яблоки' then
 begin
 showmessage('Есть...');
 end;
 end;
 ...
 
 Одновременно преобразуем значение вариантной переменной в строковую (VarToStr) для операции сравнения.
 Удачи.
 
|  | Ответ отправил: Шичко Игорь (статус: 9-ый класс)Время отправки: 14 июля 2011, 09:53
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 14 июля 2011, 20:11; участников в обсуждении: 3. 
|   | Al_Sha (статус: Посетитель), 14 июля 2011, 07:09 [#1]:Спасибо, попробую... |  
|   | Al_Sha (статус: Посетитель), 14 июля 2011, 08:08 [#2]:Попробовал  К сожалению ошибка там же -> OLE Error 800A03EC
 |  
|   | min@y™ (статус: Доктор наук), 14 июля 2011, 08:16 [#3]:Поищи вот тут, может найдёшь решение. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 14 июля 2011, 19:35 [#4]:Заработало? Чисти код! Чисти код! Чисти код! |  
|   | Al_Sha (статус: Посетитель), 14 июля 2011, 19:44 [#5]:Спасибо всем. И с Вашей помощью и своими домыслами разобрался.
 Вот код который работает, по крайней мере мне так кажется...
 
 procedure TForm2.sButton2Click(Sender: TObject);
 var
 XLApp, XLWorkBook, XLSheet: Variant;
 k, m: Integer;
 XLRng: Variant;
 
 begin
 XlApp := CreateOleObject(\'Excel.Application\');
 for k := 0 to ListBox1.Items.Count - 1 do
 begin
 XLWorkBook := XlApp.WorkBooks.Open(ListBox1.Items.Strings[k]);
 XLSheet := XLWorkBook.WorkSheets.Item[1];
 XLRng := XLSheet.UsedRange;
 // XlApp.Visible := True;
 showmessage(Listbox1.Items.Strings[k]);
 showmessage(XLSheet.UsedRange.Rows.Count);
 for m := 1 to XLRng.Rows.Count + XLRng.Row - 1 do
 begin
 if XLSheet.Cells.Item[m, 1].Value=\'Яблоки\'  then
 begin
 showmessage(\'Есть...\');
 end;
 end;
 //ПЕРЕНЕС ЗАКРЫТИЕ ФАЙЛА ЗА ЦИКЛ !!!!!!!!!!!
 XlApp.ActiveWorkbook.Close(Listbox1.Items.Strings[k]);
 XlApp.Quit;
 end;
 end;
 |  
|   | Gooddy (статус: 3-ий класс), 14 июля 2011, 19:46 [#6]: Цитата: //ПЕРЕНЕС ЗАКРЫТИЕ ФАЙЛА ЗА ЦИКЛ !!!!!!!!!!! =D.
 Точно! После первой итерации файл закрывается и ошибка)
 Чисти код! Чисти код! Чисти код! |  14 июля 2011, 19:47: Статус вопроса изменён на решённый (изменил автор вопроса — Al_Sha): Помощь экспертов помогла сформировать работающий код.... 
|   | Al_Sha (статус: Посетитель), 14 июля 2011, 19:49 [#7]:Нельзя ли немного прояснить.... не понимаю конструкцию
 XLRng.Rows.Count + XLRng.Row - 1 ?????????
 |  
|   | Gooddy (статус: 3-ий класс), 14 июля 2011, 19:54 [#8]:Может банально но я забыл за день. Вроде Rows.Count означает количество рядов относительно чего-то, а Rows.Count + Row - 1 - абсолютную позицию. Чисти код! Чисти код! Чисти код! |  
|   | Al_Sha (статус: Посетитель), 14 июля 2011, 19:57 [#9]:Ну хорошо, спасибо и на этом. 
 С уважением
 Al_Sha
 |  
|   | Gooddy (статус: 3-ий класс), 14 июля 2011, 20:11 [#10]: Цитата: С уважениемAl_Sha
 
 С уважением
 Gooddy
 Чисти код! Чисти код! Чисти код! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |