Текущий архив: 2004.08.29;
Скачать: CL | DM;
Вниз
Как определить конец документа? Найти похожие ветки
← →
V l a d i m i r (2004-08-12 11:40) [0]Доброго всем дня! Уже вторую неделю ломаю голову над этим вопросом… Собственно, как получить информацию из документа я знаю. Например, я делаю это следующим образом: информация хранится в первом листе документа Excel, и доступ к ячейкам в упрощенном виде можно показать на следующем примере: размещаю на форме компонент типа TexcelApplication (Name: XLApp, свойство ConnectKind: ckNewInstance):
procedure TForm1.Button1Click(Sender: TObject);
var
WorkBook, Sheet: Variant;
FileLocate: WideString;
Info: String;
Begin
XLApp.Connect;
FileLocate := "C:\1.xls";
//Открываю файл Excel
XLApp.WorkBooks.Open(FileLocate, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam,0);
//Открываю книгу и обращаюсь к первому листу
WorkBook := XLApp.WorkBooks.Item[1];
Sheet:=XLApp.Application.Worksheets.Item[1];
//Читаю вторую строку и второй столбец, т.е ячейку, содержащую любую информацию
Info:=Sheet.Cells[2,2];
ShowMessage(Info);
End;
Таким образом, в первом листе документа заполнена только ячейка со вторым столбцом и второй строкой. Следовательно, конец документа – вторая строка… Как можно определить, конец документа? То есть получить последнюю строку, после которой документ пуст?
← →
Ega23 © (2004-08-12 11:43) [1]А может-ли это сделать сам Excel?
← →
nasty © (2004-08-12 11:49) [2]ну это же так просто -)
Sheet.UsedRange
← →
V l a d i m i r (2004-08-12 12:19) [3]
> nasty ©
> Sheet.UsedRange
... я неточно поставил вопрос... Мне нужно получить НОМЕР последней строки, после которой документ пуст.
← →
V l a d i m i r (2004-08-12 12:45) [4]Подскажите хотя бы, какие статьи прочитать можно на эту тему, плз...
← →
Ega23 © (2004-08-12 12:46) [5]Подскажите хотя бы, какие статьи прочитать можно на эту тему, плз...
Я могу только одно посоветовать - узнать, как это делает сам Excel.
← →
nasty © (2004-08-12 12:50) [6]to [V l a d i m i r]
это что-ли?
Sheet.UsedRange.Rows.Count
← →
V l a d i m i r (2004-08-12 13:02) [7]
> nasty ©
ShowMessage(Sheet.UsedRange.Rows.Count) выводит стабилно только единичку... а "забита" ячейка[2,2]. Попробовал "забить" ячейку где-нибудь подальше, но все равно выводит единичку :(((
← →
nasty © (2004-08-12 13:14) [8]вполне объяснимо.
потому что в данном случае количество строк в используемом диапазоне = 1 (только вторая строка)
если в первой строке листа забить какое-нибудь значение - usedrange.rows.count будет отсчитываться от начала листа.
можно использовать range.offset для определения смещения даипазона
← →
nasty © (2004-08-12 13:16) [9]to [V l a d i m i r, 4]
статьи - в MSDN или в справке по VBA для excel (более доступно)
← →
V l a d i m i r (2004-08-12 13:21) [10]ОК, спасибо за помощь... Попробую поискать в справке по VBA для excel! Надеюсь, повезет.
← →
shc (2004-08-12 14:42) [11]ActiveCell.SpecialCells(xlLastCell).Select
Переходит на последнюю ячейку (перед использованием нужно сохранить )
← →
V l a d i m i r (2004-08-12 17:33) [12]
> shc
А как определить номер (нужен именно НОМЕР) последней строки?
← →
YurikGL © (2004-08-12 19:42) [13]
> V l a d i m i r (12.08.04 17:33) [12]
Тогда уж спроси, как определить номер текущей строки
← →
V l a d i m i r (2004-08-12 19:52) [14]Дело в том, что в Excel"ом документе содержится информация, которая загоняется в БД. Я не буду залезать в дебри работы моего приложения, но смысл в том, что объем этой информации в документе может изменяться и мне необходимо всякий раз знать последнюю строку "забитой" части документа.
В справке по VB в MS Excel я нашел следующее:Worksheets("Sheet1").Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate
Этот макрос выделяет последнюю ячейку в excel"ом листе. А как этот макрос использовать в Delphi?
← →
YurikGL © (2004-08-12 20:24) [15]
procedure TForm1.Button1Click(Sender: TObject);
var
App : Variant;
begin
try
app := CreateOleObject("Excel.Application");
App.Visible := True;
App.WorkBooks.Add;
App.activesheet.range["b1","b5"].formula:="a";
App.ActiveSheet.Range["c1","d3"].formula:="b";
App.ActiveSheet.Range["a1","a3"].formula:="b";
app.ActiveCell.SpecialCells(xlLastCell,EmptyParam).select;
finally
App:=Unassigned;
end;
end;
← →
YurikGL © (2004-08-12 21:49) [16]Хоть получилось?
← →
V l a d i m i r (2004-08-12 23:00) [17]Не-а, не получилось. Во-первых, на
app:=CreateOleObject("Excel.Application");
компилятор ругается, а если сделатьapp.CreateOleObject("Excel.Application");
, то проходит, но при нажатии на кнопку получаю сообщение: «Variant does not reference an automation object». В общем, замучался я уже с этим вопросом… L((. А надо, НАДО найти ответ. Уж очень это важно.
Принцип работы программы заключается в следующем: пользователь указывает через кнопку Обзор файл, в котором располагается необходимая информация (отчет о доходах и расходах), которая загружается в БД. Дело в том, что доходы и расходы располагаются всегда в одних и тех же столбцах, однако объем отчета может изменяться (в сторону увеличения/уменьшения строк). Вот поэтому, чтобы загрузка была динамической, мне необходимо получить последнюю строку в документе, чтобы знать, где окончание отчета. Вот!
← →
REP © (2004-08-13 07:41) [18]V l a d i m i r (12.08.04 23:00) [17]
А могут быть пустые ячейки в этих столбцах? Если просто пробежаться до первой пустой ячейки(ячеек)?
← →
Skyle © (2004-08-13 07:45) [19]
> app.CreateOleObject("Excel.Application");
Сам-то понял, что сказал?
Когда мне требовалось найти конец данных я просто в цикле ходил и искал первую пустую строку, как предлагается в
> [18] REP © (13.08.04 07:41)
.
Но у меня структура данных это позволяла.
Неужели всё, что тут было предложено, мимо кассы?
← →
menart © (2004-08-13 08:37) [20]
> V l a d i m i r (12.08.04 23:00) [17]
> Не-а, не получилось. Во-первых, на app:=CreateOleObject("Excel.Application");
> компилятор ругается, а если сделать app.CreateOleObject("Excel.Application");,
> то проходит, но при нажатии на кнопку получаю сообщение:
> «Variant does not reference an automation object». В общем,
> замучался я уже с этим вопросом… L((. А надо, НАДО найти
> ответ. Уж очень это важно
uses ComObj
← →
Skyle © (2004-08-13 08:41) [21]
> [20] menart © (13.08.04 08:37)
???
А это здесь при чём?
Что должен сказать воспитанный компилятор наvar V : Variant;
begin
V.DoSomeMethod;
Праально, сказать, чтобы тот, кто это придумал, шёл читать книжки, что и было продемонстрировано.
← →
V l a d i m i r (2004-08-13 12:42) [22]Нет, поиск первой пустой строки не подходит, т.к. между отдельными статьями есть пустые строки. Это не выход. Единственное, что я вижу реальным - это проверка на наличие в ячейке числа. Но не буду же я проверять, например во втором столбце, все ячейки до бесконечности? Поэтому необходимо знать, где же конец документа: номер последней строки!
← →
Skyle © (2004-08-13 12:56) [23]
> все ячейки до бесконечности
Если я не ошибаюсь не до бесконечности, а до 65 535.
← →
46_55_41_44 © (2004-08-13 13:14) [24]http://www.kornjakov.ru/stat.htm
Страницы: 1 вся ветка
Текущий архив: 2004.08.29;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.026 c