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

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

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

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

Q&A

解決済

3回答

9293閲覧

VBA google画像検索 画像表示

ttt1212

総合スコア16

VBA

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

0グッド

0クリップ

投稿2015/04/18 13:48

編集2015/04/19 07:37

エクセルのVBAで文字列に対する画像が表示されるマクロを作成したいです。

やりたいこととして例えば、
A列に5つワードが書かれており、
そのワードをひとつずつgoogleで画像検索し、検索結果から画像1つを
A列の文字列の横に表示する。ということです。

ブラウザを開いてワード検索するところまで書いたのですが、それ以降の処理がわかりません。
教えていただきたいです、よろしくお願いいたします。

Private Sub GoogleSearch()

Dim objIE As Object

Set objIE = CreateObject(“InternetExplorer.Application”)
objIE.Visible = True

objIE.navigate “http://www.google.co.jp/”

Sleep (1500)

Call IeWait(objIE)

objIE.document.forms(0).Item(“q”).Value = “チョコレート”

Sleep (1000)

objIE.document.getElementById(“gbqfb”).Click

‘objIE.Quit
‘Set objIE = Nothing

End Sub

ーーーーーーーー
整理のため、今一度コードを現在のコードを記載します。
※htsignさんより回答いただき、下記のように編集いたしました。

lang

1Option Explicit 2 3Private Sub Main() 4 Call GoogleSearch(ActiveCell.Value2) 5End Sub 6 7Private Sub GoogleSearch(ByVal query As String) 8 Dim html As String 9 html = FetchHtml("https://www.google.co.jp/search?tbm=isch&q=" & query) 10 11 Dim nextUrl As String 12 nextUrl = FindFirstUrlFromGoogleImageSearch(html) 13 14 DownloadFileToTempDir nextUrl 15 16 AddPicture 17End Sub 18 19Private Function FetchHtml(ByVal url As String) As String 20 Dim xhr As Object 21 Set xhr = CreateObject("MSXML2.XMLHTTP") 22 23 xhr.Open "GET", url, True 24 xhr.send 25 26 Do Until xhr.readyState = 4 27 DoEvents 28 Loop 29 30 FetchHtml = xhr.responseText 31 32 Set xhr = Nothing 33End Function 34 35Private Sub DownloadFileToTempDir(ByVal url As String) 36 Const adTypeBinary = 1 37 Const adSaveCreateOverWrite = 2 38 39 Dim xhr As Object 40 Set xhr = CreateObject("MSXML2.XMLHTTP") 41 42 xhr.Open "GET", url, True 43 xhr.setRequestHeader "Pragma", "no-cache" 44 xhr.setRequestHeader "Cache-Control", "no-cache" 45 xhr.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" 46 xhr.send 47 48 Do Until xhr.readyState = 4 49 DoEvents 50 Loop 51 52 With CreateObject("ADODB.Stream") 53 .Type = adTypeBinary 54 .Open 55 .Write xhr.responseBody 56 .SaveToFile Environ("TEMP") & "\vbatemp", adSaveCreateOverWrite 57 .Close 58 End With 59End Sub 60 61Private Function FindFirstUrlFromGoogleImageSearch(ByVal html As String) As String 62 Dim partOfHtml As String 63 Dim idx As Long 64 65 idx = InStr(html, "imgurl=") 66 partOfHtml = Mid(html, idx + 7) 67 idx = InStr(partOfHtml, "&") 68 69 FindFirstUrlFromGoogleImageSearch = Left(partOfHtml, idx - 1) 70End Function 71 72Private Sub AddPicture() 73 Dim shape As shape 74 Set shape = ActiveSheet.Shapes.AddPicture( _ 75 Filename:=Environ("TEMP") & "\vbatemp", _ 76 LinkToFile:=False, _ 77 SaveWithDocument:=True, _ 78 Left:=ActiveCell.Left + ActiveCell.Width, _ 79 Top:=ActiveCell.Top, _ 80 Width:=0, _ 81 Height:=0) 82 83 shape.ScaleHeight 1, msoTrue 84 shape.ScaleWidth 1, msoTrue 85 86 Set shape = Nothing 87 88End Sub 89

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

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

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

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

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

