0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SeleniumVBA】一括Google翻訳(英→和)

Last updated at Posted at 2024-12-28

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列に和文が表示されます。

ボタン作成.png

ボタン作成2.png

翻訳.png

上の画像の英文はSeleniumVBAの公式Wikiから要素の検索ができない理由で上位を占める「シャドウルート」内での検索方法についてを掲載しました。

4 おわりに

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?