使用VBScript卸载Excel加载项

我正在尝试创build一个MSI安装程序,在Microsoft Excel中安装一个加载项(.xla)(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中创build一个自定义工具栏。 工具栏在卸载时不会被删除,并且Excel的设置的“加载项”部分中的加载项也不会被删除。

任何人都可以告诉我,如果这两件事情可以使用VBScript以编程方式完成?

提前致谢

VB(A)中几乎所有的集合都是基于1的。 您的循环从零开始,因此在尝试访问AddIns(0)时会失败。 这被掩盖的事实,你有On Error Resume Next

另外,您需要明确地删除工具栏。 简单地删除加载项将不会这样做。

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

 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