Удаление надстройки Excel с использованием VBScript - PullRequest
3 голосов
/ 15 июля 2009

Я пытаюсь создать установщик MSI, который устанавливает надстройку (.xla) в Microsoft Excel (2007 в моем случае). Установка идет хорошо. Я использую «Custom Action», который запускает этот файл 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. Надстройка копируется в папку внутри «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 u [установка. Панель инструментов не удаляется при удалении, и запись надстройки в разделе «Надстройка» в настройках Excel также не предусмотрена.

Может кто-нибудь сказать мне, если эти две вещи могут быть сделаны программно с помощью VBScript?

заранее спасибо

Ответы [ 2 ]

2 голосов
/ 15 июля 2009

Почти все коллекции в VB (A) основаны на 1. Ваш цикл идет с нуля, и поэтому он потерпит неудачу, когда попытается получить доступ к AddIns(0). Это маскируется тем фактом, что у вас есть On Error Resume Next.

Также вам нужно явно удалить панель инструментов. Простое удаление надстройки этого не сделает.

Не могу сказать, что мне нравится, как вы это делаете, но это должно работать как минимум в 50% случаев: -)

0 голосов
/ 12 октября 2015
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
...