2013-03-28 30 views
0

我正在使用VSTO加載項。我有一個定製的功能區,並在該功能區上有一個名爲TemplateCallButton的按鈕。我還有其他幾個功能和按鈕,其中一個只是打開一個帶模板的文件夾(作爲例子)。 TemplateCallButton僅適用於其他操作已完成的模板文件(看似無關緊要)。在任何其他操作運行後,它按預期工作。Excel VSTO Workbooks.Open只在第一次採取其他操作時才能工作

更令人沮喪的是,這種行爲似乎只發生在我部署的機器上,而不是我正在開發的機器上。這裏是TemplateCallButton代碼:

Public Class InsightLabProcessor 
    Dim MainTemplatePath As String = "C:\Insight\Insight.xltm" 
    .... 
    Private Sub TemplateCallButton_Click(sender As Object, e As RibbonControlEventArgs) Handles TemplateCallButton.Click 
    Dim objApp As Excel.Application 
    objApp = Marshal.GetActiveObject("Excel.Application") 
    objApp.Visible = True 
    Dim objWorkbook As Excel.Workbook = objApp.Workbooks.Open(MainTemplatePath) 
    objWorkbook.Worksheets(4).Activate() 
    End Sub 

,這裏是按鈕的代碼只是打開一個文件夾:

Private Sub PhaseCodeFolderOpenButton_Click(sender As Object, e As RibbonControlEventArgs) Handles PhaseCodeFolderOpenButton.Click 
    Process.Start("explorer.exe", "C:\Insight\Phase Codes") 
End Sub 

或一個打開的控制形式:

Private Sub ControlPannel_Click(sender As Object, e As RibbonControlEventArgs) Handles ControlPannel.Click 
    Dim controlpanel As New ControlPanel 
    controlpanel.Show() 
    controlpanel = Nothing 
End Sub 

我覺得我必須錯過簡單的東西。

謝謝。

+0

它甚至開始工作,如果我最小化Excel,然後再回來,或切換窗口和回來。只有當我第一次加載Excel,然後嘗試點擊按鈕,它不會執行任何操作。我錯過了什麼? –

+0

好的,所以我認爲這是我的問題,http://support.microsoft.com/kb/238610但這些解決方法不是很愉快。任何人都知道一個優雅的方式來解決這個問題(希望沒有用戶注意?) –

回答

0

所以這個問題實際上是在這裏討論的問題:http://support.microsoft.com/kb/238610,這看起來像是一個非常惡毒的插件。我發現的最好的解決方案(再次不是很優雅)是打開命令行,寫出我們正在等待第一個實例加載,在任何人太好奇之前關閉它。我想這對4臺機器上和經驗上發現的最長等待時間,我需要的是250毫秒,所以我就翻了一番,達到500在此:

... 
    Shell("C:\Windows\System32\cmd.exe", AppWinStyle.MaximizedFocus) 
    System.Threading.Thread.Sleep(10) 'give cmd just a bit to take the line 
    SendKeys.Send("Waiting for Excel to register in Running Object Table") 
    System.Threading.Thread.Sleep(490) 
    Dim Term() As Process = Process.GetProcessesByName("cmd") 
    For Each P As Process In Term 
     P.Kill() 'user probably doesn't have any other instances of cmd open, if they do they are colaterial damage, may handle that if it becomes an issue 
    Next 
    Dim objApp As Excel.Application 
    objApp = Marshal.GetActiveObject("Excel.Application") 
    objApp.Visible = True 
    Dim objWorkbook As Excel.Workbook = objApp.Workbooks.Open(MainTemplatePath) 
    objWorkbook.Worksheets(4).Activate() 

我要再次回來,除了任何更優雅的或接受最終用戶。我真的很想知道是否有辦法強制Excel註冊到ROT。也許我應該把它變成另一個問題。

相關問題