いよいよ、クライマックスです。
過去3回の記事をおさらいしておいてくださいね。
今回の処理の概要は、次のとおりです。
「表の検索キーワードを使って、Googleで検索を行い、検索結果の総数をF列に代入する」
今回の表は、10行ありますので、繰り返し処理を行います。
それでは、プログラムの処理を確認しましょう。
1.表のシート(今回は、「Sheet1」です)の3行目の検索キーワードを含んだURLを生成する
2.エクセルの機能「新しいWebクエリ」を使って、別のシート(今回は、「Sheet2」です)にデータを取り込む
3.取り込んだデータの中から、検索結果の総数を取得して(自作関数を使用)、表のF列3行目に代入する
4.上記1~4の手順を、表の最終行まで、繰り返す(今回は10回)
5.取り込みの際に自動的に生成される 名前 を全部削除する(サブルーチンとして作成しました)
手順5について説明をしておきます。
データを取り込むごとに、名前が自動生成されてしまいます。
これは、増える一方です。

パソコンの性能によりますが、この名前があまり多くなると、とたんに処理が遅くなります。
パソコンによっては、動かなくなることもあります。
それを避けるために、処理の最後に、この名前を全部削除しているのです。
今回は、この処理を独立したプロシージャとしてつくりました。
名前は、DeleteNameとしました。
いくつあるか分からない名前を全部削除するには、For Each ~ Next構文を使うと簡単です。
詳しくは、下のコードをご覧ください。
それでは、標準モジュールに記述するコードを確認します。
3つのプロシージャ(プログラムの単位)がありますよ。
画像を載せておきます。


それでは、プログラムを実行してみましょう。
「ツール」「マクロ」「マクロ」で、「マクロ」ダイアログボックスを表示します。
Altキーを押しながら、F8キーを押してもいいですよ。
検索件数の取得 を選択して、実行ボタンを押してください。

すると、F列に、順次、数字が代入されていきます。
大体、1秒おきくらいのペースで、代入されていきますが、
ネットの通信状況等で、もっと遅くなるかもしれません。
しばらく、眺めていてやってください。
ほら、完了しました。

今回のシリーズは、いくつものステップに分けて、最終的に目的を達成しました。
そのステップごとに、プロシージャをつくり、それを呼び出して処理するようにすると、
プログラム全体の見通しがよくなります。
今回の場合では、繰り返し、データを取り込むプログラムが主となりますが、
その中で、取り込んだデータから検索結果の総数を取得するプログラムまで記述すると、
プログラムが長くなり、分かりにくくなってしまいます。
そこで、取り込んだデータから検索結果の総数を取得する部分を、別途関数として
独立したプロシージャとすることによって、ロジックとしても、処理の流れとしても
可読性の高いプログラムとなります。
同様に、名前の一括削除も、独立させて、呼び出すようにしました。
「困難は、分割せよ」ということわざがあります。
プログラムを作るのにも、たいへん有用な言葉です。
それでは、また。
だい
過去3回の記事をおさらいしておいてくださいね。
今回の処理の概要は、次のとおりです。
「表の検索キーワードを使って、Googleで検索を行い、検索結果の総数をF列に代入する」
今回の表は、10行ありますので、繰り返し処理を行います。
それでは、プログラムの処理を確認しましょう。
1.表のシート(今回は、「Sheet1」です)の3行目の検索キーワードを含んだURLを生成する
2.エクセルの機能「新しいWebクエリ」を使って、別のシート(今回は、「Sheet2」です)にデータを取り込む
3.取り込んだデータの中から、検索結果の総数を取得して(自作関数を使用)、表のF列3行目に代入する
4.上記1~4の手順を、表の最終行まで、繰り返す(今回は10回)
5.取り込みの際に自動的に生成される 名前 を全部削除する(サブルーチンとして作成しました)
手順5について説明をしておきます。
データを取り込むごとに、名前が自動生成されてしまいます。
これは、増える一方です。