guest

回答3

0

ベストアンサー

検索クエリの入ったセルを選択(複数選択可)した状態でMainプロシージャを実行すれば、選択済みのすべてのセルの右隣に、クエリで検索して見つかった1つ目の画像を貼り付けます。

lang

1'Option Explicitは宣言されていない変数を認めないようにするための特殊な宣言です。 2'これがないといきなり新しい変数を作ることができるようになるため、手軽な反面ミスタイプに気づきにくくなります。 3Option Explicit 4 5'ここが起点になります。 6Private Sub Main() 7 Dim cell As Range 8 'Selection とは選択範囲を表す特殊なオブジェクトです。 9 'このオブジェクトはセルを選択していればRangeオブジェクトになるし、 10 '画像を選択していればShapeオブジェクトになるなど、実行時まで型が判別できません。 11 'For Each ~ Nextは範囲を持ったオブジェクト(配列や連想配列など)をすべて舐めるための構文です。 12 'Excel VBAにおいてはRangeオブジェクトにも使えるため、このようにしています。 13 For Each cell In Selection 14 Call GoogleSearch(cell) 15 Next 16End Sub 17 18'Google画像検索して貼り付けるまでの一連の流れを取りまとめるためのプロシージャです。 19Private Sub GoogleSearch(ByRef cell As Range) 20 Dim query As String 21 'セルに含まれる値を取り出し、文字列型にします。数字や時刻であっても文字列になります。 22 query = CStr(cell.Value2) 23 24 Dim html As String 25 '指定のURLにアクセスして、サーバから返ってくるHTMLをテキストで取得します。 26 html = FetchHtml("https://www.google.co.jp/search?tbm=isch&q=" & query) 27 28 Dim nextUrl As String 29 'HTMLテキストを探索して、最初に見つかる画像URLを取り出します。 30 nextUrl = FindFirstUrlFromGoogleImageSearch(html) 31 32 '上で得た画像URLにアクセスし、ファイルをダウンロードして一時フォルダに保存します。 33 DownloadFileToTempDir nextUrl 34 35 '一時フォルダに保存された画像をシートに貼り付けます。 36 AddPicture cell 37End Sub 38 39'変数[url]にアクセスしてHTMLをテキストで返します。 40Private Function FetchHtml(ByVal url As String) As String 41 'JavaScriptではXMLHttpRequestと呼ばれるオブジェクトです。 42 Dim xhr As Object 43 Set xhr = CreateObject("MSXML2.XMLHTTP") 44 45 'GETリクエストを非同期で要求するよう接続をオープンします。 46 xhr.Open "GET", url, True 47 '要求を送信します。 48 xhr.send 49 50 'Do (While|Until) ~ Loopは与えられた条件が成り立っている間、あるいは成り立つまで繰り返します。 51 Do Until xhr.readyState = 4 52 'DoEventsはウィンドウメッセージを処理させる命令です。 53 '待機中、画面が応答なしになるのを防ぐ、くらいに思っておけばいいでしょう。 54 DoEvents 55 Loop 56 57 '応答結果を返り値に設定します。 58 FetchHtml = xhr.responseText 59 60 'オブジェクト解放 61 Set xhr = Nothing 62End Function 63 64Private Sub DownloadFileToTempDir(ByVal url As String) 65 'ref: http://www.ka-net.org/blog/?p=4855 66 67 '定数宣言です。 68 '定数とは、変数と違って一度定義したら変えられない特殊な変数のようなものです。 69 Const adTypeBinary = 1 70 Const adSaveCreateOverWrite = 2 71 72 Dim xhr As Object 73 Set xhr = CreateObject("MSXML2.XMLHTTP") 74 75 xhr.Open "GET", url, True 76 'HTTPヘッダを設定します。詳しくはネットワーク系の基礎を勉強してください。 77 xhr.setRequestHeader "Pragma", "no-cache" 78 xhr.setRequestHeader "Cache-Control", "no-cache" 79 xhr.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" 80 xhr.send 81 82 Do Until xhr.readyState = 4 83 DoEvents 84 Loop 85 86 'ADODB.Streamはデータストリームを汎用的に扱うためのAPI群を提供します。 87 With CreateObject("ADODB.Stream") 88 '保存するものは画像なので、扱うデータはバイナリであることを設定しています。 89 'ファイルをメモ帳で開いて文字化けしていなかったら「テキスト」、それ以外はすべて「バイナリ」くらいの認識でいいです。 90 .Type = adTypeBinary 91 'ストリームをオープンします。 92 .Open 93 'ストリームにデータを書き込みます。中身はバイナリなので人間には読めません。 94 .Write xhr.responseBody 95 'ストリームの中身をファイルに出力します。 96 .SaveToFile Environ("TEMP") & "\vbatemp", adSaveCreateOverWrite 97 'ストリームを閉じます。 98 .Close 99 End With 100 101 'オブジェクト解放 102 Set xhr = Nothing 103End Sub 104 105'HTMLテキストから最初に見つかる画像URLを返します。 106Private Function FindFirstUrlFromGoogleImageSearch(ByVal html As String) As String 107 Dim partOfHtml As String 108 'Long型は32bit長のビットで表せる整数です。VB.NETでのLong(こちらは64bit)とは別物です。 109 Dim idx As Long 110 111 'HTMLソースの何文字目に "imgurl=" という文字列が含まれるのかを idx に格納します。 112 idx = InStr(html, "imgurl=") 113 'idx + 7 番目から後の文字列を抽出します。 114 partOfHtml = Mid(html, idx + 7) 115 '抽出後の文字列の何番目に "&" という文字列が含まれるのかを idx に格納します。 116 idx = InStr(partOfHtml, "&") 117 118 '最初から idx - 1 番目までを抽出して、返り値に設定します。 119 FindFirstUrlFromGoogleImageSearch = Left(partOfHtml, idx - 1) 120End Function 121 122'与えられたRange型(セル)の右隣に、あらかじめ保存された画像を貼り付けます。 123Private Sub AddPicture(ByRef cell As Range) 124 Dim shape As shape 125 'ここの詳しいパラメータの機能は私もよくは知りません。 126 Set shape = ActiveSheet.Shapes.AddPicture( _ 127 Filename:=Environ("TEMP") & "\vbatemp", _ 128 'Excelでの画像貼り付けには複数の方法があり、 129 'ファイルへのリンクとするのかExcelファイル自体に画像を含ませるのかを選択できます。 130 'ここではExcelファイルに埋め込んでいます。 131 LinkToFile:=False, _ 132 SaveWithDocument:=True, _ 133 'シートのA1の左上隅を頂点として、右にどのくらいずらすのかを指定します。 134 Left:=cell.Left + cell.width, _ 135 'シートのA1の左上隅を頂点として、下にどのくらいずらすのかを指定します。 136 Top:=cell.Top, _ 137 '貼り付ける画像の縦幅、横幅を指定します。 138 'ここでは両方とも 0 に指定していますが、下でさらに別の設定をしています。 139 width:=0, _ 140 height:=0) 141 142 '貼り付けられた画像の縦幅横幅を、画像そのものの大きさに一致するようにします。 143 shape.ScaleHeight 1, msoTrue 144 shape.ScaleWidth 1, msoTrue 145 146 'オブジェクト解放 147 Set shape = Nothing 148End Sub

