All streams
Search
Write a publication
Pull to refresh
2
0
Send message

Часть I. Кто виноват.

Сообщение об ошибке

Microsoft Visual Basic for Applications

Compile error:

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;
};

2

Information

Rating
Does not participate
Registered
Activity

Specialization

Software Developer, Database Developer