2009-09-09 40 views

Respuesta

2

Una posibilidad es comprobar la presencia de VBE6.DLL en C: \ Archivos de programa \ Archivos comunes \ Microsoft Shared \ VBA \ VBA6. O busque en el registro buscando referencias a esa DLL o la cadena VBA.

Tenga en cuenta que esta ubicación/nombre de archivo puede ser diferente para Office 2010 ya que hay algunos cambios en el editor de VBA.

+0

Esto no funciona para Office 365, desafortunadamente. –

0

¿Por qué no pruebas una función como esta ... found here

Option Explicit 
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long 
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long 

Private Sub cmdCheck_Click() 
MsgBox "Exist ??? =" & CheckForComponent("user32.dll") 
End Sub 

Private Function CheckForComponent(ComPath As String) As Boolean 
Dim Ret As Long 
Ret = LoadLibrary(ComPath) 
FreeLibrary Ret 

If Ret = 0 Then 
     CheckForComponent = False 
    Else 
     CheckForComponent = True 
End If 

End Function 
0
public static class VbePrerequisiteDetector { 
    private const string VbeInstallationPathKey = @"SOFTWARE\Microsoft\VBA"; 
    private const string Vbe6InstallationPathValue = "Vbe6DllPath"; 
    private const string Vbe7InstallationPathValue = "Vbe7DllPath"; 

    /// <summary> 
    /// Return true if VBE6 installed. VBE6 is prerequisite for for Office2003 and Office2007 
    /// </summary> 
    /// <returns>Return true if VBE6 installed.</returns> 
    public static bool IsVbe6Installed() { 
     try { 
      RegistryKey vbaPathKey = Registry.LocalMachine.OpenSubKey(VbeInstallationPathKey); 

      if (vbaPathKey != null) { 
       if (vbaPathKey.GetValue(Vbe6InstallationPathValue) != null) { 
        string pathToVbe = (string)vbaPathKey.GetValue(Vbe6InstallationPathValue); 
        if (File.Exists(pathToVbe)) { 
         return true; 
        } 

       } 
      } 
     } 
     catch (Exception) { 
      //Ignore all exceptions 
     } 
     return false; 
    } 

    /// <summary> 
    /// Return true if VBE7 installed. VBE7 is prerequisite for for Office2010 
    /// </summary> 
    /// <returns>Return true if VBE7 installed.</returns> 
    public static bool IsVbe7Installed() { 
     try { 
      RegistryKey vbaPathKey = Registry.LocalMachine.OpenSubKey(VbeInstallationPathKey); 

      if (vbaPathKey != null) { 
       if (vbaPathKey.GetValue(Vbe7InstallationPathValue) != null) { 
        string pathToVbe = (string)vbaPathKey.GetValue(Vbe7InstallationPathValue); 
        if (File.Exists(pathToVbe)) { 
         return true; 
        } 

       } 
      } 
     } 
     catch (Exception) { 
      //Ignore all exceptions 
     } 
     return false; 
    } 
} 
+0

Las etiquetas en este son VBA y Office. ¿Seguro que quieres publicar una respuesta que no esté relacionada con las etiquetas sin ninguna explicación? – Fionnuala

0

Estamos hablando de componentes de Windows Installer. El instalador tiene una API, donde puede solicitar si se instala una característica/componente. ofcurse that api también devuelve donde está instalado el componente. si nessacary puede instalar los componentes faltantes.

lo único que necesita, es el componente y guía del producto.

see documentation

0

La mejor manera de detectar si se ha instalado VBA es el uso de la API MsiQueryFeatureState y pedir instalador de Windows si la función está instalado o no. A continuación se muestra un ejemplo de código que hace esto en VB.NET; sin embargo, puede codificar esto en cualquier idioma que le permita llamar a los componentes COM (lo siento, no estoy familiarizado con InnoSetup).

Private Declare Function MsiQueryFeatureState Lib "Msi" Alias "MsiQueryFeatureStateA" (ByVal Product As String, ByVal Feature As String) As Long 

Public Function FVbaAvailable() As Boolean 

    Dim objExcelApp As Object 
    Dim strProductCode As String 
    Dim nState As Long 
    Dim fAvailable As Boolean = False 

    Try 
     ' Start an Excel instance and get the product code. 
     objExcelApp = CreateObject("Excel.Application") 
     strProductCode = DirectCast(objExcelApp.ProductCode, String) 

     ' Get FeatureState for the VBAFiles Feature. 
     nState = MsiQueryFeatureState(strProductCode, "VBAFiles") 

     If (nState = 1) OrElse (nState = 3) OrElse (nState = 4) Then 
      ' VBA is available. 
      fAvailable = True 
     End If 

     ' Clean up. 
     objExcelApp.Quit() 
     Runtime.InteropServices.Marshal.FinalReleaseComObject(objExcelApp) 
     objExcelApp = Nothing 
    Catch ex As Exception 
     Trace.WriteLine(ex.Message) 
    End Try 

    Return fAvailable 
End Function 
Cuestiones relacionadas