【SeleniumVBA】一括Google翻訳（英→和）

# １　はじめに
以下のOKWAVEでの質問があり、最初の回答がSeleniumBasicで書かれた回答でしたので、SeleniumVBAで回答しようと思い、作成していたところ締め切られておりました。

https://okwave.jp/qa/q10282022.html

不足していた入力部分のコードはExcelVBAで補完して完結版を作ってしまったので、そのまま置いておくのももったいないと思い、掲載します。

# ２　VBA側の作業
**以下のコードを丸ごとコピーしてSeleniumVBA.xlsmに新規の標準モジュールを作成して貼り付け**てください。

:::note
もし、SeleniumVBAがまったく初めての方は、[こちら](https://note.com/sele_chan/n/n61a67c4379de)の記事を参考に**新規の標準モジュール作成**まで行ってください。
:::


```vb:標準モジュール
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
```
# ３　Excelシート側の作業
>**SeleniumVBA.xlsm内にシートを作成し、シート名は「翻訳」にしてください**。
>下記画像のとおり「翻訳ボタン」を作成しプロシージャ「Translate」を登録します。
>２行目は、右方向に１，２，３と連番を入力してください(最大列の判定に使用)。
>３行目はタイトル行で「連番」「英文」「和文」の順に入力してください
>Ａ列には必要数分の連番を入力(最大行の判定に使用)
>Ｂ列に英文を入力(下記画像では公式Wikiの説明文を使用)
>そして、「翻訳ボタン」を押すと、Ｃ列に和文が表示されます。

![ボタン作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/289dcaa3-1c2e-5a64-ecf5-7a5986ce72ba.png)

![ボタン作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/f379d650-3709-644b-02a3-7adf78d11bc0.png)

![翻訳.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/ca693b9a-7957-3287-eaf9-92f57174faaf.png)

 :::note
 上の画像の英文は[SeleniumVBAの公式Wiki](https://github.com/GCuser99/SeleniumVBA/wiki)から**要素の検索ができない理由で上位を占める「シャドウルート」内での検索方法について**を掲載しました。
:::

# ４　おわりに
この記事における動作確認は2025年1月5日時点です。