我正在使用VS2013上的VSTO为Excel开发应用程序级加载项。我的代码适用于我的所有工作表,除了一个。我发现函数GetVstoObject返回的页面不同于作为参数给出的表格。
这是我的即时窗口:
?sheet.Name
"Sheet2"
?Globals.Factory.GetVstoObject(sheet).Name
"Sheet1"
为什么会这样?我读到这个返回只计算一次,对于后续调用,返回缓存的值。有一些方法可以清除此缓存吗?
编辑:
在这个工作簿上,我有两个工作表,第一个名为" Sheet1"第二个名为" Sheet2"。我从未重命名或复制其中一张表,我刚刚开始使用新工作簿并创建了一个额外的工作表。
这是我的调试代码:
Dim sheet1 As Microsoft.Office.Interop.Excel.Worksheet = formMapeamento.wb.Worksheets.Item(1)
Dim sheet2 As Microsoft.Office.Interop.Excel.Worksheet = formMapeamento.wb.Worksheets.Item(2)
Dim sheet1_vsto = Globals.Factory.GetVstoObject(sheet1)
Dim sheet2_vsto = Globals.Factory.GetVstoObject(sheet2)
Dim sheet1_vsto_inner = sheet1_vsto.InnerObject
Dim sheet2_vsto_inner = sheet2_vsto.InnerObject
这是我现在的直接窗口,有更多数据。
'Checking "Sheet1". Everithing looks as expected
?sheet1.Name
"Sheet1"
?sheet1.Index
1
?sheet1.CodeName
"Sheet1"
?Globals.Factory.HasVstoObject(sheet1)
True
?sheet1_vsto.Name
"Sheet1"
?sheet1_vsto.Index
1
?sheet1_vsto.CodeName
"Sheet1"
?sheet1_vsto_inner.Name
"Sheet1"
?sheet1_vsto_inner.Index
1
?sheet1_vsto_inner.CodeName
"Sheet1"
'Checking "Sheet2". STRANGE VALUES
?sheet2.Name
"Sheet2"
?sheet2.Index
2
?sheet2.CodeName
"Sheet1"
?Globals.Factory.HasVstoObject(sheet2)
False
?sheet2_vsto.Name
"Sheet1"
?sheet2_vsto.Index
1
?sheet2_vsto.CodeName
"Sheet1"
?sheet2_vsto_inner.Name
"Sheet1"
?sheet2_vsto_inner.Index
1
?sheet2_vsto_inner.CodeName
"Sheet1"
这个问题突然开始发生了。在此之前,两张纸都返回了正确的值。在我运行代码一段时间之后(代码迭代某些范围,在工作表上添加和删除窗口组合框,在CustomXMLParts上显示一些表单和写入)sheet2_vsto
开始响应为sheet1_vsto
。我保存了这个工作簿来研究这个问题,以避免我的用户发生这种情况。
我无法再次重现这个问题。这是我第一次看到这种奇怪的行为。我认为问题的根源在CodeName
的{{1}}。
有没有人知道这个问题的一些解决方法,或者出现这种情况的原因?