• ベストアンサー

Exselで外部データの取り込みのエラーについて

為替レートを24時間Exselの外部データの取り込みを使って取得をしていますが、時々次のようなエラーメッセ-ジが出てプログラムが止まっています。 (http://trade.gaitame/rateを開くことはできません。インターネットサーバーまたはプロシキサーバーが見つかりませんでした。) プログラムを止めずに別のホームページから取得するように設定したいのですが ちなみに3箇所から同時に取得しています。プログラム上で取得先は切り替え可能なのですが、エラー処理がわかりませんよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >普通のプロシージャエラー(構文エラーとか実行時エラー)のような表示ではないエラーメッセ-ジがでます。 それは、構文や実行時エラーではありませんから、サイレントモードがあるなら、そのオプションをOnにすればよいし、そうでなければ、自動的に取得はできません。MsgBox で対話モードにしてしまうと、コードが停止してしまいます。 http://trade.gaitame/rate に関しては、 >インターネットサーバーまたはプロシキサーバーが見つかりませんでした。 そのメッセージは、正確には表していないような気がします。 以下は、単なるサンプルです。 以下の場合は、Yahoo の為替コーナーとhttp://trade.gaitame/rate を判定するだけのものです。 実際のコードは、もう少し複雑になりますが、考えていただくためのたたき台にしてください。 例えば、以下のようにMsgBox にコメントブロックを入れて、サイレントモードにし、単に、参照渡しフラグで、ブーリアン値を取れるようにすれば、次に進めます。IEAccess 関数側では、メッセージは吐き出していません。 この場合は、True がエラー値です。URLはループにしてアクセスさせます。値が取れた段階で、ループから解除させます。 '標準モジュール '------------------------------------------ 'Option Explicit Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Sub Test1() Dim flg As Boolean Dim myRate As Double Dim v As Variant Const URL1 As String = "https://trade.gaitame.com/members/" Const URL2 As String = "http://quote.yahoo.co.jp/m3"    For Each v In Array(URL1, URL2)   flg = False   IEAccess v, flg  If flg = False Then   MsgBox v & vbCrLf & "は通じました!", 64   Exit For  Else   MsgBox v & vbCrLf & "通じていません", 48  End If Next v End Sub Private Function IEAccess(ByVal strURL As String, ByRef flg As Boolean)   Dim objIE As Object   Dim i As Long   Set objIE = CreateObject("InternetExplorer.Application")   'objIE.Visible = True   objIE.Navigate strURL   On Error GoTo ErrHandler   With objIE     While .Busy       DoEvents       i = i + 1       Sleep 100       If i > 30 Then       '  MsgBox "アクセスできませんでした。", vbInformation         flg = True         GoTo ErrHandler       End If     Wend     While .ReadyState <> 4       DoEvents       i = i + 1       Sleep 100       If i > 30 Then        '  MsgBox "アクセスできませんでした。", vbInformation         flg = True         GoTo ErrHandler       End If     Wend     If InStr(.LocationName, "為替") = 0 Then       flg = True     Else       '本来は、ここにRateを取得するプログラムを入れる     End If   End With ErrHandler:   If Err.Number > 0 Then     flg = True     Err.Clear   End If   Set objIE = Nothing End Function

saab8743
質問者

お礼

参考になりました。このプロシージャを元に考えて行きたいと思います。ありがとうございました。

その他の回答 (1)

  • hal_n
  • ベストアンサー率43% (7/16)
回答No.1

実際のプログラムの構成がどのようになっているのか分からないので、具体的なアドバイスは出来ませんが、ON ERROR GOTO を使うのが一般的です(と言いますか、VBAの場合これ以外にほぼやりようが無いとも言えます)。 ON ERROR GOTO の使い方や、VBA におけるエラーハンドリングのやり方は、google で "VBA ON ERROR GOTO" で検索すれば、色々と出てきますので参考になさって下さい。 以下は、エラー処理を含んだ処理フローの "一例" です。 Sub 為替レート取得  Dim success As Boolean  success = (アドレス1から為替レート取得)  IF success Then   Exit Sub  End If  success = (アドレス2から為替レート取得)  IF success Then   Exit Sub  End If End Sub Function アドレスXからの為替レート取得 As Boolean  ON ERROR GOTO ACCESS_DENIED  (取得処理)  アドレスXからの為替レート取得 = True  Exit Function ACCESS_DENIED:  アドレスXからの為替レート取得 = False End Function

saab8743
質問者

補足

早速ありがとうございます。 ON ERROR GOTOははそのプロシージャ内のみ有効と聞いていますが、どこのプロシージャでエラーになっているのかわかりません。 外部データの取り込み中(データ範囲プロパティ⇒定期的に更新する1分ごと)にエラーが起きるのはどこに処理文を書けばいいのですか? 普通のプロシージャエラー(構文エラーとか実行時エラー)のような表示ではないエラーメッセ-ジがでます。 一応、プロシージャの中にOn Error Resume Nextは書いてあるのですがこれではだめですかね あまり、VBAに詳しくないので変な質問かもしれません.変な質問でしたらごめんなさい。 よろしくお願いします。

関連するQ&A