[英]Access C# classes from VBA COM.Interop
错误:未定义属性让程序和属性获取程序未返回 object 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;
}
}
}
Generated.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?
我不是专家,但最近为 VBA 的 C# 字典包装器解决了这个问题。
以下是我如何为 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# object 包裹在 vba class 中时
// 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);
}
}
我完整的 class 在这里Kvp: C# 库,用于包装字典的 VBA。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.