投稿2015/04/19 15:47

編集2015/04/19 16:26
htsign

総合スコア870

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

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

ttt1212

2015/04/19 15:52

本当にありがとうございます!感謝です。 この後、画像のサイズ変更を行いたいので、 どこで何をしているのか簡単に書いていただけると嬉しいです。 本当に本当にありがとうございます>_<
htsign

2015/04/19 16:28

コメントを付けました。これでもかというくらい付けました。 これでも分からないことがあれば、あなたの勉強のためにもご自分で調べてみることをお勧めします。 大体の場合は、例えばWith句の意味を知りたいのであれば、 Googleで [excel vba with] を検索すれば知りたいことは分かるでしょう。
ttt1212

2015/04/20 01:23

お返事遅れてすいません。 無事実装でいました。本当にありがとうございました。 自分ももっとプログラミング力つけるよう、精進していきます。 ありがとうございました。感謝です。
htsign

2015/04/20 03:34

お役に立てて光栄です。 kukiさんのスキル向上を応援しています。
guest

0

※コメント欄が長くなりすぎたため新たに回答させていただきます。

コードを拝見しました。

lang

1Set shape = ActiveSheet.Shapes.AddPicture( _ 2 Filename:=Environ("TEMP") & "\vbatemp" _ 3 LinkToFile:=False, _ 4 SaveWithDocument:=True, _ 5 Left:=ActiveCell.Left + ActiveCell.Width, _ 6 Top:=ActiveCell.Top, _ 7 Width:=0, _ 8 Height:=0)

