Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


32455 / 76734 ←次へ | 前へ→

【49515】IEで新しく開いたWindowを制御する
質問  ハチ  - 07/6/8(金) 14:04 -

引用なし
パスワード
   InternetExplorerで新しく開いたWindowを制御するのに
良い案があれば教えてください。

長いですので、お時間のある方お付き合い頂ければと思います。
週末は家族サービスでレスを確認できません・・・
先にお詫び致します。

いろいろなサイトを参考にして2案作ってみたのですが、
なんとなく迂遠な処理のような気がしています。
リンク元の親Windowを参照するプロパティがあるのでしょうか?

例では、新しいWindowのタイトル名が一定となっていますが、
実際はSessionIDのようなタイトル名になっており案1ではできません。
タイトル名以外のプロパティでも常に一定になっているモノが確認できませんでした。

案2だと動作はするのですが、なんだか無駄な処理をたくさんしている気がしてます。
Collectionを使用しているのは、親Windowから複数の子Windowに対応する為です。

'(案1)
'参照設定なし
'標準モジュール
Sub IE_Test1()
  Dim objIE As Object '親IEオブジェクト
  Dim objTgt As Object  'Targetのオブジェクト(IE)
  Dim Elt As Object  'Loop用
  Dim StrURL As String  'URL

  ''禁止語句に引っかかるのでこちらのTopページのアドレスを入れてください
  StrURL = "XXXX://www.vbalab.net/" 
  Set objIE = CreateObject("InternetExplorer.application")
  
  With objIE
    .Navigate StrURL
    .Visible = True
    
    '5秒待つ
    Application.Wait Now + TimeSerial(0, 0, 5)
    DoEvents

    '読み込み終了を待つ
    Do While .Busy = True
      DoEvents
    Loop
    '念のため、もう1回 DoEvents
    DoEvents
    
    '入力するInputBoxを探す
    With .Document
      For Each Elt In .all
        If TypeName(Elt) = "HTMLInputElement" Then
          If Elt.Name = "txtSearch" Then
            Elt.Value = "VBA"
          End If
        End If
      Next Elt
      'Formを送信
      .Forms(0).Submit
    End With
  End With
  
  '5秒待つ
  Application.Wait Now + TimeSerial(0, 0, 5)
  
  DoEvents
  
  '#ここで新しく開いたWindowをつかみたい。
  '#開かれるWindowのタイトルが一定なら
  '#Shell.Applicationでできる。
  
  Set objTgt = Ie_Get("モーグ - テキスト検索")
  If Not objTgt Is Nothing Then
    'つかめていたら左上に移動してみる
    objTgt.Left = 1
    objTgt.Top = 1
  Else
    MsgBox "Targetを取得できませんでした"
  End If
  
  MsgBox "終了"
  
  Set objIE = Nothing
  Set objTgt = Nothing
  
End Sub

Function Ie_Get(ByVal Doc_Title)
  Dim objShl As Object  'Shell.Application
  Dim objWin As Object  'Loop用
  
  'Shellオブジェクト生成
  Set objShl = CreateObject("Shell.Application")
  
  'WindowをLoop
  For Each objWin In objShl.Windows
     If TypeName(objWin.Document) = "HTMLDocument" Then
      If objWin.Document.Title = Doc_Title Then Exit For
     End If
  Next
  Set Ie_Get = objWin
  
  Set objShl = Nothing
  Set objWin = Nothing

End Function
'(案1)End


'(案2)
'参照設定MicroSoft Internet Controls
'
'#Class1モジュール'
Option Explicit

Private WithEvents m_IE As InternetExplorer
Private m_Coll As Collection  '子Window用のCollection

Private Sub Class_Initialize()
  Set m_IE = New InternetExplorer
  m_IE.Visible = True
  
  Set m_Coll = New Collection
