使用VBScript卸载Excel加载项

时间:2009-07-15 09:18:38

标签: excel vbscript add-in

我正在尝试创建一个MSI安装程序,将加载项(.xla)安装到Microsoft Excel(在我的情况下为2007)。安装顺利。我使用运行此VBScript文件的“自定义操作”:

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中创建自定义工具栏[安装。卸载时不会删除工具栏,并且Excel的设置的“加载项”部分中的加载项的输入也不是。

有人能告诉我这两件事是否可以使用VBScript以编程方式完成?

提前致谢

2 个答案:

答案 0 :(得分:2)

VB(A)中的几乎所有集合都是基于1的。你的循环从零开始,因此当它试图访问AddIns(0)时它将失败。你被On Error Resume Next

这一事实掩盖了

此外,您还需要明确删除工具栏。只需删除加载项就不会这样做。

我不能说我喜欢你这样做的方式,但它应该至少有50%的时间工作: - )

答案 1 :(得分: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