我正在将VB6项目转换为C#。该项目是Word加载项(Word色带栏),我们使用的是Visual Studio Tools for Office(VSTO)和一个类库项目。
MyProject在功能区栏项目单击(不同类型的宏)上,将启用宏的单词字段(类型:Word.WdFieldType.wdFieldMacroButton
)添加到Word文档中。
根据this article,我已实现使用VBA在VSTO加载项中调用代码。 我正在使用启用宏的文档模板(myTemplate.dotm)来识别宏双击事件。
我当前正在实现“编辑”功能(双击宏字段,将打开“编辑”对话框。)
下面是RunSelectedFieldTagMacro()方法的功能
这里有一个名为FieldTags的类,它使用活动的WordDocument进行了初始化。
internal FieldTags(Word.Document document){ //...}
有一个名为FieldTag的类是从文档中的wordField初始化的。
在FieldTags类中,我使用private List<FieldTag> fieldTagsList
将在FieldFields类中的CollectionLoad()
方法中标识的FieldTag对象存储
(我在这里使用列表,因为我必须像在文档中那样将新添加的字段标签添加到单词文档到此集合中。)
所以我的问题,
我双击word文档中的字段标签。因此,VBA宏通过类项目中的RunSelectedFieldTagMacro()方法执行并通过VSTO加载项执行。
在其中,加载fieldTagsList
之后,将执行编辑功能,并且MyProject在编辑字段标记的正上方添加一个新的fieldTag(在这里,我们插入新的字段标记,然后删除带有其子字段的旧字段标记)。
public FieldTag Add(Word.Range wordRange, Tag tag)
{
try
{
FieldTag fieldTag;
Word.Field wordField;
//Create a new field at the specified range.
wordField = wordRange.Fields.Add(Range: wordRange, PreserveFormatting: false);
//Insert the contents of the new field.
tag.InsertFieldContents(wordField);
//Field must be updated to display properly and for style to be correctly applied.
wordField.Update();
//Add a FieldTag to the Document.FieldTags collection.
fieldTag = this.AddFieldTag(wordField);
//Apply style to the new FieldTag.
fieldTag.ApplyStyle();
return fieldTag;
}
catch(Exception ex)
{
}
}
在“将字段标签添加到Document.FieldTags collection
”部分中,我们正在检查Item by RangeStart。
private FieldTag ItemByRangeStart()
{
for (int i = fieldTagsList.Count; i > 1; i--)
{
fieldTag = fieldTagsList[i-1];
if (rangeStart > fieldTag.WordField.Code.Start)
{
return fieldTag;
}
}
}
这一次,新的字段标签已添加到文档中。在循环中,检查双击(编辑)字段标签时,fieldTag.WordField.Code
引发以下错误。
fieldTag.WordField.Code引发了类型异常 System.Runtime.InteropServices.COMException
该属性在该对象上不可用。
当尝试通过单词字段标签双击运行编辑功能时,会发生此错误。
我还可以通过选择字段标签来运行字段标签编辑功能,然后通过Visual Studio运行RunSelectedFieldTagMacro()
方法。但是不会发生此错误。
两个进程都运行完全相同的代码。唯一的区别是,在发生错误的步骤中:我首先双击field标签。 在运行Visual Studio时,我手动选择了字段标签范围。
有人知道为什么在插入新的fieldtag之后我无法访问wordField.Code吗?我真的被困在这里。
谢谢。
注意:我无法在此处添加所有代码,因为此过程中有很多中产阶级。希望你们能理解我的问题。