Как узнать, установлен ли компонент VBA Office? - PullRequest
6 голосов
/ 09 сентября 2009

Для надстройки Excel требуется, чтобы для работы была установлена ​​опция Excel для приложений. Я хотел бы, чтобы моя установка (которая написана с помощью InnoSetup) могла определить, установлен ли VBA, и предупредить пользователя, если это не так.

Как я могу определить, установлена ​​ли эта опция?

alt text

Ответы [ 5 ]

2 голосов
/ 10 сентября 2009

Одна из возможностей - проверить наличие VBE6.DLL в C: \ Program Files \ Common Files \ Microsoft Shared \ VBA \ VBA6. Или покопайтесь в реестре в поисках ссылок на эту DLL или строку VBA.

Обратите внимание, что это местоположение / имя файла может отличаться для Office 2010, поскольку в редакторе VBA есть некоторые изменения.

0 голосов
/ 09 апреля 2015

Лучший способ определить, установлен ли VBA, - это использовать MsiQueryFeatureState API и спросить установщика Windows, установлена ​​ли эта функция или нет. Ниже приведен пример кода, который делает это в VB.NET, однако вы можете кодировать его на любом языке, который позволяет вызывать компоненты COM (извините, не знаком с 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
0 голосов
/ 05 сентября 2013

Речь идет о компонентах установщика Windows. Установщик имеет API, где вы можете запросить, установлен ли компонент / компонент. Конечно же, API также возвращают туда, где установлен компонент. если нет, вы можете установить недостающие компоненты.

единственное, что вам нужно, это руководство по компонентам и продукту.

см. Документацию

0 голосов
/ 14 января 2011
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 голосов
/ 25 мая 2010

Почему бы вам не попробовать такую ​​функцию ... найдено здесь

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 
...