アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルのマクロを使用して
グーグル検索を出来るようにしたいです。

処理としまして、プログラムを起動すると
ユーザーフォームが起動して、テキストボックスがあり
テキストボックス内に検索したいキーワードを入力して
ボタンをクリックしたら
IEが起動して自動で検索結果が表示されるようにしたいのですが

テキストボックスに入力したキーワードを
どうしても反映させることが出来ない状態です。

出来れば、検索結果の一番下のほうに
「他のキーワード」と言うのがありまして
ダイエットで検索すると
「他のキーワード」が

ダイエット日記
ダイエット方法
食べ合わせダイエット
骨盤ダイエット
ダイエット レシピ
ダイエット 運動
どうぶつダイエット
ダイエット ブログ
バナナ ダイエット
炭水化物ダイエット

といったキーワードが出てくるのを
メモ帳に自動で書き出すようにも出来ればありがたいです。

わかりにくい説明かもしれませんが
よろしくお願いいたします。

A 回答 (6件)

 TextBox1 にキーワードを入力し CommandButton1 をクリックしたら、デスクトップの "Google 他のキーワード.txt" に「他のキーワード」が追記されていきます。



'-------------------------------------------------------------------
Private Sub CommandButton1_Click()
 Dim MyKeyWord As String
 Dim objIE As Object
 Dim i As Integer
 Dim MyDir As String
 Dim MyTxt As String
 Dim j As Integer
 Dim HisKeyWord As String
 MyKeyWord = TextBox1.Text
 
'Internet Explorer の起動
 Set objIE = CreateObject("InternetExplorer.Application")
 With objIE
  
'キーワードの入力
  .navigate "ht" & "tp://w" & "ww.google.com/"
  While .Busy Or .ReadyState <> 4: DoEvents: Wend
  .document.forms.Item(0)(1).Value = MyKeyWord
  .document.forms.Item(0)(2).Click
  While .Busy Or .ReadyState <> 4: DoEvents: Wend
  For i = 0 To .document.all.Length - 1
   If .document.all.Item(i).className = "e" Then Exit For
  Next

'メモ帳の保存先フォルダとファイル名の指定
  MyDir = Environ("USERPROFILE") & "\デスクトップ\"
  MyTxt = "Google 他のキーワード.txt"
  
'メモ帳に自動で書き出す
  Open MyDir & MyTxt For Append As #1
  Print #1, "【キーワード】" & MyKeyWord
  If i = .document.all.Length Then
   Print #1, "「他のキーワード」はございません。"
  Else
   For j = 1 To 10
    HisKeyWord = .document.all.Item(i + j * 2 + 5).outerText
    If HisKeyWord = "12345678910次へ" Then Exit For
    Print #1, HisKeyWord
   Next
  End If
  Print #1, Chr(10)
  Close #1
  
'Internet Explorer の終了と テキストボックス の初期化
  .Quit
 End With
 Set objIE = Nothing
 TextBox1.Text = ""
 TextBox1.SetFocus
End Sub
「vbaを使ってグーグル検索をしたい」の回答画像1

この回答への補足

DOUGLAS_さんありがとうございます。

早速なんですが・・・
コードを貼り付けて実行しますと
「MyKeyWord = TextBox1.Text」の部分が黄色くなり
オブジェクトが必要ですと出てしまいます。

いろいろ調べてみたのですが
解決できないで居ます。

補足日時:2009/06/18 10:15
    • good
    • 0

>「MyKeyWord = TextBox1.Text」の部分が黄色くなり


>オブジェクトが必要ですと出てしまいます。

【考えられる原因1:「TextBox1」という テキストボックス が存在しない】

 ご質問文内に
>ユーザーフォームが起動して、テキストボックスがあり
>テキストボックス内に検索したいキーワードを入力して
>ボタンをクリックしたら
とお書きですが、前回答のコードは「テキストボックス」の オブジェクト名 が「TextBox1」、「ボタン」の オブジェクト名 が「CommandButton1」の場合のお話しです。

 もし、ユーザーフォーム 上での当該の「テキストボックス」の オブジェクト名 が「TextBox2」とか「TextBox3」になっているのでしたら、前回答のコードの中の「TextBox1」を、すべて本当の オブジェクト名 に置換してください。


