我的目标是避免来自VBA调试器的错误消息。需要检查已安装的7-zip版本,程序文件/或程序文件(x86):
尝试做简单的“IF”功能。
Dim PathZipProgram As String
strCommand As String
PathZipProgram = "C:\Program Files(x86)\7-Zip\7z.exe"
If Right(PathZipProgram, 1) Then
PathZipProgram = PathZipProgram
Else
PathZipProgram = "C:\Program Files\7-Zip\7z.exe"
End If
Shell strCommand
strCommand = """" & PathZipProgram & """ a -tzip """
VBA找不到7zip。
您可以检查文件是否存在function
,如下所示:
Function FileExists(FilePath As String) As Boolean
Dim TestStr As String
TestStr = ""
On Error Resume Next
TestStr = Dir(FilePath)
On Error GoTo 0
If TestStr = "" Then
FileExists = False
Else
FileExists = True
End If
End Function
然后在您的代码中使用它:
Dim PathZipProgram As String
Dim strCommand As String
PathZipProgram = "C:\Program Files(x86)\7-Zip\7z.exe"
If Not FileExists(PathZipProgram) Then
PathZipProgram = "C:\Program Files\7-Zip\7z.exe"
End If
Shell strCommand
strCommand = """" & PathZipProgram & """ a -tzip """
希望这个帮助作为一个起点。
安装路径:7-Zip可以安装在另一个磁盘位置(例如
D:
驱动器或其他位置)。您确实需要从注册表中读取路径。以下几点建议:
1. Hacky Version
我已经在下面放了一个完整的脚本来使用,但你基本上可以得到你想要的hacky方式(确保路径实际存在 - 显然 - 如果有问题可能使用"C:\Program Files\7-Zip"
):
Check File Exists:
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists("C:\Program Files (x86)\7-Zip\7z.exe")) Then
' Do Stuff
End If
Get File Version:
Set fso = CreateObject("Scripting.FileSystemObject")
MsgBox fso.GetFileVersion("C:\Program Files (x86)\7-Zip\7z.exe")
请不要依赖这个。它最终会失败。请看下面。
2. Full Version
这是一个完整版本,您需要创建一些希望可靠的东西。基本上从注册表中读取路径并从那里获取:
Const HKEY_LOCAL_MACHINE = &H80000002 : strComputer = "."
Set fso = CreateObject("Scripting.FileSystemObject")
Set reg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
' 64-bit - Read 7-zip installation path from registry
regpath64 = "SOFTWARE\7-Zip"
reg.GetStringValue HKEY_LOCAL_MACHINE, regpath64, "Path64", regvalue64
fullpath64 = regvalue64 + "\" + "7z.exe"
If (fso.FileExists(fullpath64)) Then
MsgBox "7-zip 64-bit: " + fso.GetFileVersion(fullpath64), vbOKOnly, "64-bit:"
End If
' 32-bit - Read 7-zip installation path from registry
regpath32 = "SOFTWARE\WOW6432Node\7-Zip"
reg.GetStringValue HKEY_LOCAL_MACHINE, regpath32, "Path", regvalue32
fullpath32 = regvalue32 + "\" + "7z.exe"
If (fso.FileExists(fullpath32)) Then
MsgBox "7-zip 32-bit: " + fso.GetFileVersion(fullpath32), vbOKOnly, "32-bit:"
End If
免责声明:对于64位注册表读取:可能有一个Path和一个Path64条目(我有两个)。不确定早期版本和/或更高版本的版本。请检查。