早速お世話になります。
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
宜しくお願いします。
済みません、言葉足らずでした。
getchunkをデータが無くなるまでループさせる方法は分かります。
1回でゲット量を大きくする方法が知りたいのです。
宜しくお願いします。
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 の段階で行われていますか?
魔界の仮面弁士さま、有り難うございます。
まず、
他にも手段があるとのことですが、
これも分からず教えて貰ったとおり使っています。
よってこれ以上新たな業はコリゴリという感じです。
済みません。
次ぎに、
使うのは私で他に云々はありません。
>GetChunk の呼び出しは、icResponseCompleted の段階で行われていますか?
ハイ、
12の取込終了のケースです。
宜しくお願いします。
> 流さ指定にある分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 に指定するサイズ指定方法を見直すだけで
問題を解決できるとは思いますが、ループ手法だと都合が悪かったのでしょうか?
魔界の仮面弁士さま、解決です。
あっと言うまでした。
お教えのとおりです。
かつ理由も納得です。
なまじっか理由を付けて(1時間分の文字が150文字で24時間を8日間を1単位)表現していましたが、
基本を知らないから見よう見まねでやっており、
上手くいっていればよいのですが、
いざエラーになると動きが取れない、
という感じでした。
また、
いろいろな解決方法があるのですね。
こちらも驚きです。
とりあえず動けばいいというレベルなので、
現行の解決で大満足です。
なお、ループでも問題ありませんが、1発で行く方が何かとシンプルかと思っていました。
今後は扱う日数分を計算し、ダイレクトに数字を指定するように直したいと思います。
大変お世話になりました。
今後とも宜しくお願いいたします。
どうも有り難うございました。