使用VBScript卸载Excel插件

3

我想创建一个 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属性将addin的位置传递给脚本。 Add-in被复制到“Program Files”文件夹中的一个文件夹中,直到卸载为止。这由安装程序本身处理。
问题出现在我使用卸载脚本时:
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个回答

2
几乎所有VB(A)中的集合都是基于1的。您的循环从0开始,因此当它尝试访问AddIns(0)时,它将失败。这被On Error Resume Next掩盖了。
另外,您需要明确删除工具栏。仅删除插件是不够的。
我不能说我喜欢你的做法,但至少50%的时间它应该可以使用 :-)

插件现已移至“未激活的应用程序插件”部分。这很有帮助。 - pancake

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接