Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions
вроде бы намекает на способ решения этой задачи. Дьявол, как всегда, в деталях. Во-первых, модуль класса с Instancing=2 (PublicNotCreatable) таки (казалось бы - Public!) не подходит для размещения описания Public Type. Во-вторых, в VBA нет для классов instancing-ов со значениями больше 2, например 5 (MultiUse). А вот в "полноценном" VB (5/6)
есть.
То есть сообщение об ошибке завезли из VB, но в VBA оно бесполезно и вводит в заблуждение.
Часть 2. Что делать.
(Опуская дискуссию о необходимости)
Сделать в VBA-проекте ссылку (Tools\References...) на библиотеку типов, в которой описан UDT. Нюанс: у типа обязан быть uuid. Так что VB6/IDL+midl/Delphi/C#/etc. в руки для создания отдельных .tlb или .dll/.exe/.ocx с ресурсом соответствующего типа внутри.
Исходник простейшей библиотеки на IDL
[
uuid(3CABBB90-BB91-4133-9FA1-5E443BEF2D7B),
version(1.0)
]
library MyTypeLib
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
typedef [uuid(B5F4AEAD-2657-4D2E-A6B6-AD3CFE0102C5), version(1.0)]
struct tagAlterParams {
[helpstring("NameFrmWork")]
BSTR NameFrmWork;
[helpstring("LineId")]
long LineId;
[helpstring("TypeComm")]
long TypeComm;
[helpstring("TypeWork")]
long TypeWork;
} AlterParams;
};
Часть I. Кто виноват.
Сообщение об ошибке
вроде бы намекает на способ решения этой задачи. Дьявол, как всегда, в деталях. Во-первых, модуль класса с Instancing=2 (PublicNotCreatable) таки (казалось бы - Public!) не подходит для размещения описания Public Type. Во-вторых, в VBA нет для классов instancing-ов со значениями больше 2, например 5 (MultiUse). А вот в "полноценном" VB (5/6)
есть.
То есть сообщение об ошибке завезли из VB, но в VBA оно бесполезно и вводит в заблуждение.
Часть 2. Что делать.
(Опуская дискуссию о необходимости)
Сделать в VBA-проекте ссылку (Tools\References...) на библиотеку типов, в которой описан UDT. Нюанс: у типа обязан быть uuid. Так что VB6/IDL+midl/Delphi/C#/etc. в руки для создания отдельных .tlb или .dll/.exe/.ocx с ресурсом соответствующего типа внутри.
Исходник простейшей библиотеки на IDL