ここでやはり「,」が抜けていますね。
お分かりになりますでしょうか。2行目は

lang

1 Filename:=Environ("TEMP") & "\vbatemp", _

とならなければならないはずです。
この文を1行で書いてみると分かるかと思います。

lang

1Set shape = ActiveSheet.Shapes.AddPicture(Filename:=Environ("TEMP") & "\vbatemp" LinkToFile:=False, SaveWithDocument:=True, Left:=ActiveCell.Left + ActiveCell.Width, Top:=ActiveCell.Top, Width:=0, Height:=0)

と書くことと等価です。Filenameのところが如何に異質かハッキリするでしょう。
「,」は引数はここからここまでです、とパーサ(プログラムの構文を解析する仕組み)に伝える役割を持ちます。
これを抜くとやれ「引数の数が少ない」だの「引数の型が違います」だの言われることになりますので、慣れないうちは注意して書くことが肝要です。

投稿2015/04/19 07:20

編集2015/04/19 07:27
htsign

総合スコア870

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

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

ttt1212

2015/04/19 07:26

回答ありがとうございます。 カンマ外れていました、、すいません。 Filename:=Environ("TEMP") & "\vbatemp", _と、パラメータにはしっかりカンマつけました。 しかしまだ、同じところ(Private Sub AddPicture())でエラーが起きてしまいます。
htsign

2015/04/19 07:33

私の環境でもそのコードを張り付けて実行してみましたが問題なく最後までは知りました。 推測になりますが、もしかして DownloadFileToTempDir プロシージャ内の保存先が元のままなのではないでしょうか。 Filename:= にくるファイルパスにファイルが存在しないとエラーの原因になります。 DownloadFileToTempDir で保存しているファイルを本当に参照していますか?今一度確認してみてください。
ttt1212

2015/04/19 07:39

DownloadFileToTempDir プロシージャ内の保存先ですが、 Private Sub AddPicture()の部分と同様のファイルを指定してあります。 .SaveToFile Environ("TEMP") & "\vbatemp", adSaveCreateOverWrite これではダメなのでしょうか。。
htsign

2015/04/19 07:47

> ちなみに、Filename:=の部分に存在するフォルダを指定すると、フォルダ内の画像が表示されます。 とおっしゃっていましたね。 つまりAddPictureプロシージャ自体には問題ないと推察できます。 となるとやはり保存時に問題があるとしか…。 AddPictureの段階でFilepath:= に指定されたパスの先にファイルは存在していますか? ブレークポイントを置いて、AddPictureで止めた状態でエクスプローラから確認してみてください。
ttt1212