【考えられる原因2:コードの貼り付け先が違う】
 上記が原因でない場合は、先ず、確認ですが、前回答のコードをどこにコピペされましたでしょうか?

 [挿入(I)] - [標準モジュール(M)] で開く コードウィンドウ、つまり、[プロジェクト エクスプローラ] - [標準モジュール] - [Module*] を ダブルクリック して表示される コードウィンドウ でしたら、これは × です。

 [プロジェクト エクスプローラ] - [標準モジュール] - [フォーム] - [UserForm*] を ダブルクリック して開いた [UserForm*] のフォーム、あるいは、その上に配置された コントロール を [右クリック] - [コードの表示(O)] して表示される コードウィンドウ でしたら、これは ○ です。
「vbaを使ってグーグル検索をしたい」の回答画像2

この回答への補足

たびたびありがとうございます。

コードの貼り付け場所を言われたとおりに
したところ「MyKeyWord = TextBox1.Text」では
問題ないのですが・・・

今度は、下記のコードで
書き込みできませんと言うエラー発生してしまいます。
If .document.all.Item(i).className = "e" Then

補足日時:2009/06/18 20:11
    • good
    • 0

>書き込みできませんと言うエラー発生してしまいます。


>If .document.all.Item(i).className = "e" Then
 ん~。。。 おかしいですねぇ~。。。
 私の環境でしたら、全く問題なくできるんですけど。。。

 ちなみに、私の操作環境は、
・OS は Windows XP SP3
・Excel 2003 での VBA
・Windows Internet Explorer 8 が インストール されている
という条件です。

・ひょっとして、お使いの OS が「Mac」みたいなコトでしたら、私はお手上げです。
・Windows の場合でも、「Vista」でしたら
MyDir = Environ("USERPROFILE") & "\デスクトップ\"
の行を、
MyDir = "D:\"
などの、割と自由にアクセスできそうなフォルダに変更してお試しください。

 ということで、「OS」・「Excel」・「IE」の バージョン ぐらいはお示しいただいた方が解決が早いかと存じます。
「vbaを使ってグーグル検索をしたい」の回答画像3

この回答への補足

自分の環境ですが
DOUGLAS_さんとほとんど変わらないです。

唯一違うのが
IE7を使用しているところです。

補足日時:2009/06/18 21:37
    • good
    • 0

>唯一違うのがIE7を使用しているところです。


 今、IE7 の マシン で試行してみましたが、やはり、問題なく終了しました。

 では、振り出しに戻って、一から始めてみましょう。

1)エクセルで新規ブックを開きます。
2)[Alt] + [F11] で VBE を開き、[挿入(I)] - [ユーザー フォーム(U)] します。
3)[ツールボックス] - [コントロール] - [テキスト ボックス] をクリックし、[UserForm1] の フォーム 上に [TextBox1] を配置します。
4)[ツールボックス] - [コントロール] - [コマンド ボタン] をクリックし、[UserForm1] の フォーム 上に [CommandButton1] を配置します。
5)[回答番号:No.1] の 「Private Sub CommandButton1_Click()」~「End Sub」をマウスでドラッグして選択し、コピー([Ctrl] + [C])します。
6)[CommandButton1] を [右クリック] - [コードの表示(O)] し、現われた コードウィンドウ で、すべて選択([Ctrl] + [A])し、貼り付け([Ctrl] + [V])ます。
7)[F5] キーを押下してマクロを実行します。
8)現われた ユーザーフォーム の テキストボックス に「ダイエット」と入力し コマンドボタン をクリックします。
9)テキストボックス に入力された「ダイエット」の文字が消え、フォーカス が テキストボックス に移ったら成功です。
10)デスクトップ 上に作成された「Google 他のキーワード.txt」を開いてみて、
-------------------------------------------------------------------
【キーワード】ダイエット
ダイエット日記
・・・・・・・・・・
炭水化物ダイエット


-------------------------------------------------------------------
という記述があれば大成功です。


 もし、上記の通りにマクロが進行せず、途中でエラーが出た場合は、現われた VBE の画面で黄色になっている
If .document.all.Item(i).className = "e" Then
の行の「i」にマウスを当て、「i=57」のような数字が表示されると存じますので、その数字をお知らせください。
「vbaを使ってグーグル検索をしたい」の回答画像4
    • good
    • 0
この回答へのお礼

何度もお付き合いいただきありがとうございます。

上記記載の通りに行いましたら
ちゃんと実行することが出来ました。

はじめの投稿で
回答してくれる人が居るのかと
心配していましたが
DOUGLAS_さんのように出会えてよかったです。

