- ベストアンサー
Exselで外部データの取り込みのエラーについて
為替レートを24時間Exselの外部データの取り込みを使って取得をしていますが、時々次のようなエラーメッセ-ジが出てプログラムが止まっています。 (http://trade.gaitame/rateを開くことはできません。インターネットサーバーまたはプロシキサーバーが見つかりませんでした。) プログラムを止めずに別のホームページから取得するように設定したいのですが ちなみに3箇所から同時に取得しています。プログラム上で取得先は切り替え可能なのですが、エラー処理がわかりませんよろしくお願いします。
- みんなの回答 (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
その他の回答 (1)
- hal_n
- ベストアンサー率43% (7/16)
実際のプログラムの構成がどのようになっているのか分からないので、具体的なアドバイスは出来ませんが、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
補足
早速ありがとうございます。 ON ERROR GOTOははそのプロシージャ内のみ有効と聞いていますが、どこのプロシージャでエラーになっているのかわかりません。 外部データの取り込み中(データ範囲プロパティ⇒定期的に更新する1分ごと)にエラーが起きるのはどこに処理文を書けばいいのですか? 普通のプロシージャエラー(構文エラーとか実行時エラー)のような表示ではないエラーメッセ-ジがでます。 一応、プロシージャの中にOn Error Resume Nextは書いてあるのですがこれではだめですかね あまり、VBAに詳しくないので変な質問かもしれません.変な質問でしたらごめんなさい。 よろしくお願いします。
お礼
参考になりました。このプロシージャを元に考えて行きたいと思います。ありがとうございました。