11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
1

Проверка существования рабочей книги Excel

13.11.2014, 15:50. Показов 2958. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Привожу пример кода:
Код
procedure TForm1.btn1Click(Sender: TObject);
var
  FExcel: TExcelApplication;
  FWBook: TExcelWorkbook;

  function ExistWorkBook(): Boolean;
  var
    LWBName: string;
  begin
    if FExcel.Workbooks.Count < 1 then
    begin
      Result := False;
      Exit();
    end;
    try
      LWBName := FWBook.Name;
      Result := True;
    except
      on E: EOleException do
      begin
        Result := False;
        Exit();
      end; // on E: EOleException do
    end; // try...except
  end; // function ExistWorkBook(): Boolean;

begin
  FExcel := TExcelApplication.Create(nil);
  FExcel.ConnectKind := ckNewInstance;
  FExcel.Connect;
  FExcel.AutoQuit := False;
  FExcel.Visible[lcid] := True;
  FExcel.DisplayAlerts[lcid] := false;

  FExcel.Workbooks.Add(EmptyParam, lcid);

  FWBook := TExcelWorkbook.Create(nil);
  FWBook.ConnectTo(FExcel.Workbooks.Add(EmptyParam, lcid));
  FWBook.Close();  

  if ExistWorkBook() then
    FWBook.Close();

  FWBook.Disconnect();

  FreeAndNil(FWBook);
  FreeAndNil(FExcel);
end;

Подскажите какой-нибудь системный аналог функции ExistWorkBook().
В программе может возникнуть ситуация, при которой мы пытаемся закрыть рабочую книгу, которая уже закрыта.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2014, 15:50
Ответы с готовыми решениями:

Проверка переменной Excel.Application на содержание открытой книги
Всем привет! Очень нужно сделать проверку! Суть проблемы: есть программа работающая с Excel, в ней...

Проверка наличия в строках столбца названия рабочей книги
Доброго времени суток, форумчане! Подскажите, что не так с кодом??? VBA Option Explicit ...

Нужен список страниц из активной рабочей книги Excel
Открыта книга Excel написать функцию, возвращающую названия страниц из активной книги в виде...

Excel: Как перенести лист из одной рабочей книги в другую?
?

9
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
13.11.2014, 16:20 2
По-моему такой нет. То, что в коде [ExistWorkBook()], похоже кто-то писал сам. Если книга закрыта, то ее нет в коллекции WorkBooks.
1
11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
13.11.2014, 16:24  [ТС] 3
А как мне проверить заранее, открыта книга или нет?
ExistWorkBook() я сам и писал. Только решение не очень удачное(
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
13.11.2014, 16:36 4
Ну например по названию. Пройтись по коллекции WorkBooks и посмотреть наличие в ней интересующей книги. ЕМНИП, ExcelApplication может вернуть ActiveWorkbook. Посмотри тут Application Members
0
11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
13.11.2014, 17:22  [ТС] 5
Дело в том, что если я вызову метод FExcel.WorkBooks.Close(lcid), то не смогу получить FWBook.Name, так как в этой ситуации FWBook уже закрыта и в таком случае коллекция WorkBooks не поможет.
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 462
13.11.2014, 17:30 6
Ну так сохрани где-нибудь перед Close() типа LastClosedWBookName... Вообще, ИМХО, странная ситуация, что книга "вдруг" стала закрытой. Может попытаться избежать этого?
0
11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
13.11.2014, 17:40  [ТС] 7
Придётся избегать. Всё-таки должны быть какие-нибудь методы позволяющие узнать открыт ли лист.
Vabos, спасибо за отклик.
0
1177 / 419 / 106
Регистрация: 31.03.2012
Сообщений: 1,145
14.11.2014, 08:52 8
Чтобы узнать есть ли рабочая книга Excel можно использовать обычные файловые методы, FileExists - прекрасно для этого подходит
Цитата Сообщение от ilikeMagic Посмотреть сообщение
методы позволяющие узнать открыт ли лист
Таки лист или книга, это как бы разные сущности (объекты).
И для открытых книг или листов в открытых книгах нужно перебирать их коллекции. А по коду..
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FExcel.Workbooks.Add(EmptyParam, lcid); // добавил книгу
{ получи доступ к ней, у тебя новый и соответственно активный экземпляр Excel
// ConnectKind := ckNewInstance // это ранее у тебя в коде
  FWBook := FExcel.ActiveWorkbook as _Workbook;
}
FWBook := TExcelWorkbook.Create(nil);   // в свете вышесказанного, вот это для чего?
// и зачем создавать еще одну книгу в текущем экземпляре Excel и соединять ее с ним?
// впрочем могу ошибаться, т.к. не проверял :(, но код вроде бы именно об этом свидетельствует
FWBook.ConnectTo(FExcel.Workbooks.Add(EmptyParam, lcid)); 
{ может будет проще вместо этого
  FWBook := FExcel.ActiveWorkbook as _Workbook;
  FWSheet := FWBook.Worksheets[ нужный_номер_листа_книги ] as _Worksheet;
  и далее работать с листом или книгой, в том числе и их именами, например
  FWbook.Name
  FWSheet.Name и т.д.
}
FWBook.Close(); // закрыл книгу
// а потом что-то выяснять о ней, давай очень любопытно будет глянуть, что получится...
if ExistWorkBook() then
0
11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
14.11.2014, 17:13  [ТС] 9
Delphi
1
2
3
FWBook := TExcelWorkbook.Create(nil); // Если не создавать, то
FWBook.ConnectTo(FExcel.Workbooks.Add(EmptyParam, lcid));
FWBook.Name; // получаем авешку
TExcelWorkbook - это обёртка для OLE объекта. И когда мы пишем:
Delphi
1
FWBook := TExcelWorkbook.Create(nil);
, то мы не создаём новый WorkBook в Excel.
0
1177 / 419 / 106
Регистрация: 31.03.2012
Сообщений: 1,145
15.11.2014, 08:59 10
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Delphi
1
FWBook := TExcelWorkbook.Create(nil);
, то мы не создаём новый WorkBook в Excel.
Конечно не создаем новую книгу, но создаем новый объект, который в принципе для этого экземпляра Excel уже есть. А именно в в твоем коде строка 35
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Delphi
1
FExcel.Workbooks.Add(EmptyParam, lcid);
0
15.11.2014, 08:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2014, 08:59
Помогаю со студенческими работами здесь

Excel : Изменить имя рабочей книги на то, которое получено из функции InputBox
6. Excel : Изменить имя рабочей книги на то, которое получено из функции InputBox , и выдать...

Каким образом можно вычистить весь код из рабочей книги Excel?
Я имею в виду макросы.

Как отключить сохранение рабочей книги для автовосстановления в Excel 2002?
Как отключить сохранение рабочей книги для автовосстановления в Excel 2002. Уж больно оно мешает.

Как задать диапазон имен для рабочей книги в VBA Excel?
Добрый день. Нужна помощь с несколькими вопросами по vba excel: 1. Для создания сводной таблицы я...

Excel : Вывести в диалоговом окне MsgBox имя рабочего листа активной рабочей книги
4. Excel : Вывести в диалоговом окне MsgBox имя того рабочего листа активной рабочей книги, номер...

Как в Excel печатать на одном листе бумаги сразу несколько листов рабочей книги
Уважаемые программисты, подскажите, пожалуйста, как в Excel печатать на одном листе бумаги сразу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru