I don't think that's going to work like that (you can't just assign an event when using automation like that, I think).
If you create a tlb from EXCEL.EXE you see how it can be done.
Install the package LazActiveX in the IDE and after rebuilding create a TLB for EXCEL.EXE.
(Tools > Import Type Library > choose EXCEL.EXE and create)
You see it works with EventSinkInvoke (in Delphi it makes an InvokeEvent).
From there you can call your own OnWorkbookBeforeSave.
Some of it is explained on this page (for Delphi but should be the same for Lazarus):
https://www.gtro.com/delphi/comevents_e.phpFrom excel_1_9_tlb.pas created by the type library:
procedure TEvsApplication.EventSinkInvoke(Sender: TObject; DispID: Integer;
const IID: TGUID; LocaleID: Integer; Flags: Word; Params: tagDISPPARAMS;
VarResult, ExcepInfo, ArgErr: Pointer);
begin
case DispID of
1610612736: if assigned(OnQueryInterface) then
OnQueryInterface(Self, OleVariant(Params.rgvarg[1]), OleVariant(Params.rgvarg[0]));
//...
1570: if assigned(OnWorkbookBeforeClose) then
OnWorkbookBeforeClose(Self, OleVariant(Params.rgvarg[1]), Params.rgvarg[0].pbool^);
1571: if assigned(OnWorkbookBeforeSave) then
OnWorkbookBeforeSave(Self, OleVariant(Params.rgvarg[2]), OleVariant(Params.rgvarg[1]), Params.rgvarg[0].pbool^);
1572: if assigned(OnWorkbookBeforePrint) then
OnWorkbookBeforePrint(Self, OleVariant(Params.rgvarg[1]), Params.rgvarg[0].pbool^);
//...
I also see there is a simular topic here:
https://forum.lazarus.freepascal.org/index.php?topic=27667.0