代码之家  ›  专栏  ›  技术社区  ›  Jason

如何知道Office的VBA组件是否已安装?

  •  6
  • Jason  · 技术社区  · 15 年前

    “我的Excel加载项”需要安装Excel的Visual Basic for Applications选项才能工作。我希望我的安装(用innosetup编写)能够检测是否安装了vba,如果没有安装,则警告用户。

    如何检测选项是否已安装?

    alt text http://img35.imageshack.us/img35/9333/officeqm.png

    5 回复  |  直到 10 年前
        1
  •  2
  •   Tony Toews    15 年前

    一种可能性是检查C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6中是否存在vbe6.dll。或者在注册表中查找对该dll或字符串vba的引用。

    请注意,对于Office2010,此位置/文件名可能有所不同,因为在VBA编辑器中有一些更改。

        2
  •  0
  •   Anonymous Type    15 年前

    你为什么不试试这样的功能… 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 
    
        3
  •  0
  •   coding Bott    11 年前

    我们正在讨论Windows Installer组件。 安装程序有一个API,您可以在其中请求是否安装了功能/组件。 of诅咒API也返回安装组件的位置。 如果是Nessacary,您可以安装丢失的组件。

    您唯一需要的是组件和产品guid。

    see documentation

        4
  •  0
  •   AKS    11 年前
    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;
        }
    }
    
        5
  •  0
  •   Armin Sadeghi    10 年前

    检测是否安装了VBA的最佳方法是使用msiQueryFeatureStateAPI并询问Windows Installer是否安装了该功能。下面是一些在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