[[20150204031506]] 『VBでInternetExplorerのプルダウンを操作したい』(サンパウロ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBでInternetExplorerのプルダウンを操作したい』(サンパウロ)

こんにちは、初めて質問させていただきます。
会社のデータ集計などでVBを作成した経験はありますが、独学のため初心者同然の知識です。

<やりたい作業>
今回仕事の作業でInternetExplorer上のデータベースから抽出するデータを集計する必要が出てきました。70回以上の繰り返し作業のため、自動化したいと思っています。

プルダウンリストを選択することで、選択地域のデータを表示できるサイトがあります。
地域が70以上あるため、VBで自動的にプルダウンリストを選択し、エクセルにコピーをしていきたいと思っています。

こちらのサイト(http://vba-code.net/ie/select-from-dropdown-list/)を参考にし、プルダウンメニューを選択する部分を次のように書きました。

'プルダウンメニューを選択
objIE.Document.getElementById("sel_Mun").SelectedIndex = "1"

しかしながらうまくいかず、この部分で停止してしまいます。
下記のサイト情報の通り、プルダウンは id='sel_Mun' というIDのようなので、上記の通りIDを"sel_Mun"に設定していますが、うまくいきません。
もし何か間違っている点がありましたら、教えていただけますと幸いです。
宜しくお願いいたします。

<操作したいサイト>
サイトは下記の通りですが、外部からは開けないと思います。
http://spo-desoper1.spo.sabesp.com.br/to/tor/acompanhamento/

ブラウザのバージョンはInternetExplorer11です。

HTMLコードのプルダウンリストは下記の通りです。
<td width="40%" style="text-align:center">Município: 
<select class='selec' id='sel_Mun' name='sel_Mun' onChange="monta_pagina('Mun')" >
<option value=''> </option>
<option value='ÁGUAS DA PRATA' >ÁGUAS DA PRATA</option>
<option value='ÁGUAS DE SANTA BÁRBARA' >ÁGUAS DE SANTA BÁRBARA</option>
<option value='ALTAIR' >ALTAIR</option>

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 参照先のサンプルページを見たら、'aetas' は id のはずが name 属性になっていました。
 「えっ!?」と思ってみると、こんな記事もありました。
http://d.hatena.ne.jp/daisun/20080410/1207837641

 でも、IE10 以降ではこのあたりが修正されているようです。
http://seiken.main.jp/yyw/?p=543

 っていうことで、やっぱりデバッグして確認するしかないでしょうか。
 一旦
 Set objSelect = objIE.Document.getElementById("sel_Mun")
 のようにして、ウォッチウィンドウで何が取得されているか確認してみてはどうでしょうか。
 念のために、同じ名前の id や name が存在しないか等も確認してみてはと思います。

 蛇足ですが、「うまくいきません」では何の情報もないので、表示されている
 エラーコードや表示の内容くらいは説明したほうが良いと思います。
(Mook) 2015/02/04(水) 10:00

Mookさま、回答ありがとうございました。また記載が不十分で失礼しました。
(返信コメントを記載したつもりが、投稿できていなかったようで遅くなりました。)

エラーは、実行時エラー91「オブジェクト変数または With ブロック変数が設定されていません」でした。

またアドバイスいただいた通りに

 Set objSelect = objIE.Document.getElementById("sel_Mun")
で何が取得されているか確認してみましたが、Empty値でした。

同様の状況を分析している下記サイトによると、どうやらサイトのフレームが問題である可能性があるようです。
http://d.hatena.ne.jp/ken3memo/20111209/1323433071

操作したいプルダウンリストのあるフレームはname="menuFrame"のようですが、
フレームの指定、そこからのプルダウンリストの指定の仕方がわからず、止まってしまいました。
何かアドバイスをいただけたら幸いです。宜しくお願いいたします。

<対象サイトのソース>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PERDAS - Acompanhamento Físico e Financeiro</title>
</head>

<frameset id="geral" rows="180,*,5" cols="*" framespacing="0" frameborder="yes" border="0">

    <frameset id="cabec" rows="100,80,0" cols="*" framespacing="0" frameborder="yes" border="0">
          <frame src="ASP/topFrame/banner.asp" name="bannerFrame" id="bannerFrame" title="BannerFrame" scrolling="no" />
          <frame src="ASP/topFrame/menu.asp?Abertura=X" name="menuFrame" id="menuFrame" title="topFrame" scrolling="no" />
          <frame src="ASP/topFrame/aguarde.htm" name="hdrFrame" id="hdrFrame" title="HeaderFrame" scrolling="no" />
    </frameset>
    <frame src="ASP/topFrame/limpo.htm" name="mainFrame" id="mainFrame"  scrolling="auto" />
	<frame src="ASP/topFrame/footer.asp" name="bottomFrame" id="bottomFrame" scrolling="no" />
</frameset>

<noframes><body>
</body>
</noframes></html>

(サンパウロ) 2015/02/07(土) 03:32


 ご自身でリンクされたken3さんの参照先に、フレームがある場合の対応方法がありますが、
http://d.hatena.ne.jp/ken3memo/20111215/1323883317
 これでダメだったということでしょうか。
(Mook) 2015/02/08(日) 13:51

Mookさま
お忙しい中、返信ありがとうございます。
下記2つのサイトを参照しながら、試行錯誤しております。
(VBAでIE操作 フレームページ) http://d.hatena.ne.jp/ken3memo/20111215/1323883317
(フレーム内フォーム選択) http://www.vba-ie.net/frame/subroutine-select.html

まずはVBEの参照設定が必要だと知ったので、「Microsoft HTML Object Library」「Microsoft Internet Controls」にチェックを入れました。

そして、フレームのオブジェクトを取得→セレクトボックスを選択 という流れでセレクトボックスを操作できるかと試しています。

しかしながら、'セレクトボックスを選択 ◆ のところで、
「実行時間のエラー'-2147024891(80070005)' アクセスが拒否」というエラーになります。
(↑日本語でのメッセージは多少文面が異なるかもしれません)

<現在のコード>
Sub PerdasFisicoFinanceiro()

Dim objIE As InternetExplorer
Dim objFRAME As FramesCollection

'IE(InternetExplorer)のオブジェクトを作成する
Set objIE = CreateObject("InternetExplorer.Application")

'IE(InternetExplorer)を表示する
objIE.Visible = True

'指定したURLのページを表示する
objIE.Navigate "http://spo-desoper1.spo.sabesp.com.br/to/tor/acompanhamento/"

'完全にページが表示されるまで待機する
Do While objIE.Busy = True Or objIE.ReadyState <> 4

  DoEvents
Loop

'フレームのオブジェクトを取得する

 Set objFRAME = objIE.document.frames

'セレクトボックスを選択 ◆
objFRAME("menuFrame").document.getElementsByName("sel_Mun")(0).selectedIndex = 1

End Sub

(サンパウロ) 2015/02/11(水) 19:55


なお、対象サイトは以下のようになっています。
ここにあるプルダウンの「Municipio」という部分を操作して地域を指定します。
プルダウンでひとつの地域を選択すると、自動的にデータの抽出が始まります。

またプルダウンのあるメニューフレーム部分のソースを表示すると下記のようになっています。(長くなり過ぎるためoption部分は一部を残して省略しました)

<メニューフレーム部分のソース>
<html>
<head>
<title>PERDAS - Acompanhamento Físico e Financeiro</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="expires" content="Sun, 15 Jan 1998 11:00:00 GMT">
<script src="../../JavaScript/menu.js" type="text/javascript" charset='utf-8' ></script>
<link href="../../STYLE/init.css" rel="stylesheet" type="text/css">
</head>
<body>

<div id="conteudo" >
<input type="hidden" id="grp1" value="financeiro" />
<input type="hidden" id="grp2" value="acoes" />
<input type="hidden" id="grp3" value="consolidado" />
<input type="hidden" id="grp4" value="pagto" />
<input type="hidden" id="Dir" name="Dir" value="">
<input type="hidden" id="UN" name="UN" value="">
<input type="hidden" id="IC" name="IC" value="">
<input type="hidden" id="UGR" name="UGR" value="">
<input type="hidden" id="Mun" name="Mun" value="">
<input type="hidden" id="Polo" name="Polo" value="">
<table width="100%" align="center" cellpadding="0" cellspacing="0" >

    <tr height="40px">
    	<td width="30%">
            <table width="80%" height="50px" border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
				<tr><td colspan="2">Selecione o Tipo do Relatório:</td></tr>
                <tr><td >
								<INPUT class="Input" TYPE=radio NAME="agrup2" value="1" 

            						onClick="seta_opcao(this)">  Pagamentos
                    </td>
                    <td>
								<INPUT class="Input" TYPE=radio NAME="agrup2" value="2" 

        								checked="checked"

            						onClick="seta_opcao(this)">  Ações de Perdas
                    </td>
                </tr>
            </table>
    	</td>
        <td width="70%" >
        <div id="acoes_tab" >
        	<table width="100%" border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
            	<tr height="40px">
                    <td width="15%" style="text-align:center; vertical-align:middle">
                        <div id="filtro_btn" style="display:block" >
                            <table border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
                                <tr height="15px">
                                    <td width="80px" style="text-align:center; background-color:#558ED5; color:#FFF;" onClick="mostra_opcao('F')" >
                                        <a href="#" style="color:#FFF;">Mostra Filtro</a></td>
                                </tr>
                            </table>
                        </div>
                        <div id="atalho_btn" style="display:none" >
                            <table border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
                                <tr height="15px">
                                    <td width="80px" style="text-align:center; background-color:#558ED5; color:#FFF;" onClick="mostra_opcao('A')" >
                                        <a href="#" style="color:#FFF;">Mostra Atalhos</a></td>
                                </tr>
                            </table>
                        </div>
                    </td>
                    <td width="85%">
                    <div id="atalho_opt" style="display:block" >
                        <table width="90%" height="50px" border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
                            <tr><td colspan="3">Selecione o Nível do Detalhamento:</td></tr>
                            <tr>
                                <td width="20%" style="text-align:center">UN: 
                                    <select class='selec' id='sel_UN' name='sel_UN' onChange="monta_pagina('UN')" >
                                        <option value=''> </option>

                                            <option value='MA' >MA</option>

                                            <option value='MC' >MC</option>
                                            (以下、optionの繰り返し)

                                    </select>
                                </td>
                                <td width="40%" style="text-align:center">Contrato: 
                                    <select class='selec' id='sel_IC' name='sel_IC' onChange="monta_pagina('IC')" >
                                        <option value=''> </option>

                                            <option value='44933/12-01-00' >MC - 44933/12-01-00</option>

                                            <option value='45025/12-08-00' >MC - 45025/12-08-00</option>

                                            (以下、optionの繰り返し)
                                    </select>
                                </td>
                                <td width="40%" style="text-align:center">Município: 
                                    <select class='selec' id='sel_Mun' name='sel_Mun' onChange="monta_pagina('Mun')" >
                                        <option value=''> </option>

                                            <option value='ÁGUAS DA PRATA' >ÁGUAS DA PRATA</option>

                                            <option value='ÁGUAS DE SANTA BÁRBARA' >ÁGUAS DE SANTA BÁRBARA</option>

                                            (以下、optionの繰り返し)

                                    </select>
                                </td>
                            </tr>
                        </table>
                    </div>
                    <div id="filtro_opt" style="display:none" >
	                    <table width="100%" align="center" border="1" cellpadding="0" cellspacing="0" id="barra">
                        <tr height="45px">
                            <td width="18%" style="text-align:center ">Diretoria: 
                                <select class='selec' id='sel_Dir' name='sel_Dir' onChange="refresh(this);" >
                                    <option value=''> </option>
                                    <option value='M' >M</option>
                                    <option value='R' >R</option>
                                </select>
                            </td>

                                <td width="18%" style="text-align:center">UN: 
                                    <input class="inp_d" id='sel_UN' type="text" value="" size="5"></td>

                                <td width="18%" style="text-align:center">Contrato: 
                                    <input class="inp_d" id='sel_IC' type="text" value="" size="5"></td>

                                <td width="18%" style="text-align:center">UGR: 
                                    <input class="inp_d" id='sel_UGR' type="text" value="" size="5"></td>

                                <td width="18%" style="text-align:center">Polo: 
                                    <input class="inp_d" id='sel_Mun' type="text" value="" size="5">
                                    <input id='sel_Polo' type="hidden" value="" size="5"></td>

                            <td width="10%" style="text-align:center; vertical-align:middle">
                                <table border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
                                    <tr height="15px">
                                        <td width="100px" style="text-align:center; background-color:#558ED5; color:#FFF;" onClick="monta_empresa()" >
                                        	<a href="#" style="color:#FFF;">Executa</a></td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </table>
                    </div>
                    </td>
                </tr>
            </table>
        </div>
        <div id="pagto_tab" style="display:none" >
            <table width="50%" height="50px" border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
				<tr><td colspan="2">Selecione a opção desejada:</td></tr>
                <tr><td >
								<INPUT class="Input" TYPE=radio NAME="agrup3" value="1" checked="checked"
            						onClick="seta_opcao(this)">  Lista Pagamentos
                    </td>
                    <td>
								<INPUT class="Input" TYPE=radio NAME="agrup3" value="2" 
            						onClick="seta_opcao(this)">  Lista PPs
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>
</div>
<script language="javascript" >
	if('X'=='S'){
		document.getElementById("conteudo").style.display = "none";
		parent.document.getElementsByTagName('frameset').item(0).rows="230,*,30";
		parent.document.getElementsByTagName('frameset').item(1).rows="100,80,50";
		parent.frames("hdrFrame").document.getElementById("aguarde").style.display = "block";
		parent.frames("mainFrame").document.location.href = ('../financeiro/financeiro.asp?Opcao=&Opt1=financeiro&Opt2=acoes');
	}
</script>
</body>
</html>
(サンパウロ) 2015/02/11(水) 20:02

 >「実行時間のエラー'-2147024891(80070005)' アクセスが拒否」というエラーになります。

 このエラー、ちょっと気になりますね。

 「昨日」までIEのFrame関係でバグを出していたKB3025309の更新プログラムのセイかも知れません。
  同じようなエラーメッセージを出していましたので。

 ただ、2箇月経ってようやく今日、定例UPDATEが出て修正されています(By KB 3021952)

 取りあえず、WindowsのUPDATEを完全に済ませてください。
 話はそれからになると思います。

(半平太) 2015/02/11(水) 20:31


半平太さま
返信ありがとうございます。更新プログラムがちょうど出たのですか。タイムリーですね。
ただ対象サイトにアクセスするパソコン(ポルトガル語環境)では、まだWindowsUpdateの更新版が出てきていないようです。
言語環境によってアップデートのタイミングが異なるのかは知らないのですが、ひとまずアップデートを待って様子を見たいと思います。
皆様、様々な情報、本当にありがとうございます。
(サンパウロ) 2015/02/12(木) 06:52

 >言語環境によってアップデートのタイミングが異なるのかは知らないのですが、
 私も知らないですが、日本でも(時差もあるので)アメリカより1日は遅いのかなと思ったことはあります。

 ただ、1日ぐらいならいいんでしょうが、長くなるようなら、支障をきたしますので、
 強制的にKB3025390をアンインストールしてテストを先に進めた方がいいと思います。

 私は2か月間それでしのいでいました。セキュリティには影響しません。

 ただし、そのプログラムも、その前にあったプログラムバグ(※)の修正プログラムなので
 別のところで不具合が出るかもしれません。

 ・・・けど、「いわれなきアクセス拒否」はクリアできます。

 (※)「IEのダイアログで入力データが反映されない」とかだったと思いますが
     私は影響を受けませんでした。

(半平太) 2015/02/12(木) 09:57


Windows Updateを待っている間にカーニバル休暇もあり、しばらく空いてしまいました。
本日Windows Updateに「KB 3021952」が出ていました。
早速アップデートをして試したところ、現在のコード(2015/02/11(水) 19:55投稿)で無事にプルダウン(セレクトボックス)を選択できました!やはりIEの更新プログラムの影響があったようです。
ご回答いただいた半平太さま、Mookさま、アドバイスありがとうございました。

ひとまずやりたい作業の第一段階であるIEのプルダウンの選択はクリアできました。

次の段階ですが、プルダウン選択後に表示される緑色の「Exporta」ボタン(リンク?)をクリックして、エキスポートをする必要があります。

ソースを見てみると下記のようになっており、リンクのようになっているのですが、どのようにすればエキスポートをクリックできるでしょうか?

<該当部分のソース>

    	<tr>
        	<td colspan="6" class="bg000"><p class="ln">Municipio - ÁGUAS DA PRATA</p></td>
            <td class="bg000" colspan="2" style="vertical-align:middle">
                <table border="1" align="center" cellpadding="0" cellspacing="0" id="barra">
                    <tr height="15px">
                        <td width="100px" style="text-align:center; background-color:#00C840; color:#FFF;" onClick="exp_excel()" >
                            <a href="#" style="color:#FFF;">Exporta</a></td>
                    </tr>
(サンパウロ) 2015/02/20(金) 23:55

 まったく検証していない無責任なコメントですが、
http://www.ken3.org/vba/backno/vba170.html
http://d.hatena.ne.jp/ken3memo/20110626/1309072974
 を参照すれば、

 objFRAME("menuFrame").Document.Script.setTimeout "javascript:exp_excel();", 1000
 のような形で動かないでしょうか。

 腰高だなぁ・・・。

(Mook) 2015/02/21(土) 00:50


Mookさま

早速のご返信ありがとうございます。
また各サイトを参照してまでアドバイスをしていただき、大変ありがたいです。

結果的に言うと上記では動かなかった(エラーにもならず何も起きなかった)のですが、
エキスポートのリンクが別フレームにあることに気が付きまして、フレーム名のmenuFrameをmainFrameに変えただけでエキスポートが開始しました。

objFRAME("mainFrame").document.Script.setTimeout "javascript:exp_excel();", 1000

本当にありがとうございました!

すぐに今度はファイルのダウンロードボタンのクリックというまたかなり難しいらしい問題に直面していますが、ひとまず下記サイトを参照に進めてみたいと思います。
http://okwave.jp/qa/q8035721.html
(サンパウロ) 2015/02/21(土) 02:50


こんにちは。
ファイルのダウンロードボタンのクリックという課題が最後の大きな壁となっております。
下の写真にあるようにエキスポート選択後、自動的に
「ファイルを開くか保存しますか?」
「開く」「保存」「キャンセル」というメッセージが出ます。


この保存ボタンをクリックしたいのですが、ネットで検索する限り、非常に難しいようです。
下記のサイトで同様の質問があり、コード全体の回答がありますが、とても難解であるため、どのように自分の事例に応用できるのかわかりません。
http://okwave.jp/qa/q8035721.html
試しにそのまま貼り付けてみましたが、まずは単純なところで、Sub FileDownLoad_Proc()の前の部分が赤く表示され、その他の部分でもところどころで行が赤く表示されます。

どなかか上記サイトの回答にあるコードの取り扱い方(つまり応用の仕方)がわかる方がいたら教えていただけないでしょうか?
宜しくお願いいたします。
(サンパウロ) 2015/03/07(土) 05:53


 VBA は VB や VB.net のサブセット的な下位のものなので、いろいろと使えないものが
 あります。

 Delegate や IntPtr などは VBA にはないものなので、このあたりは VBA をキーワードに
 含めて検索して置き換えれば、ある程度は流用できると思います。

 やっていることは、対象のウィンドウ、ボタン等を検索してクリックする処理なので、
 応用できるとは思いますが。

 例えば API の AccessibleObjectFromWindow は
https://social.msdn.microsoft.com/Forums/office/en-US/e3e99712-01a7-483e-bf0e-52bb1f94889c/how-to-use-accessibleobjectfromwindow-api-in-vba-to-get-excel-application-object-from-excel?forum=exceldev
 といったところを参考にできると思います。

(Mook) 2015/03/07(土) 23:03


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.