パソコンの性能によりますが、この名前があまり多くなると、とたんに処理が遅くなります。
パソコンによっては、動かなくなることもあります。
それを避けるために、処理の最後に、この名前を全部削除しているのです。
今回は、この処理を独立したプロシージャとしてつくりました。
名前は、DeleteNameとしました。
いくつあるか分からない名前を全部削除するには、For Each ~ Next構文を使うと簡単です。
詳しくは、下のコードをご覧ください。
それでは、標準モジュールに記述するコードを確認します。
3つのプロシージャ(プログラムの単位)がありますよ。
Sub 検索件数の取得() Dim qs As String Dim i As Integer Dim LastRow As Integer Sheets(1).Select '最終行を取得 LastRow = Range("B65536").End(xlUp).Row For i = 3 To LastRow Sheets(1).Select '検索キーワードを含んだURLを生成する qs = "http://www.google.co.jp/search?hl=ja&source=hp&q=" qs = qs & Range("C" & i).Value & " " qs = qs & Range("D" & i).Value & " " qs = qs & Range("E" & i).Value qs = qs & "&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=&aq=f&aqi=g8g-r2&aql=&oq=&gs_rfai=" Sheets(2).Cells.Clear 'データを取り込む(メイン処理)特に2行下のコードに注目。qs がURL です。 With Sheets(2).QueryTables.Add(Connection:= _ "URL;" & qs, Destination:=Sheets(2).Range("A1")) .Name = "google" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With '取り込んだデータの中から、検索結果の総数を取り出す '別途作成した 自作関数を使用する Sheets(1).Range("F" & i).Value = GetKensu Next 'サブルーチンを実行する DeleteName Sheets(1).Select End Sub Function GetKensu() As String '自作関数:取り込んだデータから検索結果の総数を取得する Dim i As Integer Dim LastRow As Integer Dim StartPoint As Integer, EndPoint As Integer '定数に、今回は、「検索結果」を設定する Const StartKeyWord As String = "検索結果" Sheets(2).Select '最終行を見つける LastRow = Range("A65536").End(xlUp).Row For i = 1 To LastRow '行に、「検索結果」という文字があるかどうかをチェック。 StartPoint = InStr(Range("A" & i).Value, StartKeyWord) If StartPoint > 0 Then '見つかった場合の処理(見つかると、行頭からの文字数を返す) EndPoint = InStr(Range("A" & i).Value, "件中") '「件中」という文字までの間に、検索件数の数字が存在する GetKensu = Mid(Range("a" & i).Value, _ StartPoint + Len(StartKeyWord), _ EndPoint - (StartPoint + Len(StartKeyWord))) '「検索結果」と「件中」の間の文字を取得 GetKensu = Replace(GetKensu, "約", "") '「約」という文字を削除(こういう場合に、置換を使用する) GetKensu = Trim(GetKensu) '一応、数値の両端の空白を除去しておく Exit Function End If Next GetKensu = "なし" 'もし、検索結果の数値が見つからなかった場合の、この関数の答え End Function Sub DeleteName() Dim n As Name For Each n In Names n.Delete Next End Sub
画像を載せておきます。


それでは、プログラムを実行してみましょう。
「ツール」「マクロ」「マクロ」で、「マクロ」ダイアログボックスを表示します。
Altキーを押しながら、F8キーを押してもいいですよ。
検索件数の取得 を選択して、実行ボタンを押してください。

すると、F列に、順次、数字が代入されていきます。
大体、1秒おきくらいのペースで、代入されていきますが、
ネットの通信状況等で、もっと遅くなるかもしれません。
しばらく、眺めていてやってください。
ほら、完了しました。

今回のシリーズは、いくつものステップに分けて、最終的に目的を達成しました。
そのステップごとに、プロシージャをつくり、それを呼び出して処理するようにすると、
プログラム全体の見通しがよくなります。
今回の場合では、繰り返し、データを取り込むプログラムが主となりますが、
その中で、取り込んだデータから検索結果の総数を取得するプログラムまで記述すると、
プログラムが長くなり、分かりにくくなってしまいます。
そこで、取り込んだデータから検索結果の総数を取得する部分を、別途関数として
独立したプロシージャとすることによって、ロジックとしても、処理の流れとしても
可読性の高いプログラムとなります。
同様に、名前の一括削除も、独立させて、呼び出すようにしました。
「困難は、分割せよ」ということわざがあります。
プログラムを作るのにも、たいへん有用な言葉です。
それでは、また。
だい

google 利用規約
http://www.google.co.jp/accounts/TOS?hl=ja
>5.3 Google が提供するインタフェース以外の手段で、本サービスのいずれにもアクセスしないこと(またはアクセスを試みないこと)に同意するものとします。ただし、Google との別個の契約において明確な許可を受けた場合は除きます。特に、ユーザーは、いかなる本サービスについても、いかなる自動化された方法(スクリプトやウェブ クローラーの利用によるものを含みます)によりアクセスせず、アクセスを試みないことに同意し、また、本サービスに関して提示されるいかなる robots.txt ファイルにおける指示に従うものとします。
この項に該当するため、良識ある一般的なプログラマはgoogleより提供されているAPIを通してのみサービスの利用をしています。
もし検索を自動化したコードを公開したいのであれば、API keyをgoogleから発行してもらい、問題のないクエリを使ったコードを公開すべきかと存じます。