2015/04/19 08:04

Environ("TEMP") & "\vbatemp", _ こちらのTEMPフォルダのことでしょうか。 Environの指定先の意味がわからないので、合っているかわからないのですが、 tempフォルダ自体はC:\tempと、ローカルディスクCの中のみ存在しております。
ttt1212

2015/04/19 08:07

ファイルの存在ですが、 tempフォルダにファイルは存在しておりません。
htsign

2015/04/19 08:14

通常、Windowsのテンポラリフォルダは全ユーザー共通のものと各ユーザー別々のものと2種類存在し、ほとんどのプログラムはユーザー別の方のテンポラリフォルダを利用します。 パスですが、確認する方法はあります。 https://my.pcloud.com/publink/show?code=XZYrbXZLuI8AL9hDvuyKHknX5H8vbcYtwPX このように、該当箇所をウォッチ式に追加してやればよいです。
ttt1212

2015/04/19 08:29

テンポラリフォルダの場所確認できました。 しかし、フォルダ先には”vbetemp”はありません。
htsign

2015/04/19 08:38

ファイルがないということはやはり保存できていないのでしょうね…。 .SaveToFile 付近でブレイクして問題がないかを確認してみてほしいのですが…何が問題かが分からないとなるとちょっと難しいですね。
ttt1212

2015/04/19 08:50

一度、ダウンロードの部分までに区切って、保存先をC:\フォルダ名にしながら、いろいろ試しています。 先ほど、私の質問文の部分を更新して、 今書いてあるコードを記載したのですが、このコードでhtsignさんの方で実行するとエラーでますでしょうか? すいません、ご確認よろしくお願いいたします。
htsign

2015/04/19 08:55

コード拝見しました。 問題なく実行され、シートに画像が貼り付けられるところまで確認しました。 …となると尚更分からなくなりましたね…。 違いとなるとマクロの定義箇所でしょうか。 私はシート(デフォルト名:Sheet1)に定義しています。 確かkukiさんはモジュールに定義していらっしゃったのでは?そこくらいしか違いが分かりません。
ttt1212

2015/04/19 09:20

そうなのですね・・・ ほかにエクセル上でマクロは知らせる前に設定しなくてはならないものはありますでしょうか>< エクセルシートには今のところ、A列に文字列が入っているだけです。
ttt1212

2015/04/19 10:05

画像表示されました!!! A1の文字列に対してだけですが。 A列に文字列が存在するまで上から繰り返し画像表示させるのは、 全体の構文にループをかければよいのでしょうか?
htsign

2015/04/19 10:35

そうですね。 Dim cell As Range For Each cell In Selection GoogleSearch cell.Value2 Next とすると選択しているセルすべてについて処理します。
htsign

2015/04/19 10:37

失礼しました。 これだとエラーになりますね…。 ActiveCellと書かれている場所で画像を張り付ける場所を指定しています。ここを適宜切り替える必要があります。
ttt1212

2015/04/19 11:34

ご返答ありがとうございます。 ActiveCellの部分を切り替えるについてですが、 AddPictureプロシージャの部分のActiveCellを 一回作業した-1するというfor文をつくればよいのでしょうか。
ttt1212

2015/04/19 12:44

最後のプロシージャに Dim cell As Range For Each cell In Selection GoogleSearch cell.Value2 Next を追加すると、無限に1つ目のセル画像が表示されます。 一つずつ下に移動したいです・・・
htsign

2015/04/19 15:42

返事が遅れました。すみません。 GoogleSearchプロシージャに渡す引数を変えるところから書いた方がいいかもしれません。 新規に回答を立ててコード全文を載せます。
ttt1212

2015/04/19 15:47

