VSTO文档自定义:缺少控制表参考除非首先采取其他操作

时间:2013-04-02 16:57:04

标签: vb.net excel deployment vsto

所以我有一个解决我的问题的方法,但我真的不明白这个问题,而且我的解决方法很粗糙。我有一个文档级自定义,可以插入自定义文档中未包含的其他文档中的工作表:

Private Sub LabReportTemplateAdder()
    Dim ReportTemplate As Excel.Workbook
    CurrentRun = Marshal.GetActiveObject("Excel.Application")
    ReportTemplate = CurrentRun.Workbooks.Open("C:\Reports\Templates\" & LabReportListBox.SelectedItem())
    ReportTemplate.Worksheets(1).Move(Before:=Globals.ThisWorkbook.Sheets(5))
End Sub

这个脚本实际上每次都在部署中正常工作。但是当我尝试修改添加的模板(即从数据库添加信息)时,修改(许多不同的操作)都会因缺少引用错误而失败:

“此文档可能无法按预期运行,因为缺少以下控件:Sheet5。依赖于此控件的数据将不会自动显示或更新,并且其他自定义功能将不可用。请联系您的管理员或这份文件需要进一步的帮助。“

失败的代码类型示例:

Private Sub AllMaterialsAdder(xxDataGridView As DataGridView, CostColumnID As Double, InsertColumnID As Double, CountColumnID As Double, DescriptionIndex As Integer, CostIndex As Integer)
    CurrentSheet = Globals.ThisWorkbook.ActiveSheet
    If CurrentSheet.Name = NameSet Then 'this is abbreviated test to check make sure only the sheets we need are added
        MsgBox("The active sheet isn't a Lab Report.  It's " & CurrentSheet.Name & ".")
    Else
        Dim ItemCount As Double
        ItemCount = CurrentSheet.Cells(1, CountColumnID).value
        For Each row As DataGridViewRow In xxDataGridView.SelectedRows
            CurrentSheet.Cells((4 + ItemCount), InsertColumnID).value = xxDataGridView.Item(DescriptionIndex, row.Index).Value
            CurrentSheet.Cells((4 + ItemCount), CostColumnID).value = xxDataGridView.Item(CostIndex, row.Index).Value
            ItemCount = ItemCount + 1
        Next
    End If
End Sub

Private Sub MaterialSummaryUpdater()
    CurrentSheet = Nothing
    Globals.MaterialSummaryWorksheet.UsedRange(5, 26).Clear()
    For Each Me.CurrentSheet In Globals.EOSWorkbook.Worksheets
        If CurrentSheet.Name <> NameSet Then 'this is abbreviated test to check make sure only the sheets we need are added [excluding NameSet] 
            Dim CurrentCount1, CurrentCount2, CurrentCount3, MasterCount1, MasterCount2, MasterCount3 As Int32
            CurrentCount1 = CurrentSheet.Cells(1, 28).Value
            CurrentCount2 = CurrentSheet.Cells(1, 33).Value
            CurrentCount3 = CurrentSheet.Cells(1, 39).Value
            If CurrentCount1 > 0 Then
                MasterCount1 = Globals.MaterialSummaryWorksheet.Cells(2, 3).Value
                Globals.MaterialSummaryWorksheet.Range(Globals.MaterialSummaryWorksheet.Cells((5 + MasterCount1), 1), Globals.MaterialSummaryWorksheet.Cells((4 + MasterCount1 + CurrentCount1), 6)).Value = CurrentSheet.Range(CurrentSheet.Cells(4, 25), CurrentSheet.Cells((3 + CurrentCount1), 30)).Value
            End If
            If CurrentCount2 > 0 Then
                MasterCount2 = Globals.MaterialSummaryWorksheet.Cells(2, 8).Value
                Globals.MaterialSummaryWorksheet.Range(Globals.MaterialSummaryWorksheet.Cells((5 + MasterCount2), 7), Globals.MaterialSummaryWorksheet.Cells((4 + MasterCount2 + CurrentCount2), 10)).Value = CurrentSheet.Range(CurrentSheet.Cells(4, 31), CurrentSheet.Cells((3 + CurrentCount2), 35)).Value
            End If
            If CurrentCount3 > 0 Then
                MasterCount3 = Globals.MaterialSummaryWorksheet.Cells(2, 13).Value
                Globals.MaterialSummaryWorksheet.Range(Globals.MaterialSummaryWorksheet.Cells((5 + MasterCount3), 12), Globals.MaterialSummaryWorksheet.Cells((4 + MasterCount3 + CurrentCount3), 16)).Value = CurrentSheet.Range(CurrentSheet.Cells(4, 36), CurrentSheet.Cells((3 + CurrentCount3), 40)).Value
            End If
        End If
    Next
End Sub

我应该注意,这不会发生在我正在开发的计算机上,而只是在部署中,这可能会使其与this questionthis one相关。

虽然我觉得问题对我有点不同。首先,我尝试部署的所有计算机都安装了VSTO Tools for Office。其次,如果我运行一个脚本来调用自定义文档中的一个命名表,它就可以工作。在我添加表单之前添加一个毫无价值的变量似乎可以解决问题:

Dim currentcount As Int32 = Globals.HistologyLaborSummaryWorksheet.Cells(2, 11).value

但是如果我在添加了一张纸之后再调用它,那么它就会失败。我的简单工作是将其添加到LabReportTemplateAdder子,但我仍然不明白它为什么会失败,以及为什么会解决它。显然,工作表存在,但我不知道它是否与修改工作表索引有关,或者工作表是否需要在类似于ROT problem I ran into earlier的某处注册。

我正在寻找一个更好的解决方案,如果有一个,并解释这里真正失败的是什么 感谢。

编辑: 我现在在更多的地方遇到这种情况,而且,周围的工作看起来很粗糙。这是一个完整的错误:

Microsoft.VisualStudio.Tools.Applications.Runtime.ControlNotFoundException: 
This document might not function as expected because the following control is missing:
Sheet5. Data that relies on this control will not be automatically displayed or updated, 
and other custom functionality will not be available. Contact your administrator or the 
author of this document for further assistance. ---> 
System.Runtime.InteropServices.COMException: Programmatic access to the Microsoft Office 
Visual Basic for Applications project system could not be enabled. If Microsoft Office 
Word or Microsoft Office Excel is running, it can prevent programmatic access from being 
enabled. Exit Word or Excel before opening or creating your project.

  at Microsoft.VisualStudio.Tools.Office.Runtime.Interop.IHostItemProvider.GetHostObject(String primaryType, String primaryCookie, IntPtr& hostObject)

   at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.Microsoft.Office.Tools.IHostItemProvider.GetHostObject(Type primaryType, String primaryCookie)

   at Microsoft.Office.Tools.Excel.WorksheetImpl.GetObjects()

   --- End of inner exception stack trace ---

   at Microsoft.Office.Tools.Excel.WorksheetImpl.GetObjects()

   at Microsoft.Office.Tools.Excel.WorksheetImpl.GetPrimaryControl()

   at Microsoft.Office.Tools.Excel.WorksheetImpl.get_Cells()

   at Microsoft.Office.Tools.Excel.WorksheetBase.get_Cells()

1 个答案:

答案 0 :(得分:1)

This looks relevant基于您正在插入工作表的事实。