質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4964閲覧

VBAでdata URIのimg要素をダウンロードしたい。

Zoohomi

総合スコア26

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/07/16 07:16

https://app.codegrid.net/entry/datauri-basic#toc-0
上記のサイトの画像のように、img要素のsrcが「http://~~~」ではなく、「data:~~~」の場合の画像を、VBAから保存するにはどうすれば良いでしょうか?
IEを起動せずに行いたいです。
URLDownloadToFileの取得先URLに対して、img要素のsrcの内容を指定しても、ダウンロードできませんでした。

以下は実行ソースのサンプルです。

vba

1Declare Function URLDownloadToFile Lib "urlmon" Alias _ 2 "URLDownloadToFileA" (ByVal pCaller As Long, _ 3 ByVal szURL As String, _ 4 ByVal szFileName As String, _ 5 ByVal dwReserved As Long, _ 6 ByVal lpfnCB As Long) As Long 7 8Declare Function DeleteUrlCacheEntry Lib "wininet" _ 9 Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long 10Public Sub subA() 11 '-------------------------- 12 ' 画像のdata URI取得 13 '-------------------------- 14 Dim objXML As New MSHTML.HTMLDocument 15 Dim htmlDoc As New MSHTML.HTMLDocument 16 Dim objITEM As Object 17 18 ' srcが「data:~~」形式のimg要素が一つのみ存在するページとします 19 Set htmlDoc = objXML.createDocumentFromUrl("http://example.com/hogehoge.html", vbNullString) 20 Call untilReady(htmlDoc) 21 22 Dim strDataURL As String 23 strDataURL = htmlDoc.getElementsByTagName("img")(0).src 24 25 '-------------------------- 26 ' ダウンロード処理 27 '-------------------------- 28 Dim fileName As String 29 Dim savePath As String 30 Dim cacheDel As Long, result As Long 31 32 '画像ファイル名 33 fileName = "test.jpeg" 34 35 '画像保存先(+画像ファイル名) 36 savePath = "C:\Users\user\Desktop\" & fileName 37 38 ' キャッシュクリア 39 cacheDel = DeleteUrlCacheEntry(strDataURL) 40 41 '画像ダウンロード 42 result = URLDownloadToFile(0, strDataURL, savePath, 0, 0) 43 44 If result = 0 Then 45 MsgBox "ダウンロードできました" 46 Else 47 MsgBox "ダウンロードできませんでした" '※※result = -2147024774 でここに来ます※※ 48 End If 49 50 Set objITEM = Nothing 51 Set htmlDoc = Nothing 52 Set objXML = Nothing 53 54End Sub 55 56Sub untilReady(htmlDoc As MSHTML.HTMLDocument) 57 Do Until htmlDoc.readyState = "complete" 58 DoEvents 59 Loop 60 DoEvents 61End Sub

IEを起動しない方法であれば、どのような形でも良いです。
なにか方法はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

data URI というのは初めて知りましたが、調べてみると、画像ファイルをBase64でテキストに変換して、HTML内に埋め込むというものですね。

img要素のsrcはURLではなくテキスト変換された画像データなので、URLDownloadToFile でダウンロードしても意味ないですよね。

ということで下記のような手順になるでしょう。

提示のコードで取得したimg要素のsrcのdata:image/gif;base64,以降を切り出して、Base64デコードして、ファイルに保存する。デコードは下記のリンク先の方法でできます。

ファイルをBase64エンコード・デコードするVBAマクロ | 初心者備忘録

リンク先の DecodeBase64関数をコピーしてモジュールに貼り付けて、提示コードの
' ダウンロード処理
を下記のように変更したら画像ファイルとして保存できました。

'-------------------------- ' base64デコード '-------------------------- Dim fileName As String Dim savePath As String Dim cacheDel As Long, result As Long '画像ファイル名 fileName = "test.gif" ' "test.jpeg" '画像保存先(+画像ファイル名) savePath = "C:\test\" & fileName '"C:\Users\user\Desktop\" & fileName '画像変換 result = DecodeBase64(Mid(strDataURL, InStr(strDataURL, "base64,") + 7), savePath) If result Then MsgBox "画像変換できました" Else MsgBox "画像変換できませんでした" End If

投稿2017/07/17 06:41

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zoohomi

2017/07/17 06:58

無事保存できました! ありがとうございました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問