ウェブサイトからExcelにデータをインポートするには?
World Wide Webには膨大な有用なデータが含まれていることはよく知られています。 ただし、あらゆる種類の分析を行う前に、データをMicrosoft Excelにインポートする必要があります。 この種のタスクを完了するために使用できる2つの方法があります。
手動でWebから外部データを取得
あなたはこのwebページからトップ金儲け映画についての収入をダウンロードしたいとします,ここでは簡単にそれを行う方法を示しています.
Microsoft Excelを開き、データタブをクリックし、外部データの取得グループで、Webからをクリックします。 新しいWebクエリダイアログボックスが表示されたら、webアドレス(http://www.the-numbers.com/movie/records/All-Time-Worldwide-Box-Office)をアドレスフィールドにコピーし、Goボタンをクリックします。 図1.1に示すように、Excelはwebページのダウンロードを開始します。 下の図のようなスクリプトエラー警告ボックスが表示される場合は、[いいえ]をクリックしてください。 ボックスは消え、インポートプロセスには影響しません。
図1.1
新しいWebクエリダイアログボックスの右上隅にある黄色のボックスに矢印があります。 それをクリックすると、テーブルの前に同様のアイコンを表示するかどうかを決定できます。 たとえば、図1.2の左側のパネルの表の横に矢印アイコンはありません。 矢印ボタンをクリックしてアイコンを表示すると、(右側のパネルに)アイコンが表示されます。
図1.2
選択するテーブルの横にある矢印アイコンをクリックします。 アイコンとテーブルが変更され、図1.3の左側のパネルに示すものと同様になります。 インポートをクリックすると、データのインポートダイアログボックスが表示されます。 データを配置する範囲(この場合は列Aから列Hまで)を入力し、[OK]をクリックします。
図1.3
Okをクリックすると、データがExcelにインポートされます。 テーブル内の任意のセルを右クリックして[更新]を選択すると、Excelが表示され、webページから最新のデータが引き出されます。
図1.4
また、クエリデータを任意の方法で更新するように設定することもできます。 テーブル内の任意のセルを右クリックし、データ範囲のプロパティを選択します。 プロンプトが表示される外部データ範囲のプロパティダイアログボックスで、更新コントロールの設定を変更してスタイルを変更できます。 たとえば、クエリを60分ごとに更新するか、ファイルを開いたときに更新するように指定できます。
VBAプログラミングを使用したデータのスクレープ
VBAプログラミングを使用して、webページからデータをスクレープできます。 最初のアプローチと比較すると、はるかに便利ですが、難しいです。 さらに、VBAプログラミングを使用してデータをスクレイプする方法を学ぶ前に、HTMLが何であるかを理解する必要があります。 HTMLについて何も知らない場合は、このウェブサイトからHTMLの基本的な知識を学ぶことをお勧めします。 ここから、VBAを使用してwebスクレイピングに関連するほとんどすべてを学ぶことができます。 この記事では、2つの例のみを紹介します。
あるウェブページからデータをスクレープ
このウェブページから会社名、メールアドレス、連絡先名を抽出したいとします。 このwebページを開くと、下部に連絡先ブロックがあることがわかります。 図2.1は、contactブロックと対応するソースコードを示しています。 赤い箱の情報は私達が必要としたいと思うものである。 そして、緑色の下線を持つものは、まさに私たちが抽出する必要があるものです。
図2.1
次のコードは、上記の要求された情報を抽出し、最初のワークシートに配置するのに役立ちます。
ソースコード |
サブRetrieve_Click()'Create InternetExplorerSet IE=CreateObject("InternetExplorer.アプリケーション")"のは、ブラウザのウィンドウを見てみましょう。Visible=False'web pageIEを開きます。"http://www.austrade.gov.au/SupplierDetails.aspx?ORGID=ORG8160044431&folderid=1736"に移動し、IEがロードされている間待機します。readyState<>4またはIE。Busy=True DoEvents Loop'会社名、電子メールアドレス&連絡先情報セットcontactobj=IEを取得します。文書。getElementsByClassName("contact-details block dark")htext=contactobj(0).innerHTML MsgBox htext If InStr(htext,"<p>Company Name:")Thisworkbook.ワークシート(1)Cells(1,1)=Split(Split(htext,"<p>会社名: ")(1), "<br")(0)End If If InStr(htext,"mailto:")Thisworkbook.ワークシート(1)セル(2,1)=Split(Split(htext,"mailto:")(1),Chr(34) & ">")(0) End If If InStr(htext,"<p>Name:")Thisworkbook.ワークシート(1)Cells(3,1)=Split(Split(htext,"<p>Name: ")(1), "<br")(0)このワークブックの場合は終了します。ワークシート(1)セル(4,1)=IE.LocationURL ThisWorkbook.Save SET IE=Nothing Set contactobj=Nothing End Sub
“えええええええ文書。getElementsByClassName(“contact-details block dark”)”を使用すると、クラス名–contact-details block darkを持つすべての要素を取得できます。 このwebページには、HTML要素で使用できるほとんどすべてのプロパティとメソッドが一覧表示されます。 あなた自身の問題のための適切なものを選ぶことができます。
innerHTMLプロパティを使用すると、HTML要素のコンテンツを設定または返すことができます。 私たちの場合、クラス名”contact-details block dark”の要素の内容を返し、変数htextに設定しました。 コンテンツ(図2.2)は、’Msgbox htext’によって要求されます。
図2.2
あなたは、テキストがよく構造化されていることがわかります。 そのため、SPLIT関数を使用して必要なものを抽出できます。 たとえば、”<p>Company Name”とすると: 区切り文字と数式として「Split(htext,”<p>Company Name:”)(1)」は、「<p>Company Name:」の後のテキスト全体を返すことができます。 この新しく返されたテキストでは、区切り文字として”<br”を取得し、最初の”<br”の前のテキストを取得できます。 要約すると、SPLIT functionは、ほとんどすべてを抽出するために使用できる柔軟なツールです。 その他の便利な機能には、LEN、INSTR、LEFT、RIGHT、MID、REPLACEなどがあります。 ここでは詳細については説明しません。
図2のOKをクリックした後。2、要求されたデータは、WebからExcelワークシートにインポートすることができます。 たとえば、セルA1には会社名が含まれ、セルA4には会社のwebページアドレスが含まれます。
図2.3
ブックを保存する前に以下のコードを追加することで、セルA4にハイパーリンクを追加できます。
ソースコード |
'hyperlinkThisWorkbookを追加します。ワークシート(1)ハイパーリンク。このワークブックを追加します。ワークシート(1)セル(4,1),ThisWorkbook.ワークシート(1)細胞(4, 1)
セルA4をクリックすると、webページを再訪することができます。 これは、多くの企業のデータを取得する必要がある場合に特に便利です。 あなたは、対応するwebページを再訪し、後でレビュー中に手動で任意の情報を追加または更新するために任意のハイパーリンクをクリックすることがで
図2.4
webページとの対話
上記の例は、静的なwebページからデータを取得する方法を示しています。 しかし、多くの場合よりも、我々は大量のデータを取得するために、webページと相互作用している抽出する必要があります。 図3.1を見てください。 上記の例のwebページに移動する方法を示します。 多くの産業があり、各産業ごとに多くの企業があることがわかります。 たとえば、アグリビジネス業界には651社の企業があります。 すべての業界からすべての企業の連絡先情報を抽出したい場合はどうすればよいですか?
図3.1
さて、重要な点は、VBAを手動で行うようにwebページと対話させる方法です。 例としてS.W.I.Sの利点を取りましょう。 一般的に、ExcelがAgribusiness(図3.1の上部パネル)をクリックしてIEをトリガーして2番目のwebページに誘導できることを願っています。 2番目のwebページ(図3.1の下部パネル)で、ExcelはS.W.I.S Advantageをクリックし、IEは図2.1に示すようにページに移動して、S.W.I.S Advantageの連絡先情報を取得できます。
Visual Basic Editorに次のコードを入力してコードを送信すると、IEが開かれていることがわかります。 最初のwebページが表示され、その後に2番目のwebページが表示されます。 ここでは、ドロップダウンリスト要素を取得し、オプションを選択し、オプションを選択した後にイベントをトリガーする方法を学習します。 “m=IE.文書。getElementsByTagName(“オプション”)。長さ-1″はあなたにオプションの総数を与えるでしょう。 これは次のループに使用できます。
ソースコード |
サブretrieve()'Create InternetExplorerSet IE=CreateObject("InternetExplorer.アプリケーション")"のブラウザウィンドウを見てみましょう。Visible=True'web pageIEを開きます。"http://www.austrade.gov.au/international/buy#"'IEがロードされている間待つIEがロードされている間待機します。忙しいアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) 'パート1-ドロップダウンリストを選択し、1つのoptionSet selectobj=IEを選択した後にイベントをトリガーします。文書。getElementsByTagName("select")m=IE.文書。getElementsByTagName("オプション")。長さ-1selectobj(0).selectedIndex=1selectobj(0).FireEvent("onchange")'IEがロードされている間待つieがロードされている間に待機します。readyState<>4またはIE。Busy=真のアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) 終了サブ
コードのこの部分では、Excelが最初の名前をクリックした後、図2.1に示すwebページに移動できます。 すべての会社の名前は、クラス名が”Name”の要素に含まれています。 Searchobjはコレクションであり、searchobj(i)は(i+1)番目のオブジェクトを返すことができます。 たとえば、searchobj(1)です。クリックすると、リドリー株式会社(メルボルン)のwebページを訪問することができます。
ソースコード |
'パート2-会社名を選択してください。文書。getElementsByClassName("Name")searchobj(0)."IEが読み込まれている間に待つ"をクリックします。readyState<>4またはIE。Busy=True DoEventsループ
最後に、IEを開いたり、webページを閲覧したり、データを抽出したりするプロセスを示すコード全体を示します。 抽出されたデータは、図2.4のデータと同じになります。
ソースコード |
サブRetrieve()'Create InternetExplorerSet IE=CreateObject("InternetExplorer.アプリケーション")"のブラウザウィンドウを見てみましょう。Visible=True'web pageIEを開きます。"http://www.austrade.gov.au/international/buy#"'IEがロードされている間待つIEがロードされている間待機します。忙しいアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) 'パート1-ドロップダウンリストを選択し、1つのoptionSet selectobj=IEを選択した後にイベントをトリガーします。文書。getElementsByTagName("select")m=IE.文書。getElementsByTagName("オプション")。長さ-1selectobj(0).selectedIndex=1selectobj(0).FireEvent("onchange")'IEがロードされている間待つieがロードされている間に待機します。readyState<>4またはIE。Busy=真のアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) 'パート2-会社名を選択してください。文書。getElementsByClassName("Name")searchobj(0)."IEが読み込まれている間に待つ"をクリックします。readyState<>4またはIE。Busy=True DoEvents Loop'パート3-会社名、電子メールアドレス&連絡先情報を取得するcontactobj=IEを設定します。文書。getElementsByClassName("contact-details block dark")htext=contactobj(0).innerHTML If InStr(htext,"<p>Company Name:")その後、ThisWorkbook.ワークシート(1)Cells(1,1)=Split(Split(htext,"<p>会社名: ")(1), "<br")(0)End If If InStr(htext,"mailto:")Thisworkbook.ワークシート(1)セル(2,1)=Split(Split(htext,"mailto:")(1),Chr(34) & ">")(0) End If If InStr(htext,"<p>Name:")Thisworkbook.ワークシート(1)Cells(3,1)=Split(Split(htext,"<p>Name: ")(1), "<br")(0)このワークブックの場合は終了します。ワークシート(1)セル(4,1)=IE.LocationURL'hyperlinkThisWorkbookを追加します。ワークシート(1)ハイパーリンク。このワークブックを追加します。ワークシート(1)セル(4,1),ThisWorkbook.ワークシート(1)セル(4,1)エンドサブ
実際には、私たちがする必要があることは、すべての業界からすべての企業の連絡先情報を抽出することですので、我々はこのタスクを完了するためにloop文のために使用を行う必要があります。 以下は完全なコードです。 また、すべての企業の連絡先情報を取得するには、コードを見つけることもできます。この記事の最後にダウンロードできるxlsm。
ソースコード |
idex=2から18のサブRetrieve()'Create InternetExplorerSet IE=CreateObject("InternetExplorer.アプリケーション")"のブラウザウィンドウを見てみましょう。Visible=False'web pageIEを開きます。"http://www.austrade.gov.au/international/buy#"'IEがロードされている間待つIEがロードされている間待機します。忙しいアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) idexn=idex-1'パート1-ドロップダウンセットselectobj=IEを選択します。文書。getElementsByTagName("select")m=IE.文書。getElementsByTagName("オプション")。長さ-1selectobj(0).selectedIndex=idexn selectobj(0).FireEvent("onchange")'IEがロードされている間待つieがロードされている間に待機します。readyState<>4またはIE。Busy=真のアプリケーション。DateAdd("s",1,Now)ループアプリケーションを待ちます。待って(今+TimeValue("00:00:10")) wurl=IE.LocationURL tot=IE.文書。getElementsByClassName("SearchTotal")(0).innerHTML pg=Int(tot/25)+1Max=(Tot Mod25)-1'Part2-Select Class="Name"a=2For j=1to pg If j=1Then IE.ナビゲーション(wurl)他のIE。Navigate(wurl&"&pg="&j)IE中に行う場合は終了します。忙しいアプリケーション。Wait DateAdd("s",1,Now)ループif j<>pg then For I=1To24Set searchobj=IE.文書。getElementsByClassName("Name")searchobj(i)."IEが読み込まれている間に待つ"をクリックします。readyState<>4またはIE。Busy=True DoEvents Loop'パート3-会社名、電子メールアドレス&連絡先情報を取得するcontactobj=IEを設定します。文書。getElementsByClassName("contact-details block dark")htext=contactobj(0).innerHTMLこのワークブック。(アイデックス)のワークシートです。Cells(a,1)=j ThisWorkbook.(アイデックス)のワークシートです。Cells(a,2)=a-1If InStr(htext,"<p>Company Name:")ThisWorkbook.(アイデックス)のワークシートです。Cells(a,3)=Split(Split(htext,"<p>会社名: ")(1), "<br")(0)End If If InStr(htext,"mailto:")Thisworkbook.(アイデックス)のワークシートです。セル(a,4)=Split(Split(htext,"mailto:")(1),Chr(34) & ">")(0) End If If InStr(htext,"<p>Name:")Thisworkbook.(アイデックス)のワークシートです。Cells(a,5)=Split(Split(htext,"<p>Name: ")(1), "<br")(0)このワークブックの場合は終了します。(アイデックス)のワークシートです。セル(a、6)=IE。所在地:東京都千代田区GoBackは、IEながら行います。忙しいアプリケーション。待ってDateAdd("s",1,Now)ループa=a+1次のi Else for I=0To Max Set searchobj=IE.文書。getElementsByClassName("Name")searchobj(i)."IEが読み込まれている間に待つ"をクリックします。readyState<>4またはIE。Busy=True DoEvents Loop'パート3-会社名、電子メールアドレス&連絡先情報を取得するcontactobj=IEを設定します。文書。getElementsByClassName("contact-details block dark")htext=contactobj(0).innerHTMLこのワークブック。(アイデックス)のワークシートです。Cells(a,1)=j ThisWorkbook.(アイデックス)のワークシートです。Cells(a,2)=a-1If InStr(htext,"<p>Company Name:")ThisWorkbook.(アイデックス)のワークシートです。Cells(a,3)=Split(Split(htext,"<p>会社名: ")(1), "<br")(0)End If If InStr(htext,"mailto:")Thisworkbook.(アイデックス)のワークシートです。セル(a,4)=Split(Split(htext,"mailto:")(1),Chr(34) & ">")(0) End If If InStr(htext,"<p>Name:")Thisworkbook.(アイデックス)のワークシートです。Cells(a,5)=Split(Split(htext,"<p>Name: ")(1), "<br")(0)このワークブックの場合は終了します。(アイデックス)のワークシートです。セル(a、6)=IE。LocationURL ThisWorkbook.(アイデックス)のワークシートです。ハイパーリンク。このワークブックを追加します。(アイデックス)のワークシートです。セル(a,6),ThisWorkbook.(アイデックス)のワークシートです。細胞(a、6)すなわち。GoBackは、IEながら行います。忙しいアプリケーション。待機DateAdd("s",1,Now)ループa=a+1次にThisWorkbookの場合に終了します。次のjを保存するSET IE=Nothing Set contactobj=Nothing Next idex End Sub
私が説明する必要がある唯一の点は、図3.2に示されています。 一つのwebは、25の企業として多くを一覧表示することができます。 企業の総数が25を超えると、複数のページが表示されます。 図3.2は、最初のページの後にページのアドレスを取得するルールがあることを示しています。 これは、最初のページのアドレス”&pg=”と実際のページ番号を連結した結果です。 また、最後のページより前のすべてのページでは、オブジェクトの総数は25です。 “すなわち。文書。getElementsByClassName(“SearchTotal”)(0).innerHTML”は、業界内の企業の総数を返すことができます。 私たちの場合、それは651になります。 「Int(tot/25)+1」は、ページの総数を取得できます。 また、”Max=(tot Mod25)-1″は、最後のページの最大企業数を返すことができます。 私はここで停止し、このアイデアをコードに適用する方法を理解するためにあなたを残します。 それはあなたがコードを把握するためのはるかに良いアプローチです。 質問がある場合は、コメントを残すことができます。
図3.2
ここでは、最終的なexcelの一部を示しています。 一つの業界内のすべての企業の連絡先情報は、一つのワークシートにまとめられています。
図3.3
- webサイトからデータをExcelに自動的に抽出する方法は?
- インポートデータ(文、段落、表、コメント)ワードからExcelに
- 6最高のExcel VBAプログラミングブック(初心者のための&上級ユーザー)
- Excel VBAプログラミングを学ぶ&マクロ(無料5767>
- Vbaマクロ入門
作業ファイルのダウンロード
以下のリンクから作業ファイルをダウンロードします。
WebからExcelにデータをプルします。