powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с Excel через OLE
25 сообщений из 26, страница 1 из 2
Работа с Excel через OLE
    #40115377
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго!
Delphi XE6, MS Office 2016
Запущена книга Excel, пытаюсь к ней обратиться

Варианты состояния открытых книг Excel:
а) Курсор (фокус) находится на всех открытых книгах на листе
б) Курсор находится в строке формул, на одной или нескольких открытых книг

Сокращаю код, но чтобы был понятен вопрос
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var 
  Excel,
  WB: OleVariant;
begin
  Excel:= GetActiveOleObject('Excel.Application'); //возвращает нормальный IDispath в случае а и б
  ExcelApp.DisplayAlerts := False; // в случае а - норм, б -уже тут ошибка
  WB := ExcelApp.Application.WorkBooks.Add(); //и тут тоже ошибка в случае б, если ExcelApp.DisplayAlerts := False; поставить в try except end;
end;



Я так понял, что строка формул имеет теперь свой интерфейс IDispath и находится как активный именно он, а не сам Excel и ole не справляется с поиском.
Пробовал задавать 'Excel.Application.16', результат аналогичен.
Как победить, чтобы норм работало и в случае б) ?

Спасибо.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115379
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
Сокращаю код, но чтобы был понятен вопрос
Он стал намного менее понятным.
Сделай тестовый пример, который демонстрирует ошибку и может быть воспроизведен у других.
Ну и оригинальный текст вместо "тут ошибка" был бы желателен.
На всякий: проверь антивирус.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115381
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, переменные Excel и ExcelApp, это одна переменная, просто копировал код из разных подпрограмм.
Вот исправленный код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var 
  Excel,
  WB: OleVariant;
begin
  Excel:= GetActiveOleObject('Excel.Application'); //возвращает нормальный IDispath в случае а и б
  try
    Excel.DisplayAlerts := False; // в случае а - норм, б -уже тут ошибка
  except
  end;
  WB := Excel.Application.WorkBooks.Add(); //и тут тоже ошибка в случае б, если ExcelApp.DisplayAlerts := False; поставить в try except end;
end;
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115383
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тестовый пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses System.Win.ComObj;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Excel,
  WB: OleVariant;
begin
  Excel:= GetActiveOleObject('Excel.Application'); //возвращает нормальный IDispath в случае а и б
  Excel.DisplayAlerts := False; // в случае а - норм, б -уже тут ошибка
  WB := Excel.Application.WorkBooks.Add(); //и тут тоже ошибка в случае б
end;

end.



Ошибка в случае б):
Project Project1.exe raised exception class EOleSysError with message 'Вызов был отклонен'.
В случае а) - нет ошибок
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115384
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

антивирус тут причем?
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115385
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
антивирус тут причем?
'Вызов был отклонен' - типичное для него ложное срабатывание.
Ну либо в сам эксель какую-то защиту от посягательств встроили.
Проверь то же через
Код: pascal
1.
 Excel:= CreateOleObject('Excel.Application')
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115386
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы было понятней
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115387
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,
CreateOleObject('Excel.Application') нормально отрабатывает.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115389
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt,
а ты не можешь всегда так делать?
Похоже на багу в экселе, да и не нужен этот GetActiveOleObject обычно.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115391
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Хотелось бы иногда избегать запуска новой копии Excel, когда есть открытые уже. Например, тот же файл не открывать, а проверить. Разное бывает.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115395
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
Хотелось бы иногда избегать запуска новой копии Excel...
Это желание часто входит в конфликт с тем, что
а) можно навредить пользователю (что ты собственно и делаешь, отключая алерты).
б) можно навредить другому софту (ROT общая для всех программ).
Лучше как-то архитектуру продумать чтобы этого избежать.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115396
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,
Я это понимаю, но как ты помнишь, текущий вопрос о другом.
И я не знаю, как его решить, поэтому и спрашиваю, может кто с таким сталкивался и есть решение.
А отключение алертов, это из старины и совместимости версий Excel, сейчас можно убрать, но руки не доходят, это еще с Delphi7 и с тех лет. Причем алерты включаются по finally (я же не весь код привел).
Спасибо.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115551
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно через IDispatch.GetType() получить IType и посмотреть какой интерфейс приходит
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115593
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Хорошая идея.
Только что мне объяснить пользователям, что они должны выйти из строки формул (потому как не тот интерфейс определился), а потом все будет работать?
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115595
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, если не то определилось сделать CreateOleObject, спасибо, попробую
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115599
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все танцы с бубном, потом еще какая-то фигня вылезет.
Идея в принципе порочная, если пользователь работает с Экселем - дергать его через OLE нельзя. Максимум что можно - запросить какую-то инфу, в частности открытые файлы.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115601
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

И какой самый рациональный способ сброса данных в excel в связке Delphi, ms sql и Excel? Причем с форматированием.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115605
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt, элементарно, Ватсон.
1. подготовить шаблон, содержащий форматирование и запрос к MsSQL
2. из программы закачать параметры и выполнить запрос.
3. при необходимости дорихтовать форматирование макросами.
Быстро, надежно, и с возможностью кастомизации под разных пользователей.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115607
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,
В шаблон как из делфей закачать параметры в Ecxel, не открывая его?
Можно пример кода
Буду очень благодарен
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115608
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt,
открыть, через CreateOLEObject.
Запущенный Excel не трогать.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115609
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее так: можно трогать только тот, который создан из программы и не отдан на усмотрение пользователю.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115610
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего нового, а вопрос остался.
Если бы мне нужно было бы только CreateOLEObject, то я бы и не спрашивал тут.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115615
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
напишу тогда проще функцию открытия Excel
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function OpenExcel(var Excel: OLEVariant);
try
  Excel := GetActiveOleObject('Excel.Application');
  try
    Excel.DisplayAlerts; //или чего другое прочитать
  except
    Excel := CreateOLEObject('Excel.Application');
  end;
except
  Excel := CreateOLEObject('Excel.Application');
end;
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115617
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
Только что мне объяснить пользователям, что они должны выйти из строки формул (потому как не тот интерфейс определился),
Конечно нет. Может быть у того, который возвращается из строки формул будет какое-нибудь свойство WorkBook через которое вы получите нужный интерфейс.

Хотя с большой вероятностью оба интерфейса будут идентичны.
...
Рейтинг: 0 / 0
Работа с Excel через OLE
    #40115800
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я во избежание подобных проблем (их обязательно вылезает цела куча) просто требую, чтобы на момент выгрузки ни одного экземпляра Экселя не было запущено
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с Excel через OLE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]