質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

VBA setステートメント使用時の処理待ち方法

mo-mo-mo
mo-mo-mo

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1回答

0評価

1クリップ

397閲覧

投稿2022/01/02 11:51

はじめまして。失礼な点が有りましたら申し訳有りません。

前提・実現したいこと

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

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

mo-mo-mo

2022/01/14 02:08

objecrt変数についての理解が深まってエラーが発生した根本の原因がわかった(気がする)ので追記しておきます。 元々、IEで読込が終わっていないならSetの時点でエラーが出るのでは?と考えていましたが、 object変数(今回のコードで言うClass1)は保管した変数へたどり着くための目印のようなものと理解しました。そのため、Setでは目印をつけただけなので異常は出ない。そしてClass1のテキスト情報を読み出そうとした時、実際にはページの読込途中で存在していない、IEのテキスト情報を読み出す処理を行っているためにエラーが発生しているということでした。 下記が参考になりました。 https://excel-ubara.com/excelvba4/EXCEL_VBA_423.html

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。