PART4 ExcelVBAでインターネットWebページを操作するテクニック

世の中インターネットの時代になり、仕事または遊びで子供から大人まで大多数の方が毎日インター
ネットのお世話になっていると思います。有効に活用すると非常に便利なインターネットを、ワンタッチ
でWebページのデータをExcelシートへ取り込んだり、見たいページを順序よく表示する操作などを、
ExcelVBAを使用してマクロ化することができます。
インターネット・プログラミング言語と言えばJAVAが一般的ですが、エンドユーザーが自分でプログラ
ミングを組む時代においては、何方でも簡単に扱うことのできるExcelVBAをインターネット・プログラミ
ング言語として使用する方が多くなると思います。ここではインターネットと連携するための基礎的なこ
とから、実際に使用できるサンプルまで紹介します。

なお、Webページを表示するだけの場合はTHMLタグを知らなくともマクロを作成出来ますが、Webぺージ
の特定のボックスにデータを記入したり、ボタンを制御する場合はそのボックスの種類や、ボックス名また
はボタン名の指定が必要です。ある程度のHTMLタグの知識も必要ですがHTMLタグは非常に簡単なので
、インターネットで調べるか専門書を少し見れば理解できると思います。本書ではTHMLタグの説明や
解説は省略しました。

本コナーのサンプルの説明の中で、「詳細はソースを見て下さい」の記述があります。サンプルの掲載場所は
秀和システム社のWebであり、ダウンロード先は単行本「これが知りたかった!Excelマクロ&VBAテクニック」
の4ページに記載されています。


■4-1 Excelシート上に別IE表示ウィンドウを開きWebページを表示する
Webページを制御するためには、Excelシートの最前面にIE表示ウィンドウを表示させる方法の習得が
基本であり、最初にその方法を紹介します。



(1)別ウインドウを開きそこに指定したWebページを表示するマクロ例
ExcelVBAでIE(Internet Explorer)を直接制御できないが、OLE(Object Linking and Embedding)オートメイ
ションを使うと、IEをある程度制御できます。まずExcelを表示しているウインドウの前面に、別ウインドウ
のインターネットのWebページを表示します(実行例は画面1参照)。

なお、WidowsXPではCreateObject("InternetExplorer.Application")を使用してWebの操作が簡単にできま
したが、Windows7ではIEオブジェクトを実行すると、背面に表示や指定のオブジェクト上に表示できなく
エラーが発生します。
(過去にWidowsXPで動いたマクロ例を、4-6節「taWeb6XPマクロ」に参考掲 載しました。また、それを
IE7に対応できるように改善した例を 4-6節「taWeb7XPマクロ」に掲載してありますが、 そのマクロも
Windows7/IE8で実行した場合エラーが発生しました)。

 以下に紹介の開いているエクスプローラがゼロでも数個ある場合でも関係なく必ずエクスプローラを
使ってHTMLファイルを表示し、表示されるまでの待ち時間はオブジェクト数をカウントする方式を、
著者自身が考えましたが、現在この方式が一番安定してWebページを制御できる方式だと思っています。

画面1 指定したWebページを表示例

Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "user32" _
(ByVal hWnd As Long) As Long
Private Declare Function ShowWindowAsync Lib "user32" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
 
Sub web1()
Dim myobj As Object, objIE As Object
Dim fff As String, mycnt
 
Set myobj = CreateObject("Shell.Application")
mycnt = myobj.Windows.Count
 
fff = "http://www2s.biglobe.ne.jp/~iryo/"
'fff = """https://www.google.co.jp/?gws_rd=ssl""" 'VBAの記述時、?付きは""3個にする
 
With myobj.Windows
Shell ("EXPLORER.EXE " & fff)
Do
DoEvents
Loop Until mycnt + 1 <= .Count
Set objIE = .Item(mycnt)
End With
 
Do While objIE.ReadyState <> 4 Or objIE.Busy = True
DoEvents
Loop
 
If IsIconic(objIE.hWnd) Then
ShowWindowAsync objIE.hWnd, &H9
End If
SetForegroundWindow (objIE.hWnd)
Set objIE = Nothing
Set myobj = Nothing
End Sub




(2)シートの最前面に開いたIE表示ウィンドウのサイズ設定マクロ例
Excelシート上にWebページを表示する場合、そのWebページを見てデータをシートにメモ書きしたい場合
等で、表示の大きさや表示場所が一定でないと見づらいケースがあります。本例はIEウィンドウの表示
サイズと表示位置を設定する方法のマクロ例です。(実行例は画面2参照)

画面2 IE表示ウィンドウの設定例


Sub web2()
・・・・・・・・・・・・・・・ 以下Sub web1と同じ ・・・・・・・・・・・・・・・
 
With objIE
.StatusBar = 1
.Toolbar = 1
.AddressBar = 1
.Width = 600
.Height = 400
.Left = 0
.Top = 0
End With
 