本当にありがとうございます。

お礼日時:2009/06/18 23:14

>上記記載の通りに行いましたら


>ちゃんと実行することが出来ました。
ということは、元々お使いのブックでは、[回答番号:No.1] の マクロ が動かない、何か原因があるのだと存じますが、よくお分かりにならないようでしたら、[回答番号:No.4] で新規に作成されたブックを元々のブックのように作り直されればよいかと存じます。

---------------------------------------------------------------

【今後のために】
 なお、ご参考までに、
● Excel VBA で インターネットブラウザ を操作する方法
● [回答番号:No.1] の マクロ がなぜあのような記述になっているか「不思議だなぁ」と思われるかも知れない部分
について解説をしておきます。

---------------------------------------------------------------
≫≫≫≫ [WebBrowser コントロール] について
---------------------------------------------------------------
1)Excel VBA で インターネットブラウザ を操作するときは、もっぱら「CreateObject("InternetExplorer.Application")」として [WebBrowser コントロール] を使います。
 ただし、詳細を解説した Web ページ が余りありませんので、まだまだ独自に開墾しなければならない分野のようです(未開拓分野)。
2)普通は オブジェクト名 を「IE」・「objIE」・「MyIE」などに設定し、
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
・・ 一連の操作 ・・
objIE.Quit
Set objIE = Nothing
のようにして使います。
 今回は、ブラウザ を表示する必要がありませんので、「objIE.Visible = True」は割愛しました。
3)Excel VBA で [WebBrowser コントロール] を使う場合、!!! 本当はもっと簡便で合理的な方法がある !!! と思うのですが、「未開拓分野」ですので、私自身、まどろっこしい コーディング をしています。
4)「探り方」としましては、逐一 ウォッチ式 を追加して プロパティ の内容を確認していくのが、結局のところ近道で、先ずは、「objIE」を ウォッチ式 に追加して配下の プロパティ を見ていきます([回答番号:No.1] の添付画像)。
5)「objIE」自体は「Internet Explorer」ですから、直下の プロパティ は IE 自体に関しての内容になりましょうから、ご質問の操作の場合には関係ありません。
 したがって、「objIE」配下で ウォッチウィンドウ で「+」記号の付いた プロパティ を見ていくと、[Application]・[Document]・[Parent] の3つがあることが分かります。
 [Application プロパティ] は IE 自体に関連する内容、更に、[Parent プロパティ] はその「親プロパティ」ですから、今回のような場合は関係ありません。
 ということで、目的の プロパティ は [document プロパティ] になりますから、ウォッチ式は [objIE.document] で十分です([回答番号:No.2] の添付画像)。
6)次に [objIE.document プロパティ] 配下を見ていきます。
 [objIE.document] は「Web ページのコンテンツ」ですから、それ自体では括りが大き過ぎますので、これも [objIE.document] 配下で ウォッチウィンドウ で「+」記号の付いた プロパティ を見ていき、ケースバイケース で [all]・[anchors]・[forms] などの プロパティ を利用します。
7)今回は、操作の目的上 [all プロパティ] を開きましたので、ウォッチ式は [objIE.document.all] に変更します([回答番号:No.3] の添付画像)。
8)[objIE.document.all プロパティ] には、[constructor]・[ie8_length]・[length]・[Item~~] の4種類の プロパティ しか付いておりませんが、[constructor] には内容がありません。
 [length プロパティ] は [Item] の数ですが、「length : 435」となっているのに、ウォッチウィンドウ では、[回答番号:No.3] の添付画像のように [Item 256] までしか表示されませんから、(16)のように、内容を セル に書き出さないと確認できません。もしくは、「objIE.document.all.Item(434)」のような ウォッチ式 を追加して ピンポイント で確認することになります。
※※本来なら、「objIE.document.all.Item(outerText:="他のキーワード")」というような「名前付き引数」で ピンポイント に ターゲット を絞り込めそうな気もするのですが、私には、その辺りの文法が分かりません。
9)ちなみに、[Item プロパティ] の インデックス は、ウォッチウィンドウ では「Item 1」~「Item 256」となっていますが、コーディング上は数字を1減らして「Item(0)」~「Item(255)」と書きます。
 従って、すべての [Item プロパティ] を書き出すには、
For i = 0 To objIE.document.all.Length - 1
 Cells(i + 1, 1) = Replace(objIE.document.all.Item(i).~~, "<", "<")
