Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с Excel через OLE / 25 сообщений из 26, страница 1 из 2
27.11.2021, 00:12
    #40115377
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Доброго!
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
27.11.2021, 00:23
    #40115379
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Dmvrt
Сокращаю код, но чтобы был понятен вопрос
Он стал намного менее понятным.
Сделай тестовый пример, который демонстрирует ошибку и может быть воспроизведен у других.
Ну и оригинальный текст вместо "тут ошибка" был бы желателен.
На всякий: проверь антивирус.
...
Рейтинг: 0 / 0
27.11.2021, 00:26
    #40115381
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Извините, переменные 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
27.11.2021, 00:39
    #40115383
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Тестовый пример:
Код: 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
27.11.2021, 00:42
    #40115384
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Соколинский Борис,

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

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

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

И какой самый рациональный способ сброса данных в excel в связке Delphi, ms sql и Excel? Причем с форматированием.
...
Рейтинг: 0 / 0
28.11.2021, 00:44
    #40115605
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Dmvrt, элементарно, Ватсон.
1. подготовить шаблон, содержащий форматирование и запрос к MsSQL
2. из программы закачать параметры и выполнить запрос.
3. при необходимости дорихтовать форматирование макросами.
Быстро, надежно, и с возможностью кастомизации под разных пользователей.
...
Рейтинг: 0 / 0
28.11.2021, 01:00
    #40115607
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Соколинский Борис,
В шаблон как из делфей закачать параметры в Ecxel, не открывая его?
Можно пример кода
Буду очень благодарен
...
Рейтинг: 0 / 0
28.11.2021, 01:05
    #40115608
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Dmvrt,
открыть, через CreateOLEObject.
Запущенный Excel не трогать.
...
Рейтинг: 0 / 0
28.11.2021, 01:08
    #40115609
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Точнее так: можно трогать только тот, который создан из программы и не отдан на усмотрение пользователю.
...
Рейтинг: 0 / 0
28.11.2021, 01:15
    #40115610
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Ничего нового, а вопрос остался.
Если бы мне нужно было бы только CreateOLEObject, то я бы и не спрашивал тут.
...
Рейтинг: 0 / 0
28.11.2021, 01:35
    #40115615
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
напишу тогда проще функцию открытия 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
28.11.2021, 01:43
    #40115617
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Excel через OLE
Dmvrt
Только что мне объяснить пользователям, что они должны выйти из строки формул (потому как не тот интерфейс определился),
Конечно нет. Может быть у того, который возвращается из строки формул будет какое-нибудь свойство WorkBook через которое вы получите нужный интерфейс.

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


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