本当にありがとうございます!感謝です。 この後、画像のサイズ変更も行いたいので、 どこで何をしているのか簡単に書いていただけると嬉しいです。 本当に本当にありがとうございます>_<
guest

0

前提条件として、ワークブックが既に保存されている必要があります。(ActiveWorkbook.Pathを参照するため)
実装はかなり投げやりです。サーバが401や403を返す場合などは想定していません。
Excel 2013で動作確認しました。

lang

1Option Explicit 2 3Private Sub Main() 4 Call GoogleSearch(ActiveCell.Value2) 5End Sub 6 7Private Sub GoogleSearch(ByVal query As String) 8 Dim html As String 9 html = FetchHtml("https://www.google.co.jp/search?tbm=isch&q=" & query) 10 11 Dim nextUrl As String 12 nextUrl = FindFirstUrlFromGoogleImageSearch(html) 13 14 DownloadFileToTempDir nextUrl 15 16 AddPicture 17End Sub 18 19Private Function FetchHtml(ByVal url As String) As String 20 Dim xhr As Object 21 Set xhr = CreateObject("MSXML2.XMLHTTP") 22 23 xhr.Open "GET", url, True 24 xhr.send 25 26 Do Until xhr.readyState = 4 27 DoEvents 28 Loop 29 30 FetchHtml = xhr.responseText 31 32 Set xhr = Nothing 33End Function 34 35Private Sub DownloadFileToTempDir(ByVal url As String) 36 'ref: http://www.ka-net.org/blog/?p=4855 37 Const adTypeBinary = 1 38 Const adSaveCreateOverWrite = 2 39 40 Dim xhr As Object 41 Set xhr = CreateObject("MSXML2.XMLHTTP") 42 43 xhr.Open "GET", url, True 44 xhr.setRequestHeader "Pragma", "no-cache" 45 xhr.setRequestHeader "Cache-Control", "no-cache" 46 xhr.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" 47 xhr.send 48 49 Do Until xhr.readyState = 4 50 DoEvents 51 Loop 52 53 With CreateObject("ADODB.Stream") 54 .Type = adTypeBinary 55 .Open 56 .Write xhr.responseBody 57 .SaveToFile ActiveWorkbook.Path & "\vbatemp", adSaveCreateOverWrite 58 .Close 59 End With 60End Sub 61 62Private Function FindFirstUrlFromGoogleImageSearch(ByVal html As String) As String 63 Dim partOfHtml As String 64 Dim idx As Long 65 66 idx = InStr(html, "imgurl=") 67 partOfHtml = Mid(html, idx + 7) 68 idx = InStr(partOfHtml, "&amp;") 69 70 FindFirstUrlFromGoogleImageSearch = Left(partOfHtml, idx - 1) 71End Function 72 73Private Sub AddPicture() 74 'ref: http://www.moug.net/tech/exvba/0120020.html 75 Dim shape As shape 76 Set shape = ActiveSheet.Shapes.AddPicture( _ 77 Filename:=ActiveWorkbook.Path & "\vbatemp", _ 78 LinkToFile:=False, _ 79 SaveWithDocument:=True, _ 80 Left:=ActiveCell.Left + ActiveCell.width, _ 81 Top:=ActiveCell.Top, _ 82 width:=0, _ 83 height:=0) 84 85 shape.ScaleHeight 1, msoTrue 86 shape.ScaleWidth 1, msoTrue 87 88 Set shape = Nothing 89End Sub

投稿2015/04/18 18:15

編集2015/04/18 18:24
htsign

総合スコア870

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

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

ttt1212

2015/04/18 23:51

