Как узнать, установлен ли компонент VBA Office?
My Excel addin требует, чтобы для его работы был установлен параметр Visual Basic для приложений Excel. Я хотел бы, чтобы моя установка (которая написана с помощью InnoSetup) могла определить, установлен ли VBA, и предупредить пользователя, если это не так.
Как я могу определить, если опция уже установлена?
alt текст http://img35.imageshack.us/img35/9333/officeqm.png
5 ответов
можно проверить наличие VBE6.DLL в архиве C:\Program \Common папку общий\\для vba6 ВБА. Или поищите в реестре ссылки на эту DLL или строку VBA.
обратите внимание, что это расположение/имя файла может отличаться для Office 2010, поскольку в Редакторе VBA есть некоторые изменения.
почему бы вам не попробовать такую функцию... найти здесь
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
мы говорим о компонентах установщика Windows. Установщик имеет API, где вы можете запросить, установлен ли компонент / компонент. ofcurse, что api также возвращает, где установлен компонент. если только вы можете установить недостающие компоненты.
единственное, что вам нужно, это компонент и продукт guid.
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;
}
}
лучший способ определить, установлен ли VBA, - использовать API MsiQueryFeatureState и спросить установщика 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