End Sub
'm_IEをナビゲートするメソッド
Public Sub Navigate(StrURL As String)
  With m_IE
    .Navigate StrURL
    '読み込み終了を待つ
    Do While .Busy = True
      DoEvents
    Loop
    '念のため、もう1回 DoEvents
    DoEvents
  End With
End Sub
'm_IE.Documentを参照するプロパティ
Public Property Get Document()
   Set Document = m_IE.Document
End Property

'コレクションをカウントするプロパティ
Public Property Get Count()
   Count = m_Coll.Count
End Property

'コレクションItem(子Window)を参照するプロパティ
Public Property Get Wins(ByVal Index As Integer)
   Set Wins = m_Coll(Index)
End Property

''イベント処理

'新しいWindowを開く前に発生するイベント
'Objectをすりかえて(?)Collectionに追加
'そのままppDispをSetするとNothingになる
Private Sub m_IE_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Dim NewIE As InternetExplorer
  
  Set NewIE = New InternetExplorer
  Set ppDisp = NewIE
  NewIE.Visible = True
  m_Coll.Add Item:=NewIE
End Sub

'#Class1モジュールEnd'


'#標準モジュール'
Option Explicit

Sub IE_Test2()
  Dim Cl_IE As Class1 '親IEオブジェクト(Class1)
  Dim objTgt As Object  'Targetのオブジェクト(IE)
  Dim Elt As Object  'Loop用
  Dim StrURL As String  'URL
  
  ''禁止語句に引っかかるのでこちらのTopページのアドレスを入れてください
  StrURL = "XXXX://www.vbalab.net/" 
  Set Cl_IE = New Class1
  
  With Cl_IE
    .Navigate StrURL
    
    '5秒待つ
    Application.Wait Now + TimeSerial(0, 0, 5)
    DoEvents
    
    '入力するInputBoxを探す
    With .Document
      For Each Elt In .all
        If TypeName(Elt) = "HTMLInputElement" Then
          If Elt.Name = "txtSearch" Then
            Elt.Value = "VBA"
          End If
        End If
      Next Elt
      'Formを送信
      .Forms(0).Submit
    End With
  End With
  
  '5秒待つ
  Application.Wait Now + TimeSerial(0, 0, 5)
  DoEvents

  Set objTgt = Cl_IE.Wins(1)

  If Not objTgt Is Nothing Then
    'つかめていたら左上に移動してみる
    objTgt.Left = 1
    objTgt.Top = 1
  Else
    MsgBox "Targetを取得できませんでした"
  End If
  
  MsgBox "終了"
  
  Set Cl_IE = Nothing
  Set objTgt = Nothing
  
End Sub

4 hits

【49515】IEで新しく開いたWindowを制御する ハチ 07/6/8(金) 14:04 質問
【49518】Re:IEで新しく開いたWindowを制御する neptune 07/6/8(金) 15:38 発言
【49532】Re:IEで新しく開いたWindowを制御する ハチ 07/6/8(金) 18:09 お礼
【49538】Re:IEで新しく開いたWindowを制御する neptune 07/6/9(土) 14:55 回答
【49544】Re:IEで新しく開いたWindowを制御する neptune 07/6/10(日) 10:19 発言
【49562】Re:IEで新しく開いたWindowを制御する ハチ 07/6/11(月) 13:14 お礼
【49563】Re:IEで新しく開いたWindowを制御する neptune 07/6/11(月) 15:06 発言
【49569】Re:IEで新しく開いたWindowを制御する ハチ 07/6/11(月) 16:46 お礼
【49578】Re:IEで新しく開いたWindowを制御する neptune 07/6/11(月) 21:55 発言
【49586】Re:IEで新しく開いたWindowを制御する ハチ 07/6/12(火) 9:29 発言
【49592】WebBrowserコントロールもやってみました ハチ 07/6/12(火) 11:23 発言
【49600】Re:WebBrowserコントロールもやってみました neptune 07/6/12(火) 14:08 発言

32455 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free