質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2549閲覧

VBAでIE操作 ー GetElementByTagName("a")でa要素の取得ができるサイトとできないサイトがある

koyamashinji

総合スコア45

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/04 00:01

<VBAでIE操作 ー GetElementByTagName("a")でa要素の取得ができるサイトとできないサイトがある>

VBA超初心者です。

下記コードにて、社内イントラサイトのHTMLの
<aタグ>の数をイミディエイトウインドウに出力
させようとしています。

下記2つのサイトで検証したのですが、
サイトURL①については問題なく出力されますが、
サイトURL②で試した場合、a要素があるにもかかわらず
”0”と出力され、情報が取得できません。
考えられる原因は何でしょうか。

サイトURL①・・・社内システムへのログイン画面
サイトURL②・・・社内のディレクトリ情報(個人情報)を掲載しているページ

参考として、両サイトのHTMLのa要素の1例を下記に記載します。

②は、セキュリティ上、HTMLが取得できない制限のようなものが
かけられている可能性はありますでしょうか...

###VBA

Sub GetATagTest() Dim ie As InternetExplorer Dim HTMLDoc As HTMLDocument Set ie = New InternetExplorerMedium ie.Visible = True ie.navigate "社内イントラサイトURL" Do While ie.Busy = True Or ie.readyState <> READYSTATE_COMPLETE DoEvents Loop Set HTMLDoc = ie.document Debug.Print HTMLDoc.getElementsByTagName("a").Length End Sub

サイトURL①のa要素 1例

<td> <a href=".....">....</a> </td>

サイトURL②のa要素 1例

<div class="collapsible-body" style="display: block;"> <a class="..." href="..." target="..." data-tooltip="..." data-tooltip-id="...">...</a> </div>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

②は、セキュリティ上、HTMLが取得できない制限のようなものが

かけられている可能性はありますでしょうか...

「(個人情報)を掲載しているページ」とのことなの、その可能性はあります。
社内イントラサイトなら、システム担当者に問い合わせることになるでしょう。

あと、考えらる原因としては、個人情報はデータベースから、スクリプトで動的に呼び出してHTMLを出力している可能性があります。
その場合は、API のSleep関数で適当な時間(読み込み/出力が終わるまで)待機させるようにしてみてはどうでしょうか。

コード例

vba

1Set HTMLDoc = ie.document 2 3Dim i As Long, aTag 4For i = 1 to 20 5 Sleep 200 '0.2秒待機 6 Set aTag = HTMLDoc.getElementsByTagName("a") 7 If aTag.Length > 0 Then Exit For 8Next 9 10If aTag.Length = 0 Then 11 Msgbox "リンクは見つかりませんでした。" 12Else 13 Debug.Print aTag.Length 14End If

投稿2020/06/04 01:22

編集2020/06/04 01:32
hatena19

総合スコア33795

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koyamashinji

2020/06/04 02:01

ご回答ありがとうございます。 ご提示頂いた例を参考に、下記コードにて実行したところ、やはり"見つかりませんでした”と出力されてしまいました。 APIを使用するためのdeclareステートメントも記述しましたが、Sleep関数の呼び出し方法が間違っているのでしょうか、、、 「スクリプトで動的に呼び出してHTMLを出力している」というのは初めて知りました。 当該サイトのHTMLを改めて確認すると、<!-- Import jQuery before materialize.js -->というコメントが入っており、こちらの記述は何か関係しているのでしょうか。 ``` Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Dim i As Long, aTag As IHTMElementCollection For i = 1 To 20 Sleep 200 Set aTag = HTMLDoc.getElementByTagName("a") if aTag.Length > 0 Then Exit for End if Next i If aTag.Length = 0 Then Debug.Print "見つかりませんでした” Else Debug.Print aTag.Length End If ```
hatena19

2020/06/04 03:27

コード的には問題ないと思います。 エラーとか出てませんか。 他に考えられる原因としては、フレームを使っていて、子ウィンドウの方にaリンクがあるとか、、、 どちらにしても、自分としてはこれ以上のアドバイスは難しいです。 セキュリティ上簡単に取得できないようにしている可能性もありますので。 やはり、システム担当に問い合わせるのが本筋ではないでしょうか。
koyamashinji

2020/06/04 03:53 編集

>他に考えられる原因としては、フレームを使っていて、子ウィンドウの方にaリンクがあるとか、、、 おっしゃる通り、HTMLを確認すると下記のように、フレームが使用されているようです... フレームを使用している場合は、aタグの取得方法が異なるのでしょうか。 取得しようとしているaタグは■の部分です。 <frameset> <frame name = "..." src = "..." scrolling="..."> <html> <head></head> <body> <form> <div class ="..."> <ul class="..."> <li class = "..."> <a class ="...", href="...".....>...</a>■ </li> </ul> </div> </form> <script src = "..." type ="text/javascript"></script> </body> </frameset> コメント蘭ではマークダウン記法が効かず、読みにくくすみません。
hatena19

2020/06/04 04:03

frame の src のURLで直接フレームのページが開くなら、そのURLでアクセスすればいいでしょう。 ダメな場合は、「framesオブジェクト」を使ってアクセスします。 「VBA スクレイピング フレーム」をキーワードに検索すれば参考リンクが見つかるので研究してみてください。
koyamashinji

2020/06/04 04:33

ありがとうございます! もっと勉強してみます。
guest

0

社内システムのページならログインしていないと正常に閲覧できないんじゃないでしょうか。
(新しくウィンドウを開いたら未ログイン状態になるのでは)
一度documentの中身のhtmlをprintしてみると分かるかもしれません。

投稿2020/06/04 00:16

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問