VBAでウェブ画像検索し、その画像をエクセルに貼り付けるという操作を作成しております。
(操作手順)※標準モジュールで作成
1.googleでA列にあるワードを画像検索
2.各列の画像1つをフォルダに保存
3.ファルダ内の画像を参照して、A列のワードの右に画像を表示
以下のようにプログラムしているのですが、エクセルでの画像表示が、
「このイメージは現在表示できません」となってしまいます。
原因としては、一時ディレクトリ(フォルダ)に保存されないことかと思います。
対処法を教えていただけないでしょうか。
よろしくお願いいたします。
Option Explicit-
Private Sub Main()
Call GoogleSearch(ActiveCell.Value2)
End Sub
Private Sub GoogleSearch(ByVal query As String)
Dim html As String
html = FetchHtml("https://www.google.co.jp/search?tbm=isch&q=" & query)
Dim nextUrl As String nextUrl = FindFirstUrlFromGoogleImageSearch(html) DownloadFileToTempDir nextUrl AddPicture
End Sub
Private Function FetchHtml(ByVal url As String) As String
Dim xhr As Object
Set xhr = CreateObject("MSXML2.XMLHTTP")
xhr.Open "GET", url, True xhr.send Do Until xhr.readyState = 4 DoEvents Loop FetchHtml = xhr.responseText Set xhr = Nothing
End Function
Private Sub DownloadFileToTempDir(ByVal url As String)
'ref: http://www.ka-net.org/blog/?p=4855
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim xhr As Object Set xhr = CreateObject("MSXML2.XMLHTTP") xhr.Open "GET", url, True xhr.setRequestHeader "Pragma", "no-cache" xhr.setRequestHeader "Cache-Control", "no-cache" xhr.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" xhr.send Do Until xhr.readyState = 4 DoEvents Loop With CreateObject("ADODB.Stream") .Type = adTypeBinary .Open .Write xhr.responseBody .SaveToFile ActiveWorkbook.Path & "\picture\p1.png"※保存したいファルダとファイル名を指定, adSaveCreateOverWrite .Close End With
End Sub
Private Function FindFirstUrlFromGoogleImageSearch(ByVal html As String) As String
Dim partOfHtml As String
Dim idx As Long
idx = InStr(html, "imgurl=") partOfHtml = Mid(html, idx + 7) idx = InStr(partOfHtml, "&") FindFirstUrlFromGoogleImageSearch = Left(partOfHtml, idx - 1)
End Function
Private Sub AddPicture()
'ref: http://www.moug.net/tech/exvba/0120020.html
Dim shape As shape
Set shape = ActiveSheet.Shapes.AddPicture( _
Filename:=ActiveWorkbook.Path & "\picture\p1.png※表示したい画像ファイルを指定", _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=ActiveCell.Left + ActiveCell.Width, _
Top:=ActiveCell.Top, _
Width:=0, _
Height:=0)
shape.ScaleHeight 1, msoTrue shape.ScaleWidth 1, msoTrue Set shape = Nothing
End Sub
すいません、緊急でよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー