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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать, закончились ли строки в excel файле? 
:(
    Опции темы
sgentstuff
Дата 13.7.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня excel 2000 может из-за этого? 
--------------------
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  
PM ICQ   Вверх
Albinos_x
Дата 13.7.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



нет не из-за этого... если посмотреть, то второй код применяется довольно давно и успешно... и если будешь искать примеры по инету, то почти везде найдёшь именно второй способ...

а ошибка возможно в строчках позже... 

на какой строчке ошибка вылезает? 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ошибка именно на этой строке:
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; 
--------------------
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  
PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



код в студию... 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



var
Код

i:integer;
begin
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:\excel\hi');
Excel.Workbooks.Open('D:\excel\hi2');
Excel.Visible := true;

for i:=1 to 4 do
begin
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
{$O-}
 max_rows := Excel.ActiveCell.Row;
{$O+}
end;


эта ошибка вылетает если открыты две книги как ы этом примере, если же открыть только одну книгу то все нормально, считает как надо, у меня в программе открыто несколько книг, что делать?



 

Это сообщение отредактировал(а) Girder - 26.3.2007, 10:04
--------------------
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  
PM ICQ   Вверх
sgentstuff
Дата 14.7.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ура получилось. просто нужно активировать книгу
Excel.WorkBooks[1].Activate;
тогда все работает нормально
Albinos_x - спасибо, выручил! 
--------------------
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  
PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



честно говоря по твоему коду ничего не понятно....

к примеру:
Код
...
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('D:\excel\hi');
Excel.Workbooks.Open('D:\excel\hi2');
Excel.Visible := true;
...

зачем открывать две книги... связь-то у тебя только со второй... ну да ладно... может код не весь...
Код
...
WorkSheet:=Excel.WorkBooks[1].WorkSheets[1];
...

зато здесь мы возвращаемся к первой книге... тогда зачем вторая (?)...

и далее не понятно зачем в цикле четыре раза вычеслять количество строк на одном и том же листе?... 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 14.7.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



отсюда кстати и ошибка вылезала...

работал со второй книгой...

а число строк на листе пытался получить из первой книги...  

Это сообщение отредактировал(а) Albinos_x - 14.7.2006, 14:06


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
sgentstuff
Дата 14.7.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



отсюда кстати и ошибка вылезала...
работал со второй книгой...
а число строк на листе пытался получить из первой книги...  


ЭТО ТОЧНО, теперь все понятно! 
--------------------
Тот, кто ищет миллионы, весьма редко их находит, но тот, кто их не ищет, не находит никогда.  
PM ICQ   Вверх
Albinos_x
Дата 14.7.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Удачи! smile  


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
oleg153
Дата 2.3.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа!
Подскажите пожалуйста, все что можно прочитать я перечитал и рад что у всех работает.
Но я потратил сутки но не смог добится номера последней заполненной строки на листе Excel.

Перепробовал все, но и в delphi7 и delphi 2006 (studio) одна и таже проблемма :
компилятор наотрез не понимает xlCellTypeLastCell.
И там и там ошибка Undeclired Identifire 'xlCellTypeLastCell'. И все. Процесс умирает.

Я не понимаю в чем дело, ЧТО я не так пишу ???
Вот мой код , в таком виде он не работает:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

{$R *.dfm}

{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject);
var BookName1: string;
var j: integer;
begin
 // Выбираем файл базы.
 if OpenDialog1.Execute then
  begin
   BookName1:= OpenDialog1.FileName; // имя книги с полным путем
   //Запускаем Excel
   try
    //Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение
    Excel := GetActiveOleObject('Excel.Application');
    //Проверяем что открыта нужная книга
    for j:=1 to Excel.Workbooks.Count do
     begin
      if Excel.Workbooks.Item[j].FullName=BookName1 then break;
     end;
    // Выбираем WorkBook
    WorkBook := Excel.WorkBooks.Item[j];
   except
    //Запускаем Excel
    Excel := CreateOleObject('Excel.Application');
    //Открываем нужную книгу
    WorkBook := Excel.WorkBooks.Open(BookName1);
   end;
  Excel.Visible:=True;
  end
  else
   begin
    SysUtils.Beep;
    ShowMessage('Не могу открыть Excel!');
    Exit;
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if not VarIsEmpty(Excel) then
  begin
   Excel.Quit;
   Excel := Unassigned;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var X,Y:integer;
begin
  WorkSheet:=WorkBook.WorkSheets[1];
  WorkSheet.Activate;
  WorkSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  X := Excel.ActiveCell.Row;
  Y := Excel.ActiveCell.Column;
  Memo1.Lines.Add('Строк: '+ inttostr(x));
  Memo1.Lines.Add('Столбцов : '+inttostr(y));
end;

end.



Случайно наткнулся по яндексу на пример где отдельно обьявлялся этот параметр
таким образом
Код

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;

const 
  xlCellTypeLastCell = $0000000B;  // ВОТ ТАКИМ ОБРАЗОМ.

{$R *.dfm}


{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject); ..................


Тогда ошибка пропала и все заработало.
Получается что если не используем компоненту ExcelApp то это нужно ОБЯЗАТЕЛЬНО делать ?
тогда почему об этом никто не упоминает ???
PM MAIL   Вверх
Albinos_x
Дата 2.3.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



1. Следовало бы создать отдельную тему.
2. константа - xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:
Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут...), в справке по VB можно посмотреть значение любой из этих констант...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RosemaN
Дата 7.11.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Albinos_x @ 2.3.2007,  23:43)
1. Следовало бы создать отдельную тему.
2. константа - xlCellTypeLastCell объявлена в модуле OfficeXP (/2000/97)
3. Объявлять константу не обязательно, можно и напрямую писать:
Код
...
WorkSheet.Cells.SpecialCells($B, EmptyParam).Activate; // или WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate;
...

