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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1400643/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-11 10:46:17  来源:igfitidea点击:

How to know if the VBA component of Office is installed?

ms-officevbaexcel-vbaexcel

提问by Jason

My Excel addin requires the Visual Basic for Applications option of Excel to be installed in order for it to work. I would like my install (which is written with InnoSetup) to be able to detect if VBA is installed and warn the user if it is not.

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

How can I detect if the option is already installed?

如何检测该选件是否已安装?

alt text

替代文字

采纳答案by Tony Toews

One possibility is to check for the presence of VBE6.DLL in C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6. Or poke about in the registry looking for references to that DLL or the string VBA.

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

Note that this location/file name might be different for Office 2010 as there are some changes in the VBA editor.

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

回答by Anonymous Type

Why don't you try a function like this... 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 

回答by Siarhei Helis

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;
    }
}

回答by Bernd Ott

We are talking about Windows Installer components. The Installer has an API, where you can request if a feature/component is installed. ofcurse that api also return where the component is installed. if nessacary you can install missing components.

我们正在谈论 Windows Installer 组件。安装程序有一个 API,您可以在其中请求是否安装了功能/组件。该 api 也会返回安装组件的位置。如果 nessacary 您可以安装缺少的组件。

the only thing you need, is the component und product guid.

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

see documentation

查看文档

回答by Armin Sadeghi

The best way to detect if VBA is installed is to use the MsiQueryFeatureState API and ask Windows Installer whether the feature is installed or not. Below is some sample code that does this in VB.NET, however you could code this in any language that allows you to call COM components (sorry, not familiar with InnoSetup).

检测是否安装了 VBA 的最佳方法是使用 MsiQueryFeatureState API 并询问 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