はじめまして。失礼な点が有りましたら申し訳有りません。
前提・実現したいこと
VBAでIEを起動し、google翻訳の結果を取得しセルに出力する。
上記は実現できたが、エラー回避の方法について改善できないか相談したい。
発生している問題・エラーメッセージ
Class要素から翻訳結果のテキストを取り出す際に、実行時エラー91が発生することがあります。
しかし、「デバッグ」→「継続」で処理を進めるとそのまま処理ができること、
また、Sleep関数で遅延させても回避できることから、Setステートメントの処理が完了していないと想像しています。
On Error Resume nextで処理を繰り返すことで回避したのですが、出来ればエラーを発生させたくないです。
Setステートメントが終了していることを確認して進めるような方法や、
その他エラーを回避できる方法が有りましたら教えていただけないでしょうか。
該当箇所は★で目印をつけております。
実行時エラー'91' オブジェクト変数またはWithブロック変数が定義されていません。
該当のソースコード
VBA
1 2Sub test() 3Dim objIE As New InternetExplorer 4Dim sl, tl, tgText, tgURL, URL As String '翻訳先URLを作成するための文字列 5Dim Class1 As Object '翻訳結果が記述されるClass 6Dim ResultText1, ResultText2 As String ' 翻訳された文字列 7 8sl = "ja" '翻訳元の言語 9tl = "en" '翻訳先の言語 10 11'IE(InternetExplorer)のオブジェクトを作成する 12Set objIE = CreateObject("InternetExplorer.Application") 13 14For i = 1 To 10 15tgText = Cells(i, 1).Value '翻訳対象 16tgURL = Excel.Application.WorksheetFunction.EncodeURL(tgText) '翻訳対象をURLエンコード 17URL = "https://translate.google.co.jp/?sl=" & sl & "&tl=" & tl & "&text=" & tgURL ' & "op=translate" 18 19Call ieView(objIE, URL) 'IEでGoogle翻訳にアクセスする処理 20 21Set Class1 = objIE.document.getElementsByClassName("NqnNQd") 22タグ1: 23On Error Resume Next'★ここを置き換えたい 24ResultText1 = Class1(0).innerText'★エラーが発生する箇所 25If Err.Number <> 0 Then 26 Err.Clear 27 GoTo タグ1 28End If 29 30Cells(i, 2).Value = ResultText1 31Next i 32 33objIE.Quit 34Set objIE = Nothing 35 36End Sub 37 38Sub ieView(objIE As InternetExplorer, _ 39 URL As String, _ 40 Optional viewFlg As Boolean = False) 41 42 'IE(InternetExplorer)を表示・非表示 43 objIE.Visible = viewFlg 44 45 '指定したURLのページを表示する 46 objIE.navigate URL 47 48 'IE(InternetExplorer)が完全表示されるまで待機 49 Call ieCheck(objIE) 50 51End Sub 52 53Sub ieCheck(objIE As InternetExplorer) 54 55 Dim timeOut As Date 56 57'完全にページが表示されるまで待機する 58 timeOut = Now + TimeSerial(0, 0, 20) 'タイムアウト時間の設定 59 60 Do While objIE.Busy = True Or objIE.readyState <> 4 61 DoEvents 62 Sleep 1 63 If Now > timeOut Then 'タイムアウト処理 64 objIE.Refresh 65 timeOut = Now + TimeSerial(0, 0, 20) 66 End If 67 Loop 68 69 timeOut = Now + TimeSerial(0, 0, 20) 70 71 Do While objIE.document.readyState <> "complete" 72 DoEvents 73 Sleep 1 74 If Now > timeOut Then 'タイムアウト処理 75 objIE.Refresh 76 timeOut = Now + TimeSerial(0, 0, 20) 77 End If 78 Loop 79 80End Sub
試したこと
If then でclass1に情報があるか判別する回路に置換してみたのですが、エラー回避ができませんでした。
If class1 is nothing then
Goto タグ1
end if
ResultText1 = Class1(0).innerText
※この場合はfor文の先頭でClass1 の初期化処理も追加しています。
補足情報(FW/ツールのバージョンなど)
Excel 2016
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー