2009-07-15 76 views
3

我試圖創建一個MSI安裝程序,將加載項(.xla)安裝到Microsoft Excel(2007中爲我的情況)。安裝它很順利。我使用的是「自定義操作」運行此VBScript文件:使用VBScript卸載Excel加載項

Dim SourceDir 
Dim objExcel 
Dim objAddin 

SourceDir = Session.Property("CustomActionData") 
Set objExcel = CreateObject("Excel.Application") 
objExcel.Workbooks.Add 
Set objAddin = objExcel.AddIns.Add(SourceDir & "addin.xla", True) 
objAddin.Installed = True 
objExcel.Quit 
Set objExcel = Nothing 

我通過插件的位置,使用CustomActionData屬性的腳本。該加載項被複制到「程序文件」內的一個文件夾,在該文件夾中它將一直保留,直到它被卸載。這由安裝程序自己處理。

問題是,當我使用卸載腳本:

Dim objExcel 
Dim addin 
On Error Resume Next 

Set objExcel = CreateObject("Excel.Application") 
For i = 0 To objExcel.Addins.Count 
    Set objAddin= objExcel.Addins.item(i) 
    If objAddin.Name = "addin.xla" Then 
     objAddin.Installed = False 
    End If 
Next 

objExcel.Quit 
Set objExcel = Nothing 

的插件創建在Excel U [安裝自定義工具欄。工具欄在卸載時不會被刪除,並且加載項在Excel設置的「加載項」部分中也不會被刪除。

任何人都可以告訴我,如果這兩件事情可以使用VBScript以編程方式完成?

由於事先

回答

2

在VB幾乎所有集合(A)是基於1的。你的循環從零開始,所以它會在嘗試訪問AddIns(0)時失敗。這被掩蓋的事實,你有On Error Resume Next

此外,你需要明確地刪除工具欄。簡單地刪除加載項不會那樣做。

我不能說我喜歡你這樣做的方式,但它應該工作至少50%的時間:-)

+0

的外接現在移動到「無效應用程序加載項「部分。它有助於。 – pancake 2009-07-15 09:59:02

0
For Each Key in Keys 
    objReg.EnumKey HKEY_CURRENT_USER,strRegPath & "\" & Key,xlKeys 
    For Each xlKey in xlKeys 
     if(LCase(xlKey) = "excel") Then 
      objReg.EnumKey HKEY_CURRENT_USER,strRegPath & "\" & Key & "\" & xlKey,subKeys 

      If(Not ISNULL(subKeys)) Then 
           For Each subKey in subKeys 
        If(lcase(subKey) = "options") Then   'Find Options subKey 
         objReg.EnumValues HKEY_CURRENT_USER, strRegPath & "\" & Key & "\" & xlKey & "\" & subKey, Values 
         If (Not IsNull(Values)) Then 
            For Each oValue In Values 
           If (LCase(Left(oValue, 4))="open") Then 
            objReg.GetStringValue HKEY_CURRENT_USER, strRegPath & "\" & Key & "\" & xlKey & "\" & subKey & "\", oValue, sTempValue 
            If(Not XLAddinRemove(sTempValue)) Then 

                       If(aOpenKeyVals(0)<>"") Then 
              Redim Preserve aOpenKeyVals(UBound(aOpenKeyVals)+1) 
             End If 
             aOpenKeyVals(UBound(aOpenKeyVals))=sTempValue 
                     End If 
            objReg.DeleteValue HKEY_CURRENT_USER, strRegPath & "\" & Key & "\" & xlKey & "\" & subKey, oValue 
           End If 
          Next 
          For iOLoop = 0 To UBound(aOpenKeyVals) 
           If(iOLoop>0) Then sOpenName = "OPEN" & iOLoop 
           If aOpenKeyVals(iOLoop) <> "" Then 
                    objReg.SetStringValue HKEY_CURRENT_USER, strRegPath & "\" & Key & "\" & xlKey & "\" & subKey, sOpenName, aOpenKeyVals(iOLoop) 
                   End If 
          Next 

          sOpenName="OPEN" 
          Redim aOpenKeyVals (0) 
          aOpenKeyVals (0)="" 
         End If 
        End If 
       Next 
      End If 
      End If 
    Next 
Next