Set objIE = Nothing
Set myobj = Nothing
End Sub




(3)指定したHTMLファイルのパスなどの情報を取得するマクロ例
Webページの各種ファイル情報を取得して、その情報をマクロ作成に使用したい場合があります。
本例で主なファイル情報を取得できます。なお、本マクロでは取得したデータをメッセージボックスへ
表示しました(実行例は画面3参照)。

画面3 ファイル情報取得例


Sub web3()
Dim myobj As Object, objIE As Object
Dim fff As String, mycnt
 
Set myobj = CreateObject("Shell.Application")
mycnt = myobj.Windows.Count
 
fff = "http://www2s.biglobe.ne.jp/~iryo/"
With myobj.Windows
.Item(mycnt - 1).Navigate2 fff
Do Until Not .Item(mycnt) Is Nothing
DoEvents
Loop
Set objIE = .Item(mycnt)
End With
 
Do While objIE.ReadyState <> 4 Or objIE.Busy = True
DoEvents
Loop
Application.Wait (Now + TimeValue("0:00:05"))
 
dat1 = objIE.Document.URL
dat2 = objIE.Document.Title
dat3 = objIE.Path
dat4 = objIE.Name
dat5 = objIE.FullName
 
dat6 = TypeName(objIE.Document)
dat7 = objIE.locationName
dat8 = objIE.locationURL
 
msg = "(1)objIE.Document.URLh→" & dat1 & Chr(10) & _
(2)objIE.Document.Title→ & dat2 & Chr(10) & _
(3)objIE.Path→ & dat3 & Chr(10) & _
(4)objIE.Name→ & dat4 & Chr(10) & _
(5)objIE.FullName→ & dat5 & Chr(10) & _
(6)TypeName(objIE.document)→ & dat6 & Chr(10) & _
(7)objIE.locationName→ & dat7 & Chr(10) & _
(8)objIE.locationURL→ & dat8
 
objIE.Quit
Set myobj = Nothing
MsgBox msg
End Sub




(4)Open ステートメントでWebページ表示例
メニューの「ファイル」「開く」でHTMLファイルを開いたケースのマクロ化でワークシート上に表示されます
(実行例は画面40参照)。
画面40 Open ステートメントから実行例


Sub taWeb1()
 
Workbooks.Open Filename:="http://www2s.biglobe.ne.jp/~iryo/"
End Sub




(5)Open ステートメント使用し表示されたデータを取得するマクロ例
これは前(1)で紹介したマクロの実用版で、Excelシート上にWebページを開くので(画面41参照)、後は
マクロで必要な部分を残せば、データ取得の完了です。
ここではあるWebページから株取引に使う、銘柄コードと会社名を取得するサンプルを紹介します。
ただし使用したサンプルのURLは時々変わるので何時までもこのサンプルがそのまま動く保障はありま
せんが、データ取得方法のマクロは他のWebページのデータ収集に応用できるので参考にしてください。
(実行例は、画面41、画面42参照)

画面41 東証1部の鉄鋼銘柄ページ


画面42 取得データ整理例 


Const fff As String = "http://stocksearch.asahi.com/keizai/market/
result.html?market=t1&business=3450"
Sub taWeb2()
Application.ScreenUpdating = False
Workbooks.Open Filename:=fff
Dim zu As Object
For Each zu In ActiveSheet.Shapes
zu.Delete
Next
Cells.Select
Selection.Interior.ColorIndex = xlNone
Range("C16").Select
Dim myobj As Hyperlink
For Each myobj In ActiveSheet.Hyperlinks
With myobj
myobj.Delete
End With
Next
Dim endr As Integer, i As Integer
ActiveSheet.Cells.SpecialCells(xlLastCell).Select
endr = ActiveCell.Row
For i = endr To 1 Step -1
If IsNumeric(Cells(i, 1)) = False Or Cells(i, 1) = "" Then
Rows(i).Select
Selection.Delete Shift:=xlUp
End If
Next
 
Columns("D:H").Select
Selection.Delete Shift:=xlToLeft
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
データを別ブックにコピー
Columns("A:B").Select
Selection.Copy
Application.DisplayAlerts = False
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Application.DisplayAlerts = False
 
ThisWorkbook.Sheets("IEWeb2_1").Select
Range("A1").Select
ActiveSheet.Paste
Range("A1").Select
End Sub




(6)別のExcelオブジェクトへWebページ表示例
こちらは、マクロの記載されているExcelとは別のExcel(オブジェクト)に対して、Open ステートメントを実行
してWebページを表示しています。したがって、Open ステートメントでExcelシートに開くのは(1)と同じ
ですが、こちらはマクロの入っているブックと別なオブジェクトでありWebページの制御は難しい。

Sub taWeb3()
Dim myxls As String
myxls = "http://www2s.biglobe.ne.jp/~iryo/"
With CreateObject("Excel.Application")
.Visible = True
.Workbooks.Open (myxls)
End With
End Sub




