|
Вопрос # 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 do
- begin
-
- 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
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|