2009-07-15 78 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