はじめまして。失礼な点が有りましたら申し訳有りません。
前提・実現したいこと
VBAでIEを起動し、google翻訳の結果を取得しセルに出力する。
上記は実現できたが、エラー回避の方法について改善できないか相談したい。
発生している問題・エラーメッセージ
Class要素から翻訳結果のテキストを取り出す際に、実行時エラー91が発生することがあります。
しかし、「デバッグ」→「継続」で処理を進めるとそのまま処理ができること、
また、Sleep関数で遅延させても回避できることから、Setステートメントの処理が完了していないと想像しています。
On Error Resume nextで処理を繰り返すことで回避したのですが、出来ればエラーを発生させたくないです。
Setステートメントが終了していることを確認して進めるような方法や、
その他エラーを回避できる方法が有りましたら教えていただけないでしょうか。
該当箇所は★で目印をつけております。
実行時エラー'91' オブジェクト変数またはWithブロック変数が定義されていません。
該当のソースコード
VBA
Sub test() Dim objIE As New InternetExplorer Dim sl, tl, tgText, tgURL, URL As String '翻訳先URLを作成するための文字列 Dim Class1 As Object '翻訳結果が記述されるClass Dim ResultText1, ResultText2 As String ' 翻訳された文字列 sl = "ja" '翻訳元の言語 tl = "en" '翻訳先の言語 'IE(InternetExplorer)のオブジェクトを作成する Set objIE = CreateObject("InternetExplorer.Application") For i = 1 To 10 tgText = Cells(i, 1).Value '翻訳対象 tgURL = Excel.Application.WorksheetFunction.EncodeURL(tgText) '翻訳対象をURLエンコード URL = "https://translate.google.co.jp/?sl=" & sl & "&tl=" & tl & "&text=" & tgURL ' & "op=translate" Call ieView(objIE, URL) 'IEでGoogle翻訳にアクセスする処理 Set Class1 = objIE.document.getElementsByClassName("NqnNQd") タグ1: On Error Resume Next'★ここを置き換えたい ResultText1 = Class1(0).innerText'★エラーが発生する箇所 If Err.Number <> 0 Then Err.Clear GoTo タグ1 End If Cells(i, 2).Value = ResultText1 Next i objIE.Quit Set objIE = Nothing End Sub Sub ieView(objIE As InternetExplorer, _ URL As String, _ Optional viewFlg As Boolean = False) 'IE(InternetExplorer)を表示・非表示 objIE.Visible = viewFlg '指定したURLのページを表示する objIE.navigate URL 'IE(InternetExplorer)が完全表示されるまで待機 Call ieCheck(objIE) End Sub Sub ieCheck(objIE As InternetExplorer) Dim timeOut As Date '完全にページが表示されるまで待機する timeOut = Now + TimeSerial(0, 0, 20) 'タイムアウト時間の設定 Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Sleep 1 If Now > timeOut Then 'タイムアウト処理 objIE.Refresh timeOut = Now + TimeSerial(0, 0, 20) End If Loop timeOut = Now + TimeSerial(0, 0, 20) Do While objIE.document.readyState <> "complete" DoEvents Sleep 1 If Now > timeOut Then 'タイムアウト処理 objIE.Refresh timeOut = Now + TimeSerial(0, 0, 20) End If Loop End Sub
試したこと
If then でclass1に情報があるか判別する回路に置換してみたのですが、エラー回避ができませんでした。
If class1 is nothing then
Goto タグ1
end if
ResultText1 = Class1(0).innerText
※この場合はfor文の先頭でClass1 の初期化処理も追加しています。
補足情報(FW/ツールのバージョンなど)
Excel 2016
ここにより詳細な情報を記載してください。
まだ回答がついていません
会員登録して回答してみよう