我正在尝试创建一个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以编程方式完成?
提前致谢
答案 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