ご回答ありがとうございます。 ワークブックを保存できていないせいか、宣言が間違えているせいか、 構文エラーになってしまいます。 ちなみにワークブックの保存はデスクトップに"aa.bas"という名前で保存しました。 拡張子がおかしいのでしょうか・・・ あとプログラムのほうには、 "\vbatemp"の部分にワークブック名aa.basを入力しました。 申し訳ないですが、対処方法を教えていただけないでしょうか。 よろしくお願いいたします。 Private Sub AddPicture() 'ref: http://www.moug.net/tech/exvba/0120020.html Dim shape As shape Set shape = ActiveSheet.Shapes.AddPicture( _ Filename:=ActiveWorkbook.Path & "aa.bas", LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=ActiveCell.Left + ActiveCell.Width, _ Top:=ActiveCell.Top, _ Width:=0, _ Height:=0)
ttt1212

2015/04/19 00:16

再び、すいません。 画像は取り込めたようなのですが、エクセルに表示される画像が非表示になってしまいます。 画像の非表示を対処するにはどうしたらよいのでしょう。。
ttt1212

2015/04/19 00:31

ちなみに、使っているエクセルのバージョンはExcel2013です。
htsign

2015/04/19 06:06

お返事遅れました。 どのように「取り込めたよう」と判断なされたのでしょうか。 また、画像が非表示というのは左上に「×」が表示されている状況ですか? それですと取り込みに失敗しています。 > Filename:=ActiveWorkbook.Path & "aa.bas", これは構文エラーですね。行末に _ がなければ動きません。 また、"aa.bas"と書かれていますが、 ActiveWorkbook.Path は 「\」を含まないため文字列の方に追加していました。 どうしてもファイル名だけになさりたいのであれば、 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") とした上で、 Filename:=fso.BuildPath(ActiveWorkbook.Path, "aa.bas"), _ などとするとよいかと思います。 恐縮ながら私のスクリプトを例に上げますと、DownloadFileToTempDirプロシージャで一時的に保存したファイルをAddPictureプロシージャでシートに張り付けています。 そのため、上記二つのプロシージャ内のファイル名は完全に一致する必要があります。 このファイルの中身は画像ファイルのバイナリデータとなるため、ファイル名はなんでも構わないはずです。拡張子さえも不要です。「vbatemp」と特に意味もなくつけたのはそういったためです。
htsign

2015/04/19 06:15

連レス失礼します。 DownloadFileToTempDirというプロシージャ名は、当初保存ファイルのパスを Environ("TEMP") & "\vbatemp" としていたためでした。「Environ("TEMP")」でテンポラリフォルダを指します。 デバッグ目的でワークブックと同じフォルダに保存するようにしましたが、プロシージャ名を変えるのを忘れていましたね…。
ttt1212

2015/04/19 06:16

お返事ありがとうございます! 画像はやはり取り込めていなかったようです。 「vbatemp」は特に編集しなくてよかったのですね。 filenameの指定は「vbatemp」に直しました。 記入していただいたスクリプトをそのまま実行すると、 AddPictureプロシージャの部分でアプリケーション定義またはオブジェクト定義のエラーが出てしまいます。 すいません、修正方法を教えていただけないでしょうか。
ttt1212

2015/04/19 06:21

DownloadFileToTempDirというプロシージャ名は、当初保存ファイルのパスを Environ("TEMP") & "\vbatemp" としていたためでした。「Environ("TEMP")」でテンポラリフォルダを指します。 >ということは、 つまりどのようにすればよいのでしょう・・・。 AddPictureプロシージャの Filename:=ActiveWorkbook.Path & "\vbatemp", _ ここの部分をFilename:=Environ("TEMP") とするのでしょうか?
htsign

2015/04/19 06:29

