inet1でオーバーフローします。

解決


宮下  2012-04-05 15:40:43  No: 143270  IP: [192.*.*.*]

早速お世話になります。
excelvbaでinetを教えて貰い、あるサイトのtxtデータを読み込んでいます。
流さ指定にある分D/L出来ず、「オーバーフロー」というエラーになります。
(28800バイトくらいにすると処理(D/L)できます。)

解決策を教えてください。

    DownloadFile "http://xxxxxxxx.dat"
    With Worksheets("myst").Inet1
        .AccessType = icUseDefault
        .URL = DownloadFile
        .Execute , "GET"
    End With



            With Inet1
                bDone = False
                filesize = .GetHeader("Content-length")
                contenttype = .GetHeader("Content-type")
                Kill SaveFileName
                io = FreeFile
                Open SaveFileName For Binary Access Write As #io
                    vtData = .GetChunk(150 * 50 * 8, icByteArray)
                    DoEvents
                    If Len(vtData) = 0 Then
                        bDone = True
                    End If
                    tempArray = vtData
                    Put #1, , tempArray
                Close #1

宜しくお願いします。

編集 削除
宮下  2012-04-05 16:29:25  No: 143271  IP: [192.*.*.*]

済みません、言葉足らずでした。
getchunkをデータが無くなるまでループさせる方法は分かります。
1回でゲット量を大きくする方法が知りたいのです。

宜しくお願いします。

編集 削除
魔界の仮面弁士  2012-04-06 15:18:47  No: 143272  IP: [192.*.*.*]

HTTP GET によるファイルのダウンロードだけが目的なら、Inet ではなく、
WinHttp か、あるいは XMLHTTP を利用することが良いと思いますよ。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html

あるいは、BASP21 の W3get メソッドとか。


> excelvbaでinetを教えて貰い、あるサイトのtxtデータを読み込んでいます。

そのブックは、御自身のみが使う物ですか? それとも他者にも使わせる予定ですか?
他の PC でも実行させる予定なら、Inet は利用しない方が良さそうです。

その VBA を実行させる PC に開発環境が入っていない場合、
Excel 本体 + MSInet.ocx だけでは動作させることができません。

これは、Excel のシートに Inet コントロールを貼って使う場合は、
Inet コントロールのランタイム(実行時)ライセンスだけではなく、
デザインタイム(開発時)ライセンスも要求されるためです。
(ただし、ユーザーフォームに貼って使う場合は、状況が少し異なります)

Inet の開発時ライセンスは、VB.NET 2003 や VB6、あるいは
Office 2000 Developer Edition 等に含まれていますが、
ランタイムとは異なり、デザインタイムは再頒布できません。


> 解決策を教えてください。
GetChunk の呼び出しは、icResponseCompleted の段階で行われていますか?

編集 削除
宮下  2012-04-06 16:07:40  No: 143273  IP: [192.*.*.*]

魔界の仮面弁士さま、有り難うございます。

まず、
他にも手段があるとのことですが、
これも分からず教えて貰ったとおり使っています。
よってこれ以上新たな業はコリゴリという感じです。
済みません。

次ぎに、
使うのは私で他に云々はありません。

>GetChunk の呼び出しは、icResponseCompleted の段階で行われていますか?
ハイ、
12の取込終了のケースです。

宜しくお願いします。

編集 削除
魔界の仮面弁士  2012-04-06 17:30:53  No: 143274  IP: [192.*.*.*]

> 流さ指定にある分D/L出来ず、「オーバーフロー」というエラーになります。
それ自体は、Inet とは無関係のエラーでは無いでしょうか。

Dim a As Long, b As Long
a = 6000
b = 150 * 50 * 8

の場合、a は問題ありませんが、b は実行時エラーとなることに注意してください。

これは、150 や 50 や 8 などは Integer 値なので、演算結果も Integer となるためです。
たとえ変数 a が Long であっても、計算段階で Integer の最大値(32767)を
越えてしまうため、その時点でオーバーフローとなってしまいます。

MsgBox TypeName(150)     'これは「Integer」
MsgBox TypeName(60000)   'これは「Long」
MsgBox TypeName(150&)    'これは「Long」



> 他にも手段があるとのことですが、
XMLHTTP であれば、大抵の OS 環境に既に含まれているはずなので、
MSInet.ocx よりも導入しやすいであろうと思って提示したのですが、
自身でしか使わないアプリなら、環境の問題は考慮する必要は無さそうですね。

ただ、Inet には不具合も多く報告されています。そのため、
選択肢の少なかった10年前ならいざ知らず、今となっては、
個人的にはあまりお奨めしていなかったりします


> これも分からず教えて貰ったとおり使っています。
開発ライセンスをお持ちなのであれば、Inet を使う事は可能です。
先に述べた不具合の件についても、実際に問題なく使えているならば、
Inet を使い続けても構わないと思いますよ。


> 取込終了のケースです。
イベントによる非同期処理ではなく、OpenURL メソッドによる
同期処理を使う手法もあったります。
(OpenURL の場合、サーバーによっては正しく取得できないことがあります)


Dim URL As String, bin() As Byte
URL = "http://www.tepco.co.jp/forecast/html/images/juyo-2012.csv"
bin = Inet1.OpenURL(URL, icByteArray)

Dim fno As Integer
fno = FreeFile()
Open "juyo-2012.csv" For Binary As #fno
Put #fno, , bin
Close #fno

Debug.Print StrConv(bin, vbUnicode)


まぁ、「これ以上新たな業はコリゴリ」とのことでしたから、
あまり他の案を提示しない方が良いのかも知れませんが…。



> getchunkをデータが無くなるまでループさせる方法は分かります。
今回の場合、GetChunk に指定するサイズ指定方法を見直すだけで
問題を解決できるとは思いますが、ループ手法だと都合が悪かったのでしょうか?

編集 削除
宮下  2012-04-06 20:55:16  No: 143275  IP: [192.*.*.*]

魔界の仮面弁士さま、解決です。
あっと言うまでした。
お教えのとおりです。
かつ理由も納得です。
なまじっか理由を付けて(1時間分の文字が150文字で24時間を8日間を1単位)表現していましたが、
基本を知らないから見よう見まねでやっており、
上手くいっていればよいのですが、
いざエラーになると動きが取れない、
という感じでした。

また、
いろいろな解決方法があるのですね。
こちらも驚きです。

とりあえず動けばいいというレベルなので、
現行の解決で大満足です。

なお、ループでも問題ありませんが、1発で行く方が何かとシンプルかと思っていました。
今後は扱う日数分を計算し、ダイレクトに数字を指定するように直したいと思います。

大変お世話になりました。
今後とも宜しくお願いいたします。
どうも有り難うございました。

編集 削除