1 はじめに
以下のOKWAVEでの質問があり、最初の回答がSeleniumBasicで書かれた回答でしたので、SeleniumVBAで回答しようと思い、作成していたところ締め切られておりました。
不足していた入力部分のコードはExcelVBAで補完して完結版を作ってしまったので、そのまま置いておくのももったいないと思い、掲載します。
2 VBA側の作業
以下のコードを丸ごとコピーしてSeleniumVBA.xlsmに新規の標準モジュールを作成して貼り付けてください。
もし、SeleniumVBAがまったく初めての方は、こちらの記事を参考に新規の標準モジュール作成まで行ってください。
Option Explicit
Private Driver As SeleniumVBA.WebDriver
Private Ws As Worksheet
Private MaxRow As Long '当該シートのデータ最大行
Private MaxCol As Long '当該シートのデータ最大列
Public Sub Translate()
Set Driver = SeleniumVBA.New_WebDriver
With Driver
.StartChrome 'Chromeをスタート。
.OpenBrowser 'ブラウザを立ち上げる。
'翻訳を待つ最大時間を設定(10秒)。
.ImplicitMaxWait = 10000
'PageLoadの待機時間の最大値を設定(10秒)。
.PageLoadTimeout = 10000
'ワークシート準備(翻訳の名前で)
Dim Ws As Worksheet: Set Ws = Sheets("翻訳")
MaxRow = F_getLastRow(Ws, 1) '最大行数取得(2つ目の引数はチェック用列番号)
MaxCol = F_getLastCol(Ws, 3) '最大列数取得(2つ目の引数はチェック用行番号)
'翻訳実施
Dim strResult As String
Dim cntRow As Long
For cntRow = 4 To MaxRow
'翻訳文が戻り値
strResult = F_TranslateEn2JP(Ws.cells(cntRow, 2))
'エクセル転記
Ws.cells(cntRow, 3) = strResult
Next
'終了
.CloseBrowser
.Shutdown
MsgBox "翻訳が完了しました"
End With
End Sub
Private Function F_TranslateEn2JP(strSource As String) As String
'引数の文字列を立ち上げているgoogle翻訳で翻訳して日本語で返す。
With Driver
Dim i As Long
Dim webElm As WebElement
Dim webElems As WebElements '要素を借り受けする変数。
Dim strAry() As String '要素の内容を借り受けする変数。
'翻訳文が空白だった場合終了。
If Trim(strSource) = "" Then
Exit Function
End If
'URLに翻訳する文章を入れてgoogle翻訳のページを開く。
.NavigateTo "https://translate.google.com/?sl=auto&tl=ja&text=" & strSource & "&op=translate"
'翻訳結果を取得(複数要素)
Set webElems = .FindElements(By.XPath, "//span[@class='ryNqvb']")
'改行は複数の要素に跨るので、それらを一つの文字列に結合する。
ReDim strAry(1 To webElems.Count)
For i = 1 To webElems.Count
strAry(i) = webElems.Item(i).GetText
Next i
F_TranslateEn2JP = Join(strAry, vbCrLf)
'ひとつ前に戻って翻訳結果と履歴をクリア。
.GoBack
End With
End Function
Private Function F_getLastRow(Ws As Worksheet, Optional checkCol As Long = 1) As Long
'--最終行を取得する補助関数 --
Dim lastRow As Long
lastRow = Ws.UsedRange.row + Ws.UsedRange.rows.Count - 1
F_getLastRow = 0
Dim cntRow As Long
For cntRow = lastRow To 1 Step -1
If Ws.cells(cntRow, checkCol).value <> "" Then
F_getLastRow = cntRow
Exit For
End If
Next
End Function
Private Function F_getLastCol(Ws As Worksheet, Optional checkRow As Long = 1) As Long
'--最終列を取得する補助関数 --
Dim lastCol As Long
lastCol = Ws.UsedRange.Column + Ws.UsedRange.Columns.Count - 1
F_getLastCol = 0
Dim cntCol As Long
For cntCol = lastCol To 1 Step -1
If Ws.cells(checkRow, cntCol).value <> "" Then
F_getLastCol = cntCol
Exit For
End If
Next
End Function
3 Excelシート側の作業
SeleniumVBA.xlsm内にシートを作成し、シート名は「翻訳」にしてください。
下記画像のとおり「翻訳ボタン」を作成しプロシージャ「Translate」を登録します。
2行目は、右方向に1,2,3と連番を入力してください(最大列の判定に使用)。
3行目はタイトル行で「連番」「英文」「和文」の順に入力してください
A列には必要数分の連番を入力(最大行の判定に使用)
B列に英文を入力(下記画像では公式Wikiの説明文を使用)
そして、「翻訳ボタン」を押すと、C列に和文が表示されます。
上の画像の英文はSeleniumVBAの公式Wikiから要素の検索ができない理由で上位を占める「シャドウルート」内での検索方法についてを掲載しました。
4 おわりに
この記事における動作確認は2025年1月5日時点です。