Доступ к C# классам из VBA COM.Interop - PullRequest
1 голос
/ 20 апреля 2020

ОШИБКА: свойство let процедуры не определено, а свойство get процедуры не возвращало объект vba. А вот соответствующий код:

namespace Entities
{
    [Guid("E65658F2-67C4-4F86-890C-62517EFB19AC")]
    [ComVisible(true)]
    public interface IFieldTags
    {
        [DispId(-4)]
        FieldTagsEnumerator GetEnumerator();
    }

    [Guid("472DDF54-E42D-4E6D-9D62-1507CDB2ED0A")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [ComVisible(true)]
    public class FieldTags : IEnumerable, IFieldTags
    {

        private List<FieldTag> fieldTagsList;

        internal FieldTags(Document document, Tools tools)
        {
            this.constants = tools.Constants;
            this.document = document;
            this.fieldTagsList = GetFieldtagList();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)GetEnumerator();
        }

        public FieldTagsEnumerator GetEnumerator()
        {
            return new FieldTagsEnumerator(this.fieldTagsList);
        }
    }


    public class FieldTagsEnumerator : IEnumerator
    {
        private readonly List<FieldTag> fieldTagsCollection;
        private int position = -1;

        public FieldTagsEnumerator(List<FieldTag> fieldTagsList)
        {
            fieldTagsCollection = fieldTagsList;
        }
    }
}

Сгенерированный .tlb с использованием RegAsm.exe и Attached Entities.tlb для VBA

В VBA:

Dim objFieldTags As Entities.IFieldTags
// returns FieldTags type object in c#
Set objFieldTags = objDocument.GetNewRange(WordDocument.Range).FieldTags

For Each obj In objFieldTags

Для каждой причины ошибки, Правильна ли эта методология? как я могу использовать FieldTags в al oop?

1 Ответ

0 голосов
/ 20 апреля 2020

Я не эксперт, но недавно (я sh) решил эту проблему для C# оболочки словаря для VBA.

Вот как я справился с этим для c# словаря в оболочке.

private Dictionary<dynamic, dynamic> Host = new Dictionary<dynamic, dynamic>();

public IEnumerator GetEnumerator()
    {
        foreach (KeyValuePair<dynamic, dynamic> myPair in Host)
        {
            yield return new KVPair(myPair.Key, myPair.Value);
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

И когда я обертываю свой c# объект в класс vba

// Allows a wrapped Kvp to be enumerated in VBA
public IEnumerator KvpEnum()
{
    foreach (KeyValuePair<dynamic, dynamic> myPair in Host)
    {
        yield return new KVPair(myPair.Key, myPair.Value);
    }
}

мой полный класс находится здесь Kvp: C# библиотека для VBA, которая оборачивает словарь.

...