2009-07-15 2 views
3

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

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

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

ответ

2

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

Кроме того, вам необходимо явно удалить панель инструментов. Просто удаление надстройки этого не сделает.

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

+0

Надстройка теперь перемещен в неактивные надстройки приложений ". Помогает. – 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 
Смежные вопросы