2017-06-28 17 views
1

最近、私たちのオフィスは新しいラップトップにアップグレードされました。幸いなことに、Windows 7から10への切り替えやデスクトップからラップトップへの切り替えでは、Pilotdelivers.comでポップアップを有効にする必要がある以外、このマクロの実行に関する問題は発生しませんでした。数週間の間、私たちは2つの異なるラップトップでこのマクロを実行し、すべてがスムーズに行われました。パイロット貨物トラッキングマクロは1台のコンピュータで動作しますが、別のコンピュータでは動作しません

今日、ラップトップの1つでは、マクロは正常に動作しなくなりましたが、もう一方は正常です。ポップアップが有効になっていること、および両方のコンピュータがネットワーク上の同じExcelワークシートから実行されていることを確認しました。私はコンピュータを2回再起動し、他のアプリケーションを開いていない状態でマクロを実行しました。ラップトップは同じモデルで、同時にインストールされます。同一のソフトウェアのインストールと更新。問題を抱えているラップトップは、私のコンピュータに精通していない同僚によって使用されており、動作しているラップトップは私のものです。だから、彼は彼が持ってはいけないと思っていた変更があるかもしれないが、私は何を確認するか分からない。

新しいタブを開くためにリンクをクリックするコード部分をスキップしているようです。

マクロが行うことになっているもの:

  1. コピーIE
  2. オープンワークシート上の追跡番号がテキストボックス
  3. クリックトラック
  4. 待ちに追跡番号を挿入新しいページを読み込むには
  5. トラッキング番号をクリックしてください。
  6. 最初のタブ
  7. 最新の更新が
  8. を配信された場合、それが優れて切り替わりそうかどうかを確認して配信入力と 配達日時、そうでない場合はそれを閉じをロードするために新しいタブを待ちます最新の更新を確認して、その行をワークシートに追加します( )。

    1. コピーをワークシート
    2. 上の追跡番号オープンIE
    3. は、テキストボックスに
    4. クリックトラック
    5. を追跡番号を挿入します。マクロがやっているように思える何

  9. 新しいページが読み込まれるのを待つ
  10. は、追跡番号lをクリックするとスキップするようです(すでにロードされている)をロードするために、現在のページのインク
  11. 待機
  12. 最新のアップデートを探していたときに(それが予想されるページはありませんので)、それは代わりに追跡番号 をつかむ
  13. それがマークされていますかどうかを確認するためのチェックデリバリー 10。はい、それはそれは、最新の更新を見て、ワークシート

に その行を追加していない場合には、このセクションの一部またはすべてをスキップのように思え、優れて配信入力と 配達日時に切り替わり場合以下

Dim ieDOC As HTMLDocument 
Set ieDOC = ie.document 

Set htmlColl = ieDOC.getElementsByTagName("a") 
For Each htmlInput In htmlColl 
    If htmlInput.ID = "clickElement" Then 
     htmlInput.Click 
    Exit For 
    End If 
Next htmlInput 

ie.Quit 

Set shellWins = New ShellWindows 
If shellWins.Count > 0 Then 
    Set ie2 = shellWins.Item(1) 
End If 

全コード:

Sub PilotTracking() 
Dim ProURL As String 
Dim ie As Object 
Dim ie2 As Object 
Dim RowCount As Integer 
Dim i As Integer 
Dim html_Document As HTMLDocument 
Dim htmlColl As MSHTML.IHTMLElementCollection 
Dim htmlInput As MSHTML.HTMLInputElement 
Dim shellWins As ShellWindows 
Dim htmlColl2 As MSHTML.IHTMLElementCollection 
Dim htmlInput2 As MSHTML.HTMLInputElement 
Dim marker As Integer 

RowCount = 0 
ProURL = "http://www.pilotdelivers.com/" 

Do While Not ActiveCell.Offset(RowCount, -5).Value = "" 

Set ie = CreateObject("InternetExplorer.application") 

With ie 
    .Visible = True 
    .navigate ProURL 
    Do Until Not ie.Busy And ie.readyState = 4: DoEvents: Loop 
End With 

Set Doc = ie.document 'works don't delete 

Doc.getElementById("tbShipNum").innerHTML = ActiveCell.Offset(RowCount, -5).Value 'works don't delete 

Doc.getElementById("btnTrack").Click 'works don't delete 

Do Until Not ie.Busy And ie.readyState = 4: DoEvents: Loop 

i = 0 
Do While i < 4 
    WaitHalfSec 
    i = i + 1 
Loop 

Do Until Not ie.Busy And ie.readyState = 4: DoEvents: Loop 

Dim ieDOC As HTMLDocument 
Set ieDOC = ie.document 

Set htmlColl = ieDOC.getElementsByTagName("a") 
For Each htmlInput In htmlColl 
    If htmlInput.ID = "clickElement" Then 
     htmlInput.Click 
    Exit For 
    End If 
Next htmlInput 

ie.Quit 


