Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 501

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Прошу помочь разобраться почему не работает код (см.приложение)
Суть программы в следующем.
В ListBox занесены имена нескольких файлов Excel
Задача - пройтись циклом по файлам Excel и найти строки, удовлетворяющие определенному условию.
В дальнейшем (пока не реализовано, потому как не знаю как делать) найденные строки переносятся в новый лист Excel.
Программа выдает ошибку "OLE Error" при поиске строки....
Помогите .
Al_Sha

Приложение:
  1. procedure TForm2.Button2Click(Sender: TObject);
  2. var
  3. XLApp, XLWorkBook, XLSheet, XLRng: Variant;
  4. k, m: Integer;
  5. Rows, Columns: Integer;
  6. //exApp, exBook, exSheet, XLRng, XLCell: Variant;
  7.  
  8. begin
  9. XlApp := CreateOleObject('Excel.Application');
  10. for k := 0 to ListBox1.Items.Count - 1 do
  11. begin
  12. XLWorkBook := XlApp.WorkBooks.Open(ListBox1.Items.Strings[k]);
  13. XLSheet := XLWorkBook.WorkSheets[1];
  14. XLRng := XLSheet.UsedRange;
  15. XlApp.Visible := True;
  16. // showmessage(Listbox1.Items.Strings[k]);
  17. //showmessage(XLSheet.UsedRange.Rows.Count);
  18. /////////////////////////////////////////////////
  19. for m := 1 to XLSheet.UsedRange.Rows.Count do
  20. begin
  21.  
  22. begin
  23.  
  24. end;
  25. ///////////////////////////////////////////
  26. XlApp.ActiveWorkbook.Close(sListbox1.Items.Strings[k]);
  27. end;
  28. XlApp.Quit;
  29. end;
  30. end;


Al_Sha Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

Al_Sha (статус: Посетитель), 14 июля 2011, 07:09 [#1]:

Спасибо, попробую...
Al_Sha

Al_Sha (статус: Посетитель), 14 июля 2011, 08:08 [#2]:

Попробовал :(
К сожалению ошибка там же -> OLE Error 800A03EC
min@y™

min@y™ (статус: Доктор наук), 14 июля 2011, 08:16 [#3]:

Поищи вот тут, может найдёшь решение.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gooddy

Gooddy (статус: 3-ий класс), 14 июля 2011, 19:35 [#4]:

Заработало?
Чисти код! Чисти код! Чисти код!
Al_Sha

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

Gooddy (статус: 3-ий класс), 14 июля 2011, 19:46 [#6]:

Цитата:

//ПЕРЕНЕС ЗАКРЫТИЕ ФАЙЛА ЗА ЦИКЛ !!!!!!!!!!!

=D.
Точно! После первой итерации файл закрывается и ошибка)
Чисти код! Чисти код! Чисти код!

14 июля 2011, 19:47: Статус вопроса изменён на решённый (изменил автор вопроса — Al_Sha): Помощь экспертов помогла сформировать работающий код....

Al_Sha

Al_Sha (статус: Посетитель), 14 июля 2011, 19:49 [#7]:

Нельзя ли немного прояснить....
не понимаю конструкцию
XLRng.Rows.Count + XLRng.Row - 1 ?????????
Gooddy

Gooddy (статус: 3-ий класс), 14 июля 2011, 19:54 [#8]:

Может банально но я забыл за день. Вроде Rows.Count означает количество рядов относительно чего-то, а Rows.Count + Row - 1 - абсолютную позицию.
Чисти код! Чисти код! Чисти код!
Al_Sha

Al_Sha (статус: Посетитель), 14 июля 2011, 19:57 [#9]:

Ну хорошо, спасибо и на этом.

С уважением
Al_Sha
Gooddy

Gooddy (статус: 3-ий класс), 14 июля 2011, 20:11 [#10]:

Цитата:

С уважением
Al_Sha


С уважением
Gooddy
Чисти код! Чисти код! Чисти код!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.03 сек.