0

ここでいくつかの機能を自動化しようとしています。そのために、単純なシステムを構築しました。

ローカル Web ページでは、必要なすべてのデータを入力し、ボタンを押すと、このすべてのデータが Excel シートに転送されます。

良いニュースは次のとおりです。悪いニュース?すべてのコンピューターにあるわけではありません。

ユーザーが VBScript を開くと、すべてが開始されます。このスクリプトは、ページを開き、いくつかのアクションをリッスンします。このようなアクションが実行されると、ページが閉じられ、その内容が Excel ファイルに書き込まれます。

このスクリプトを自宅のコンピューターで実行すると、魔法のように機能し、何の問題もありません。しかし、これをオフィスで実行しようとすると、話はまったく異なります。

ページをGoogleに変更すると、IEが機能したため、ローカルページを開くと、IEのアイデンティティの一部が失われるようです。

FilePath = "C:\Hours"
PageFilePath = FilePath & "\HourAppointment.html"
'PageFilePath = "www.google.com"

    Set objExplorer = CreateObject("InternetExplorer.Application")

    objExplorer.Visible = 1

    objExplorer.Width   = 1200
    objExplorer.Height  = 700
    objExplorer.Left    = 10
    objExplorer.Top     = 10

    Call objExplorer.Navigate2( PageFilePath )
    Call WaitForIExplorer( objExplorer )

    objExplorer.Quit

Private Function WaitForIExplorer(objExplorer)

    Do until objExplorer.readyState = 4
        WScript.Sleep 1000
    Loop

    Do While objExplorer.Busy = True
        WScript.Sleep 1000
    Loop
End Function

ページは正常に開きますが、スクリプト エンジンが ReadyState を読み込もうとするとすぐに失敗します。

ReadyState を読み取る前に遅延を設定する (10 秒以上) など、いくつかの組み合わせを試しましたが、役に立ちませんでした。また、IE オブジェクトが決して null ではないこと、IsNull 関数で確認したこと、IE のセキュリティ設定をいじったこと、特に何も管理していないことも言及する価値があります。作る。

それで、誰かが私のプログラムで一体何が起こっているのか知っていますか?

@Teemu のおかげで、ReadyState ではなく Busy のみを使用して問題を最小限に抑えることができました。それでも、私は新しい機能を追加しました:

    Private Function CheckValidity(objExplorer)
      CheckValidity = False

      Set bodyContent = objExplorer.Document.Body.All

      saveValue     = bodyContent.savePressed.Value
      appointValue  = bodyContent.newAppointmentPressed.Value

      If ((saveValue = "SAVE") _
        And (appointValue = "SAVE")) Then

        CheckValidity = True
      End If
    End Function

Document Body を取得しようとすると、Interface Unknown Error で失敗します。これは、ページが完全に読み込まれていないためだと理解していますが、その前に別の Sleep 呼び出しを変更せずに行ったため、よくわかりません。

編集: 以下の私の回答を使用して、IE がページ上のスクリプトをブロックしていて、それらを有効にするように求めているために問題が発生していることに気付きました。クリックするとページがリロードされ、スクリプトが失われます。今のところ解決策がなく、調査中です。

4

1 に答える 1

0

この問題の「修正」を作成しました。私が疑ったように、問題は VB コードが実行される速度と IE がページを開く速度にあります。

私が行ったMsgBox()ことは、ページ全体がロードされたときにのみ閉じられるべきである を単に置くことです。それは魅力のように機能しますが、「これはあるべき姿ではない」という感覚を残します.

私の問題を解決するので、これを答えとして分類していますが、より良い解決策が欲しいです。

ご協力ありがとうございました。

于 2013-11-12T11:00:29.313 に答える