4. Excel у всех под рукой (или почти у всех, но у них и такие приложения работать не будут...), в справке по VB можно посмотреть значение любой из этих констант...

1. в таком варианте пишет "could not convert variant of type OleStr into type Double".
Код

 Excel.WorkBooks[1].Activate; // активация рабочей книги 1
  WorkSheet:=Excel.WorkBooks[1].WorkSheets[1]; //активация листа 1 рабочей книги 1
  WorkSheet.Cells.SpecialCells(11, EmptyParam).Activate; // эту строчку я не совсем понял. Что она активирует?
  max_rows := Excel.ActiveCell.Row; // записывает в переменную номер ячейки (последней непустой?) 

2. думал что переменная max_rows должна быть типа int, ошибка, описанная выше...  smile 
3. где можно взять справочник по этим всем функциям и свойствам?
PM MAIL   Вверх
Albinos_x
Дата 7.11.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



код в студию


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
kuzduk
Дата 10.4.2020, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

XL := CreateOleObject('Excel.Application');
XL.Workbooks.Open(ExcelFilePath);

//Первый вариант:
UsedRowCount := iSheet.UsedRange.Rows.Count;  //Если у тебя заняты первые десять строк то вернёт 10. Однако если идут первые две строки пустые, а потом 10 занятых, то один хрен вернёт 10, ибо возвращает количество занятых строк.
UsedColCount := iSheet.UsedRange.Columns.Count;
FirstUsedRow := iSheet.UsedRange.Row; //Номер первой строки в которой прописана ячейка
FirstUsedCol := iSheet.UsedRange.Column; //Номер первой колонки в которой прописана ячейка
LastUsedRow  := FirstUsedRow + UsedRowCount - 1;
LastUsedCol  := FirstUsedCol + UsedColCount - 1;
     

//Второй вариант: через активацию последней непустой ячейки
//const xlCellTypeLastCell = $0000000B;
iSheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; //Если лист пуст(ни одна ячейка не прописана), то строка вызывает ошибку
LastUsedRow := XL.ActiveCell.Row;
LastUsedCol := XL.ActiveCell.Column;

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1513 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.