Set shellWins = New ShellWindows 
If shellWins.Count > 0 Then 
    Set ie2 = shellWins.Item(1) 
End If 

i = 0 
Do While i < 8 
    WaitHalfSec 
    i = i + 1 
Loop 

Do Until Not ie2.Busy And ie2.readyState = 4: DoEvents: Loop 

Set htmlColl2 = ie2.document.getElementsByTagName("td") 
For Each htmlInput2 In htmlColl2 
    If htmlInput2.className = "dxgv" Then 
     If ActiveCell.Offset(RowCount).Value = "" Then 
      ActiveCell.Offset(RowCount).Value = htmlInput2.innerText 
     Else 
      If ActiveCell.Offset(RowCount).Value <> "DELIVERED" Then 
       ActiveCell.Offset(RowCount, -2).Value = "" 
      Else 
       ActiveCell.Offset(RowCount, -2).Value = htmlInput2.innerText 
      End If 
      Exit For 
     End If 
    End If 
Next htmlInput2 

ie2.Quit 
Set shellWins = Nothing 
Set ie = Nothing 
Set ie2 = Nothing 

RowCount = RowCount + 1 

Loop 

Set shellWins = Nothing 
Set ie = Nothing 
Set ie2 = Nothing 

End Sub 

Sub WaitHalfSec() 
    Dim t As Single 
    t = Timer + 1/2 
     Do Until t < Timer: DoEvents: Loop 
End Sub 
+0

私は別のアカウントを持っていましたが、ログインが覚えられません。ほとんど私が知っていることは、自分で仕事でグーグルで学んだので、私の知識は非常に特定のものに限られています。ありがとう、結構です。私は自分の投稿が長すぎたことを心配していました。 –

+1

真。誰かがエラーを引き起こしている可能性があることを洞察するかもしれないと思っていました。また、投稿からマクロタグを削除しました。 –

+0

@Timはここからあなたの最善の賭けになるかもしれません:) – pnuts

答えて

0

の代わりにこの:

コードの0

Set htmlColl = ieDOC.getElementsByTagName("a") 
For Each htmlInput In htmlColl 
    If htmlInput.ID = "clickElement" Then 
     htmlInput.Click 
    Exit For 
    End If 
Next htmlInput 
あなたはこれを行うことができるようになります。

ieDOC.getElementById("clickElement").Click 

Idが特定のページ内で一意であると考えられます。他の場所でgetElementByIdを使用していますので、ここで使用されていない理由がありましたか?

私は多分問題はこれだと思いたい:

ie.Quit 

ようにコメントアウトしてみてください。この関数が返す

Function GetIE(sLocation As String) As Object 

    Dim objShell As Object, objShellWindows As Object, o As Object 
    Dim sURL As String 
    Dim retVal As Object 

    Set retVal = Nothing 
    Set objShell = CreateObject("Shell.Application") 
    Set objShellWindows = objShell.Windows 

    For Each o In objShellWindows 
     sURL = "" 
     On Error Resume Next 
     'check the URL and if it's the one you want then 
     ' assign it to the return value and exit the loop 
     sURL = o.document.Location 
     On Error GoTo 0 
     If sURL Like sLocation & "*" Then 
      Set retVal = o 
      Exit For 
     End If 
    Next o 
    Set GetIE = retVal 

End Function 

:あなたは正しいIEの文書をつかん問題がある場合のような何かをしようとし、その後、どこ新しいページのロード(?新しいタブ対新しいウィンドウ)

と、おそらく何か提供されたURLと一致するIEウィンドウ(つまり、最初にURLが渡されたsLocation文字列で始まる)

+0

私は以前、ie.quitを無駄にコメントアウトしようとしていましたが、残念ながらその投稿を忘れてしまいました。提案されたieDOC.getElementsById( "clickElement")を使用します。実行時エラー438で結果をクリックすると、オブジェクトはこのプロパティまたはメソッドをサポートしません。シェルの窓の提案については、私は明日それを試さなければならないだろうが、私はそれが問題ではないように感じる。ボタンがクリックされなかったかのように、新しいタブは開かれません。そこから選択する2ページがあり、それは間違ったものに行くのではない。それは唯一のものに行くだけです。彼は私の上で動作するので、これはコードの問題でもありますか? –

+1

タイミングの問題かもしれません。おそらく、2秒以上の遅延時間で実験してください。リンクをクリックした直後にIEを終了することは、私が思う良い計画ではないので、それにも言及します。 'ShellWindows'にはWindowsのエクスプローラウィンドウが含まれているので、あなたの意図したIEウィンドウではなくマクロを取得しているかもしれません:もしあなたの同僚がWindowsエクスプローラを開いていますが、私はWin7上にあるので、実際にあなたの設定を模倣しようとしているどのような方法でも本当にテストすることはできません。 –

+0

軽いタイプミス:コードブロック内の(不正な) 'getElementsById'ではなく、(正しい)' getElementById'です。 @SarahDawnLewisはこの回答にコメントをして、間違ったバージョンを使用していました。 – barrowc

関連する問題