2022年2月23日水曜日

比較的、頻繁に使うWindows API絡みのVBAコードで、トラブルが起きて焦ってしまったのでござる - URLDownloadToFile(VBA)

こんな分厚い本が教則本
      
VBAでファイルをダウンロードをするには、Windows APIの関数を使います。
”URLDownloadToFile”なんだけれど、OSも32、64ビットで違いがあるのです。

Decrareステートメントのコードで、PtrSafeのキーワードを書くか書かないか。
64ビット版のOfficeで実行できるようにするには、この呪文を挿入するんだな。

だけど、オフィスが32または64ビットでも使えるようにするには、IF文もある。
それが、条件分岐でコンパイルするもので、実際に記述するとこうなりました。

#If Win64 Then
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#Else
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If

記述には#が使用されていますが、これはC言語でコンパイル処理前の記述だ。
マクロ定義に使用されるし、元来はウインドウズはC言語で開発されています。

なので、VBAでもOSの関数を呼び出すために、C言語のコードも使えるのです。
それに、API関数でも、宣言でByValという変数の値渡しが行われているようだ。
 
これは、OSで生成した変数が、関数実行のために変数を渡すということだろう。なので、ファイルのダウンロードには関係のない変数渡しなんだと思いました。

一方、この点を解説する記事がネットには見当たらなく、使い方の記事ばかり。
なので、一応は自分の考えとして、投稿に残しておこうと思った次第なのです。

まあ、自分のブログをHTML記述でダウンロードしてみたくてコードを書いた。
宣言以降は、実行コードも非常にシンプルで次のようなコードを書くだけです・

Sub FileSave()
Const strURL = "https://blog.coo.ne.jp/~(以下略)"
Dim strFNAME As String
Dim returnValue
strFNAME = ThisWorkbook.Path & "\test.csv"
returnValue = URLDownloadToFile(0, strURL, strFNAME, 0, 0)
strURL = Empty
strFNAME = Empty
returnValue = Empty
End Sub

ポイントは、returnvalueで実行コード一行をコールしているだけというもの。
実は、ダウンロードしたデータに閲覧したいURLのアドレスが入っていました。

それで、このURLをコピーしてブラウザに貼って表示させようとしたら失敗だ。
”Whitelabel Error Page"と表示されて、URLにたどり着けずに悩みましたな。

       
まあURLをじっくり眺めたら、本来の”&”の文字に変な表記が追加されていた。
それが”&”で、アンパサンドと言うますが、文字表記に置換されているの。

どうしてそうなるのか分かりませんが、元も戻せばちゃんとブラウザに表示だ。
だから、このURLを抽出した後に、”&”を”&”に置き換えておけばOKだ。

つまり、VBAのReplace("URL", ”&”, "&")で実行すれば元に戻りました。
というわけで、Windows APIは、奥が深いと言えばそうでして問題解決だな。

ただ、Windows11になると、このAPIがどのように変更されていくのか分からなくて、この”URLDownloadToFile”も使い続けられるのかどうか、もし確認できた人がいるのなら、教えてもいらいたとも思うのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