Next
とします。

---------------------------------------------------------------
【参考URL】
●WebBrowser コントロールの概要
http://msdn.microsoft.com/ja-jp/library/w290k23d …
●三流君VBAでIE操作 InternetExplorer.Applicationを操作する
http://www.ken3.org/cgi-bin/group/vba_ie.asp

---------------------------------------------------------------
≫≫≫≫「className = "e"」の不思議について
---------------------------------------------------------------
10)Google で「ダイエット」を検索します。
11)Internet Explorer で [表示(V)] - [ソース(C)] し、HTML ソース の中から「他のキーワード」を検索すると、2ヶ所見つかります。
 前者は、ページ内 の検索結果の前に表示されている「他のキーワード」、後者は検索結果の後に表示されているものです。
 HTML ソース の前後を見てみると、それが判ります。
12)ここからは「偶然の産物」ですが。。。
 後者の HTML ソース の前後を見てみると
~~~<div class=e>~~~他のキーワード~~~
という記述がありました。
13)(11)の HTML ソース の中から「class=e」を検索してみると他にありません。
 「ラッキ~ッ!」ということで、
For i = 0 To .document.all.Length - 1
 If .document.all.Item(i).className = "e" Then Exit For
Next
として「他のキーワード」の行を突き止めました。
14)ちなみに、「objIE.document.all.Item(i)」という ウォッチ式 を追加して、「Exit For」のときの値を見てみると、[回答番号:No.4] の添付画像のように、「className」という プロパティ の値が「"e"」になっています。
15)以上で「className = "e"」の不思議は解けたかと存じます。

---------------------------------------------------------------
≫≫≫≫「Item(i + j * 2 + 5)」の不思議について
---------------------------------------------------------------
16)実は、(12)以前に、テストの段階では、「For i = 0 To .document.all.Length - 1」の行から「'Internet Explorer の終了と テキストボックス の初期化」の前までを
For i = 0 To .document.all.Length - 1
 Cells(i + 1, 1) = Replace(.document.all.Item(i).outerHTML, "<", "<")
Next
などとして、Excel の セル に [outerHTML プロパティ] の値を拾い出したりして、「他のキーワード」前後の値を何とか効率的に拾い出せないものかと試行錯誤しました。
17)(16)で「Replace(~~~, "<", "<")」としているのは、[innerHTML プロパティ] や [outerHTML プロパティ] のような HTML タグ を含む値を Excel の セル に ペースト すると、Excel が勝手に HTML タグ を飲み込んでしまいますので、HTML タグ の中の半角の "<" を全角の "<" に変換するようにしています。
18)(16)に「効率的に拾い出」すと書きましたが、ウォッチウィンドウ で「objIE.document.all.Item(i)」に続く プロパティ の内、使えそうなものを順に Excel の セル に吐き出させてみたところ [outerText プロパティ] の中に、「IE で表示されているままの文字列」を発見しましたので、[outerText プロパティ] を使うことにしました。
19)次に、実際に Excel の セル に吐き出された
Replace(.document.all.Item(i).outerText, "<", "<")
の中から、「ダイエット日記」~「炭水化物ダイエット 」の行を見つけ、「効率的に拾い出」す式を工夫したのが「(i + j * 2 + 5)」の部分です。
20)以上で「Item(i + j * 2 + 5)」の不思議は解けたかと存じます。
21)なお、検索対象の「キーワード」によっては、「他のキーワード」が3つしかなかったり、全然表示されなかったりしますので、
If HisKeyWord = "12345678910次へ" Then Exit For
としました。
    • good
    • 0
この回答へのお礼

ご親切解説ありがとうございます。

DOUGLAS_さんの人柄を見込みまして
個人的なお願い事がありまして
もしよろしければ
メールで数通やり取りしていただけないでしょうか?

下記フォームに捨てアドレスでかまいませんので
もしよろしければお返事下さい。

お礼日時:2009/06/19 16:54

>下記フォームに捨てアドレスでかまいませんので


 「下記フォーム」が見当たりません。

>メールで数通やり取りしていただけないでしょうか?
 こちら(OKWave)では、このような個人交渉は禁止されていないのでしょうか?
 もし、よいのでしたら、下記のコメント欄へお返事ください。

http://douglas.blog.shinobi.jp/Entry/1/

 なお、この質疑は、問題が解決されたようでしたら、締め切りの手続きをお願いいたします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!