VBAで調べる利点は自動更新プログラムの作成時ぐらいなのでメモ気分で書いています
chromedirver.exeのバージョンの調べ方
あまり知られていません(多分)がchromedriver.exeのバージョンはchromedriver.exeを実行することで確認できます
※chromedriver.exeはSeleniumBasicフォルダにあるそれです

最初に出力されてる「Starting ChromeDriver 103.0.5060.53」が今のバージョンですね
これを踏まえてVBAでの取得方法です
まずSeleniumBasicフォルダのパスを取得する
インストールする途中でパスが表示されているはずなので自分で使う場合はそのままハードコーティングしてもok
とは言え、誰かに渡す時はパスがわからないので環境変数から取得する方が吉
SeleniumBasicフォルダのパターンは
- C:\Program Files\SeleniumBasic
- C:\Users\<ユーザー名>\AppData\Local\SeleniumBasic
のどちらかなので「Select Case」や「If」でどっちにフォルダがあるかチェックする
後者の場合はユーザー名がわからないのでEnviron関数を使って環境変数で取得するようにする
Dim ChromeDriverPath As String '---SeleniumBasicのパス変数
With CreateObject("Scripting.FileSystemObject")
Select Case True
Case .FolderExists(Environ("ProgramFiles(x86)") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramFiles(x86)") & "\SeleniumBasic"
Case .FolderExists(Environ("ProgramFiles") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramFiles") & "\SeleniumBasic"
Case .FolderExists(Environ("ProgramW6432") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramW6432") & "\SeleniumBasic"
Case .FolderExists(Environ("LOCALAPPDATA") & "\SeleniumBasic")
ChromeDriverPath = Environ("LOCALAPPDATA") & "\SeleniumBasic"
Case Else
MsgBox "'SeleniumBasic'のフォルダが見つかりませんでした", vbCritical
GetChromeDriverVersion = ""
Exit Function
End Select
End With
VBAで「chromedriver.exe」の実行結果を取得する
VBAでexeファイルを実行するならWScript.Shellを使えば実行できます
直接実行した場合、Exec・Runのどちらで実行しても課題が残るので結論を言うと一度ログファイルに実行結果を出力して、そのログファイルを読み込むようにしました
With CreateObject("Scripting.FileSystemObject")
'---バージョンチェック用のバッチを作成する
If .FileExists(ThisWorkbook.Path & "\chromedriver.bat") = False Then
Open ThisWorkbook.Path & "\chromedriver.bat" For Output As #1
Print #1, Chr(34) & ChromeDriverPath & "\chromedriver.exe" & Chr(34) & " > " & Chr(34) & ThisWorkbook.Path & "\chromedriver.log" & Chr(34)
Close
End If
End With
'---バージョンチェック用のバッチを実行する
wsh.Run "%ComSpec% /c " & Chr(34) & ThisWorkbook.Path & "\chromedriver.bat" & Chr(34), 0
ログファイルからバージョン情報を取得する
バージョン情報は一行目にあって規則的な出力になってるので
- 「Starting ChromeDriver 」を削除
- 最初の空白までをLeft関数とInstr関数、Find関数の組み合わせで取得
とかで取得できるものの、多分一番手っ取り早いのは正規表現での取得
※慣れてないと正規表現って蕁麻疹出ますよね…
ちなみにリビジョン番号は不要でビルド番号まであればOK
'---ログファイルの一行目を取得
Open ThisWorkbook.Path & "\chromedriver.log" For Input As #1
Line Input #1, buf
Close
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMat = objReg.Execute(buf)
GetChromeDriverVersion = objMat.Item(0)
最終的なサンプルソース
これまでのソースを組み合わせて要所で待機を入れたり不要になったファイルを削除したりして整理したソースがコチラ
Function GetChromeDriverVersion()
Dim objReg As Object ' VBScript_RegExp_55.RegExp '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objMatch As Object 'MatchCollection '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim wsh As Object: Set wsh = CreateObject("WScript.Shell")
Dim buf As String
'---起動しているchromedriver.exeがあれば落とす
Call Shell("cmd.exe /c taskkill /F /IM chromedriver.exe")
Application.Wait Now + TimeSerial(0, 0, 1)
'---SeleniumBasicフォルダーを探す
Dim ChromeDriverPath As String '---SeleniumBasicのパス変数
With CreateObject("Scripting.FileSystemObject")
Select Case True
Case .FolderExists(Environ("ProgramFiles(x86)") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramFiles(x86)") & "\SeleniumBasic"
Case .FolderExists(Environ("ProgramFiles") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramFiles") & "\SeleniumBasic"
Case .FolderExists(Environ("ProgramW6432") & "\SeleniumBasic")
ChromeDriverPath = Environ("ProgramW6432") & "\SeleniumBasic"
Case .FolderExists(Environ("LOCALAPPDATA") & "\SeleniumBasic")
ChromeDriverPath = Environ("LOCALAPPDATA") & "\SeleniumBasic"
Case Else
MsgBox "'SeleniumBasic'のフォルダが見つかりませんでした", vbCritical
GetChromeDriverVersion = ""
Exit Function
End Select
'---バージョンチェック用のバッチがなかったら作成する
If .FileExists(ThisWorkbook.Path & "\chromedriver.bat") = False Then
Open ThisWorkbook.Path & "\chromedriver.bat" For Output As #1
Print #1, Chr(34) & ChromeDriverPath & "\chromedriver.exe" & Chr(34) & " > " & Chr(34) & ThisWorkbook.Path & "\chromedriver.log" & Chr(34)
Close
End If
End With
'---バージョンチェック用のバッチを実行する
wsh.Run "%ComSpec% /c " & Chr(34) & ThisWorkbook.Path & "\chromedriver.bat" & Chr(34), 0
Application.Wait Now + TimeSerial(0, 0, 1)
'---起動しているchromedriver.exeを落とす
Call Shell("cmd.exe /c taskkill /F /IM chromedriver.exe")
Application.Wait Now + TimeSerial(0, 0, 1)
'---ログファイルの一行目を取得
Open ThisWorkbook.Path & "\chromedriver.log" For Input As #1
Line Input #1, buf
Close
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMatch = objReg.Execute(buf)
GetChromeDriverVersion = objMatch.Item(0)
'---作業が終わったらバッチファイルとログファイルを削除する
Do
Err.Clear
On Error Resume Next
Kill ThisWorkbook.Path & "\chromedriver.bat"
Kill ThisWorkbook.Path & "\chromedriver.log"
On Error GoTo 0
Loop While Err.Number <> 0
Set wsh = Nothing
End Function
Chrome.exeのバージョン取得方法
私が知ってるだけで取得方法は2つ
他にレジストリから取得する方法もあるけどそこまでする必要ないかなって思う
バージョン情報ファイルを参照する
バージョン情報が記載されている便利なファイルがあります
%LOCALAPPDATA%\Google\Chrome\User Data\Last Version

拡張子は無いですがメモ帳などで開けば中身の確認ができてVBAでもテキストファイルの読み込みと同じ手法でデータの取得ができる
最終的にはchromedirver.exeの時と同じで正規表現でビルド番号まで取得する
Private Function GetChromeAppVersion() As String
'====================================================================================================
'Google.exeのバージョンを取得する
'====================================================================================================
Dim VersionFile As String
Dim buf As String
VersionFile = Environ("LOCALAPPDATA") & "\Google\Chrome\User Data\Last Version"
If CreateObject("Scripting.FileSystemObject").FileExists(VersionFile) Then
Open VersionFile For Input As #1
Line Input #1, buf
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMat = objReg.Execute(buf)
GetChromeAppVersion = objMat.Item(0)
Close
Else
MsgBox "Chrome.exe のバージョンが取得できませんでした", vbCritical
GetChromeAppVersion = ""
End If
End Function
chrome.exeと同じディレクトリにあるバージョンフォルダから読み取る
chrome.exeが保存されているフォルダの中にバージョン名のフォルダがあるのでここから取得する

複数バージョンフォルダがあった時の考慮をしてないからもう少し丁寧にやったほうがいいかもとか思いつつ、こっちのパターンは使わない想定なのでこんなもんで
Function GetChromeExeVersion()
Dim objReg As Object ' VBScript_RegExp_55.RegExp '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objMatch As Object 'MatchCollection '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objFso As New Scripting.FileSystemObject
Dim objFolder As Folder
GetChromeExeVersion = ""
'---chrome.exeがあるフォルダーを探す
Dim ChromeExePath As String '---chrome.exeがあるフォルダーのパス変数
With CreateObject("Scripting.FileSystemObject")
Select Case True
Case .FolderExists(Environ("ProgramFiles(x86)") & "\Google\Chrome\Application")
ChromeExePath = Environ("ProgramFiles(x86)") & "\Google\Chrome\Application"
Case .FolderExists(Environ("ProgramFiles") & "\Google\Chrome\Application")
ChromeExePath = Environ("ProgramFiles") & "\Google\Chrome\Application"
Case .FolderExists(Environ("ProgramW6432") & "\Google\Chrome\Application")
ChromeExePath = Environ("ProgramW6432") & "\Google\Chrome\Application"
Case .FolderExists(Environ("LOCALAPPDATA") & "\Google\Chrome\Application")
ChromeExePath = Environ("LOCALAPPDATA") & "\Google\Chrome\Application"
Case Else
MsgBox "'chrome.exe'のフォルダが見つかりませんでした", vbCritical
Exit Function
End Select
'---サブフォルダの名前を正規表現でマッチさせて取得する
For Each objFolder In .GetFolder(ChromeExePath).SubFolders
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMatch = objReg.Execute(objFolder.Name)
If objMatch.Count > 0 Then
GetChromeExeVersion = objMatch.Item(0)
Exit For
End If
Next
End With
If GetChromeExeVersion = "" Then
MsgBox "chrome.exeのバージョンが取得できませんでした", vbCritical
End If
End Function
あとがき
2022年8月現在ではこのプログラムを使って自動更新プログラムを作ってます
書いてて改めて思いましたがやっぱり自動更新プログラムの作成時ぐらいしか活用方法ない気がする…
コメント