Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : その他)
現在表示されているIEのURLを取得する方法
投稿日時: 20/05/28 02:28:56
投稿者: Alice87

Microsoft Excel for Office 365を使用しています。
 
IEでリンクをクリックした後に表示された画面のURLを取得したいと考えています。
 
複数のwebサイトを参考に下記のように作成しましたが、URL取得用に作成した変数:anotherに結果が何も返ってきません。
どのように修正すれば良いのか分からず、こちらに書き込みをしました。
 
アドバイスをいただけると幸いです。宜しくお願い致します。
 
sub test()
 
Dim objIE, objIE2 As Object
 
Set objIE2 = New InternetExplorer
 
-----途中割愛-----
            For Each anchor In objIE.document.getElementsByTagName("SPAN")
             
                If InStr(anchor.innerText, y & "年" & m & "月" & 27) > 0 Then
                    anchor.Click
                    another = objIE2.LocationURL ←ここでクリック後のアクティブ状態のURLを取りたい
                     
                    Sleep 5000
                    Exit For
       
                End If
                

回答
投稿日時: 20/05/29 07:00:32
投稿者: simple

コメントがつきませんねえ。
 
そもそもの話で恐縮ですが、
(1)
そのリンクは別のIEに跳ぶような仕組みのリンクなんですか?
(target指定はどうなっているんですか?)
 
(2)
こうしたWebがらみの質問は、個々のWEBの作り方はさまざまなので、
URLが提示されていれば、回答者側もトライできて、コメントも付きやすいです。
URLを示すことは難しいですか?
(もちろん、イントラネットなんかだとアクセスできないので意味がないですが)
 
ちなみに、こんなコードが、
クリックしたあとの状況を確認するのに役立つかもしれません。

Sub sample()
    Dim objShell  As Object
    Dim objWin As Object
    Set objShell = CreateObject("Shell.Application")
    
    For Each objWin In objShell.Windows
        If objWin.Name = "Internet Explorer" Then
            Debug.Print objWin.LocationURL
        End If
    Next
End Sub

また、別方法ですが、
anchorというエレメントのchildエレメントなどにURLが書かれていないのですか?
こちらからアプローチする方法もあるのでは?

投稿日時: 20/05/29 19:29:28
投稿者: Alice87

simple様
 
早速のアドバイス、ありがとうございます。
下記サイトの「公表相場一覧」をクリックした後に表示されるPDFを閉じたいと思っています。
 
https://www.smbc.co.jp/market/index.html
 
表示されるpdfのURLに規則性があるように見受けられますが。規則性が変わった時のことを考慮してsimple様が書いて下さったコードから、「https://www.smbc.co.jp/market/pdf」を含む時に該当のURLを変数に入れようと考えました。
 
そこで、下記のようにしたのですが「オブジェクト変数またはWithブロック変数が宣言されていません」MSGが表示されてしまいました。
 
Excel VBAからIE操作する基本を理解しないまま、Webでキーワード検索をしながら作っているので、くだらない誤りをしていると思うのですが、修正方法のアドバイスもいただけると幸いです。
 
何卒宜しくお願い致します。
 
Dim objIE2 As Object
〜〜割愛〜〜
 
'現在開いているURLを取得する
For Each objWin In objShell.Windows
                         
If objWin.Name = "Internet Explorer" Then
                                 
 If InStr(objWin.LocationURL, "https://www.smbc.co.jp/market/pdf")> 0 Then
    objIE2 = objWin.LocationURL
    Exit For
 End If
 
End If
 
Next
                                 
  

回答
投稿日時: 20/05/29 20:52:01
投稿者: simple

つまるところ、そのPDFファイルを取得したい、という理解でよいですか。
申し訳ないですが、貴兄の方針に沿ったものは書けませんでした。
 
以下に、自己流のものを示します。参考になれば幸いです。
 
方針としては、特定のClassで抽出しました。(4つあり、その最初のものが対象でした)
 
ローカルファイルへのダウンロードは、WindowsAPIを使用しました。
このほかにも勿論方法はあります。以下のサイトが参考になります。
[VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。]
https://www.ka-net.org/blog/?p=4855
 

Option Explicit
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
  (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
   ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub test()
    ''Microsoft Internet Controlsを参照設定のこと
    Dim objIE   As Object     '型の指定はサボリました。
    Dim tagObj  As Object
    Dim e       As Object
    Dim url     As String
    
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True

    objIE.Navigate "https://www.smbc.co.jp/market/index.html"

    '処理終了待ち
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
        DoEvents
    Wend
    
    Set tagObj = objIE.Document.getElementsByClassname("glyphPdf01")
    For Each e In tagObj
            url = e.href
            Exit For
    Next
    
    'PDFファイルをローカルファイルに保存
    Call getPDFFile(url, Right(url, 12))
    
    objIE.Quit
End Sub

Sub getPDFFile(url As String, filename As String)
    Const folder = "D:\MyDocuments\202005\"     '■要修正のこと
    filename = folder & filename
    URLDownloadToFile 0, url, filename, 0, 0
End Sub

(Win7,Excel2010,IE11 で動作確認しました。64ビットのExcelの場合はAPIに修正が必要です。)

回答
投稿日時: 20/06/01 16:24:18
投稿者: simple

ご返事がないのが残念ですね。
 
Set objIE2 = New InternetExplorer
と新たなIEを作成しても、
PDF表示画面はそこに展開はされるわけではありません。
単に別タブに表示されるだけです。
 
それをやめたうえで、
クリックした後(時間を調整して)、
以下のコードを実行すれば、PDF画面は閉じられます。(objShellはコメント済みのもの)
 

For Each objWin In objShell.Windows
    If objWin.Name = "Internet Explorer" Then
        ・objWin.LocationURLが ""でも、元のURL(固定)でもないものが、
          新しく表示したもの。
        ・それに対して
             objWin.ExecWB OLECMDID_CLOSE, 0  
          を実行すれば閉じられます。
    End If
Next

もっとも、上記は、くだんの銀行のサイトしか開いていない前提です。
別のものも開いているなら、やはりurlを求めて(既に提示しました)、
それと同じものを閉じればよいと思います。
 
# 読んだあとで閉じたいだけなら、手で×印をクリックするのが最善手ではないですか?

投稿日時: 20/06/02 17:00:22
投稿者: Alice87

simple様
 
度々のアドバイスありがとうございます。
返信をし「解決済み」にしていましたが、再びこちらのサイトを見たところ反映されていなかったので、どのように対処したか記載致します。
 
5/29に投稿して下さったコードを試してみました。
表示されるPDFは保存する必要はなかったので、記載されていた「objIE.Quit」で最初に開いた画面・リンクをクリックした後に表示される画面(別タブで表示)が閉じられるかを中心に見ましたが、最初に開いた画面しか閉じられなかった為、別のサイトで解決策を探しました。
 
下記サイトを元に閉じることができましたが、対象となるobjIEを閉じ切ってしまうと、対象物がない為エラー91が表示されるので、「On error go to」で次の処理へ飛ばすことを考えています。
 
https://ken3memo.hatenablog.com/entry/20090912/1252685423