> Filename:=Environ("TEMP") これだけですと、フォルダパスにファイルを書き込もうとしてエラーになります。 何らかのファイル名を指定する必要があります。 例えば Filename:=Environ("TEMP") & "\vbatemp" などです。 失礼ながら、kukiさんはVBAのデバッグをなさったことがあまりないのでしょうか。 Alt+F11で表示される画面で、F8キーを押すとコードのステップ実行ができます。 これで一つずつ順に進めていけばどこがエラーの原因になっているのかを特定できるはずです。 また、コードの左側の空間をクリックすると赤色の「●」がつくと思います。 ブレークポイントと呼ばれるこれは、エラーがなくても処理がそこでストップします。 止まった状態で変数の中身を見たりコードを書き換えたりできますので、マクロを書くのであれば使いこなせると便利です。 「アプリケーション定義またはオブジェクト定義のエラー」は、というかVBAのエラーは一つ一つのエラー文言が非常にあいまいで原因特定の足掛かりとしては弱いのが特徴です。 正直なところ、それだけでは何が原因かというのはこちらから申し上げるのは難しいです。
ttt1212

2015/04/19 06:38

VBAを使うのにあまりなれていないものも申し訳ございません。 ファイル名を Filename:=Environ("TEMP") & "\vbatemp" にして、 書き直しました。 DownloadFileToTempDirプロシージャのFilenameは .SaveToFile ActiveWorkbook.Path & "\vbatemp", adSaveCreateOverWrite AddPictureプロシージャはFilename:=Environ("TEMP") & "\vbatemp" としてあります。 デバックしたところ、Set shapeからエラーが出ています。 Private Sub AddPicture() 'ref: http://www.moug.net/tech/exvba/0120020.html Dim shape As shape Set shape = ActiveSheet.Shapes.AddPicture( _ Filename:=Environ("TEMP") & "\vbatemp" _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=ActiveCell.Left + ActiveCell.Width, _ Top:=ActiveCell.Top, _ Width:=0, _ Height:=0)
ttt1212

2015/04/19 06:40

Private Sub AddPicture() 'ref: http://www.moug.net/tech/exvba/0120020.html Dim shape As shape Set shape = ActiveSheet.Shapes.AddPicture( _ Filename:=Environ("TEMP") & "\vbatemp" _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=ActiveCell.Left + ActiveCell.Width, _ Top:=ActiveCell.Top, _ Width:=0, _ Height:=0) ※Heightの部分で黄色い矢印がでております。
htsign

2015/04/19 06:44

パラメータは「,」で区切ってください。 「_」はあくまで「次の行にも同じ命令が続きますよ」という目印みたいなものなので、処理内容には影響してきません。 あと、これはマナーの問題ですが、別質問トピックを立てたのであればそちらに誘導するなりしてください。
ttt1212

2015/04/19 06:54

マナーの件、申し訳ございません。 なかなか解決できなかったため、再び質問してしまいました。 後に立てたトピックは削除いたします。今後気をつけます。 パラメータを「,」で区切りました。 しかし、まだエラーが消えません。 LinkToFile:=False, _の部分に色がつきます。  こちらの指定がエラーを起こしているのでしょうか。
htsign

2015/04/19 06:58

あぁ、いえ。削除しろと申しているのではありません。 あなたに悪意がないことも分かっているつもりですので、今後気を付けていただければそれで十分ですよ。 一度動く状態まで持って行っていただいて、少しずつコードを書き換えるのは難しいですか? 私のコードは一応画像が取得できてセルの右隣に表示できるところまで確認しています。 一度動くことを確認して、その後保存場所を変えたり、そういったことはできませんか?
ttt1212

2015/04/19 07:09

動く状態までもっていきたいのですが、Private Sub AddPicture()のエラーが出てしまい、先に進みません・・・ ちなみに、Filename:=の部分に存在するフォルダを指定すると、フォルダ内の画像が表示されます。
ttt1212

2015/04/19 07:10

見づらいですが、今一度、コードを記入いたします。 Private Sub DownloadFileToTempDir(ByVal url As String) 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 & "\vbatemp", 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, "&amp;") FindFirstUrlFromGoogleImageSearch = Left(partOfHtml, idx - 1) End Function Private Sub AddPicture() Dim shape As shape Set shape = ActiveSheet.Shapes.AddPicture( _ Filename:=Environ("TEMP") & "\vbatemp" _ 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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問