(7)セルに記入したハイパーリンクからWebページ表示をさせた例
セルに書いたハイパーリンクをクリックしたマクロですが、こちらはシート上に表示ではなく、別ウインドウ
にIEが表示されます。このケースもExcel上にWebページは表示できるがExcelVBAでの制御は難しい。

Sub taWeb4()
With ThisWorkbook.Sheets("IEWeb")
.Hyperlinks.Add(Anchor:=.Range("A1"), Address:= _
"http://www2s.biglobe.ne.jp/~iryo/", TextToDisplay:="IEWeb2").Follow
.Range("A1") = ""
End With
End Sub




(8)エクスプローラにURLを渡してWebページを開いた例
エクスプローラにURLを渡して起動すると、エクスプローラは自動的にIEを開いてくれます。このケースも
ExcelVBAでWebページは表示できるが、ExcelVBAでそのWebページを制御のは難しい。

Sub taWeb5()
 
Shell "EXPLORER.EXE http://www2s.biglobe.ne.jp/~iryo/"
End Sub




(9)WindowsXPで動くオブジェクトで過去に使用のマクロ例
Windows7(IE8)では、「 IEWeb6XP」を実行したとき、このマクロ記述のExcelファイルの背面に表示され見
えません。また、下記のobjIEオブジェクトにはWebページが取り込まれていないので、このオブジェクト
制御のマクロはWindowsXP以外ではエラーになります。

Sub taWeb6XP()
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate "http://www2s.biglobe.ne.jp/~iryo/"
objIE.Visible = True
 
Do While objIE.Busy = True
DoEvents
Loop
Set objIE = Nothing
End Sub




(10)WindowsXPで動くオブジェクトの改善マクロ例
前述の「InternetExplorer.Application」を使用したは例は、IE7以降は動作不安定またはエラーになり動か
なくなりました。これは、「Internet Explorer 7ウィンドウ」または通常の「エクスプローラー」が1個でも開い
ている場合は既存のウィンドウの中に新しいタブが作成され、そこへ指定したページが表示されます。
既存「エクスプローラーウインドウが開いていない場合は、新しいウィンドウが開き、そこへ指定した
ページが表示されます。

したがって、以下の「taWeb7XP」のようにWindowsコレクションから新しく開いたページのオブジェクトを
取得し、これまで(IE6)のようなIEオブジェクトを作成します。
ただし、Windows Vista、IE8で実行で、IE8と通常のエクスプローラーの両ウインドウが開いてい場合
エラーになる等動作が不安定であり、Windows7では開いているエクスプローラーがなしのケースでエラー
になります。「taWeb6XP」「taWeb7XP」マクロは参考に掲載しましたが、実行できる場合もありますが不安
定であり、Wndows7-IE8でのWebページの制御には、4-1節に紹介の方法が適しています。

Sub taWeb7XP()
Dim objIE
Dim objShell
Dim objWin
Dim obcnt
Dim fff As String
 
fff = ThisWorkbook.Path & "\form01.html"
Set objShell = CreateObject("Shell.Application")
obcnt = 0
For Each objWin In objShell.Windows
obcnt = obcnt + 1
Next
 
With objShell.Windows
If obcnt = 0 Then
.Item.Navigate2 fff
obcnt = obcnt + 1
Else
.Item(obcnt - 1).Navigate2 fff, &H800
End If
 
'オブジェクトが確定するまでの空ループ
Do Until Not .Item(obcnt) Is Nothing
DoEvents
Loop
 
Set objIE = .Item(obcnt)
End With
 
With objIE.Document
.all("txt1").Value = "text(1)へ記入 12345"
.all.txt2.Value = "text(2)へ記入 abcde"
.Myfm.txt3.Value = "text(3)へ記入 ABCDE"
 
.getElementById("txt4").Value = "text(4)へ記入 あいうえお"
.forms(1).elements(1).Value = "text(5)へ記入 67890"
End With
 
Set objIE = Nothing
Set objShell = Nothing
 
End Sub




(11)WSHのRunメソッドで拡張子html制御でWebページ表示例
WSH(Windows Script Host)は、ある決まった一連の手続き(スクリプト)をテキスト・ファイルに記述し、
VBScript は「.vbs」、又はJScript は「.js」という拡張子を付けてファイルを作成します。ここではExcelVBA
でWSHを参照するオブジェクトで拡張子htmlの実行例です。
ファイルの種類がアプリケーションと関連付けられている場合、その種類のファイルを指定して Run メ
ソッドを呼び出すと、関連付けられたアプリケーション[本例:InternetExplorer]プログラムが実行されます。

Sub taWeb7()
Dim objWshShell As Object
Set objWshShell = CreateObject("WScript.Shell")
objWshShell.Run "http://www2s.biglobe.ne.jp/~iryo/index.html", 1
 
End Sub



【戻る】    【Top画面】   【HPへ】