Excel VBA質問箱 IV

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

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


5663 / 13645 ツリー ←次へ | 前へ→

【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 発言[未読]

【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

【49518】Re:IEで新しく開いたWindowを制御する
発言  neptune  - 07/6/8(金) 15:38 -

引用なし
パスワード
   こんにちは
APIゴリゴリになるかもしれませんが、ハチさんなら問題ないと思いますので
案を書いてみます。

全くの勘で書いていますので、確認はしてません。全くのハズシなら
ごめんなさい。

>'#ここで新しく開いたWindowをつかみたい。
>  '#開かれるWindowのタイトルが一定なら
>  '#Shell.Applicationでできる。
「つかむ」をHWNDを取得することで満足できるなら、
FindWindow APIではだめなんでしょうか?
第一引数でクラス名を与え、第二引数をNULLにしたら、
1つのみのIEを開いているときはそれを取得できるはずです。

先ず、親を取得しておけば、新しく開いたら、EnumWindows等で
IEを取得すれば、親でないものが新規Windowになります。

IE内のClientWindowに対してはGetWindowや、EnumChildWindows等で
取得できると思います。

又、別案ですが、2つめのIEを開いたらGetActiveWindow等は使えないでしょうか??

【49532】Re:IEで新しく開いたWindowを制御する
お礼  ハチ  - 07/6/8(金) 18:09 -

引用なし
パスワード
   ▼neptune さん:
>こんにちは
>APIゴリゴリになるかもしれませんが、ハチさんなら問題ないと思いますので
>案を書いてみます。

実は・・・
APIぜんぜんわかりません ><

あの最初に書く(Declareステートメントでしたっけ?)が難解ですね・・・
バグらせずに制御できる自信もないです・・・

ですがneptuneさんの書かれている、
ロジックはなんとなくわかりました。
認識している以外のWindowが、新しいWindow という考え方ですね。

挙げて頂いたAPIについて、
ちょっと調べてみようと思います。
ありがとうございました。

まずはお礼まで。

【49538】Re:IEで新しく開いたWindowを制御する
回答  neptune  - 07/6/9(土) 14:55 -

引用なし
パスワード
   ▼ハチ さん:
>APIぜんぜんわかりません ><
>
>あの最初に書く(Declareステートメントでしたっけ?)が難解ですね・・・
>バグらせずに制御できる自信もないです・・・
これ読んだんで、サンプル書きました。
一応問題なく動きました。XP SP2 + Office2K
※Excel97では使用できません。

サンプルは1個目と2個目のIEのHWNDを取得するだけのものですが、
「'1個目のIEのHWND保存用」の変数を配列にでもして、EnumFuncでの
比較時、複数のHWNDと比較してやれば、まだ取得してないIEのHWNDが
取得でき、何個でも対応可能です。

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
          (ByVal lpClassName As String, _
          ByVal lpWindowName As String) As Long

Private Declare Function EnumWindows Lib "user32" _
          (ByVal lpEnumFunc As Long, ByVal lparam As Long) As Long
          
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
          (ByVal hwnd As Long, _
          ByVal lpClassName As String, _
          ByVal nMaxCount As Long) As Long
                    

Private Const IEClassName As String = "IEFrame"   'IEのClass名
Private Const XLClassName As String = "XLMAIN"   'XL2000
Private Const MAX_PATH As Long = 255

Private FirstIE As Long   '1個目のIEのHWND保存用
Private OtherIE As Long   '戻り値用変数

'1個目のHWND取得のみ
Sub test_FindWindow()
  FirstIE = FindWindow(IEClassName, vbNullString)
  Debug.Print "1個目: " & FirstIE
End Sub

'2個目のHWND取得のみ
Sub test_FindWindow2()
  Debug.Print "2個目: " & FindIE(FirstIE)
End Sub

Function FindIE(phWnd As Long) As Long
Dim handle As Long
Dim ret As Boolean
Dim sTitle As String

  handle = FindWindow(XLClassName, Application.Caption)
  OtherIE = -1  '戻り値用変数の初期化
  
  ret = EnumWindows(AddressOf EnumFunc, phWnd)
  '取得できたら
  If ret = False And OtherIE > 0 Then
    FindIE = OtherIE
  End If

End Function

Private Function EnumFunc(ByVal hwnd As Long, _
          ByVal lparam As Long) As Boolean
Dim sClassName As String * MAX_PATH
Dim sbuf As String

  EnumFunc = True
  
  GetClassName hwnd, sClassName, MAX_PATH
  sbuf = Left(sClassName, InStr(1, sClassName, Chr(0)) - 1)
  If sbuf = IEClassName Then
    If hwnd <> lparam Then
      OtherIE = hwnd
      EnumFunc = False
    End If
  End If
End Function

ごゆっくりどうぞ^ ^

【49544】Re:IEで新しく開いたWindowを制御する
発言  neptune  - 07/6/10(日) 10:19 -

引用なし
パスワード
   こんにちは

>'#ここで新しく開いたWindowをつかみたい。
>  '#開かれるWindowのタイトルが一定なら
>  '#Shell.Applicationでできる。
のしたのソースも見てみました。(いままで見ていませんでした。m(_ _))

Windowを移動させるにはMoveWindowが使用できます。
以下宣言
Private Declare Function MoveWindow Lib "user32" _
  (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, _
  ByVal nWidth As Long, ByVal nHeight As Long, _
  ByVal bRepaint As Long) As Long

注意:各数値の単位はpixelです。

以下MSDNより引数部分引用/////////////
hWnd
ウィンドウのハンドルを指定します。
X
ウィンドウの左端の新しい位置を指定します。
Y
ウィンドウの上端の新しい位置を指定します。
nWidth
ウィンドウの新しい幅を指定します。
nHeight
ウィンドウの新しい高さを指定します。
bRepaint
ウィンドウを再描画するかどうかを指定します。TRUE を指定すると、ウィンドウ
に WM_PAINT メッセージが送られます。FALSE を指定すると、
再描画は行われません。この指定は、クライアント領域、非クライアント領域
( タイトルバーとスクロールバーを含む)、および親ウィンドウの、
子ウィンドウを移動したことにより画面に現れたあらゆる部分に適用されます。

ごゆっくりどうぞ。

【49562】Re:IEで新しく開いたWindowを制御する
お礼  ハチ  - 07/6/11(月) 13:14 -

引用なし
パスワード
   ▼neptune さん:
サンプルコードまで書いて頂いて、ありがとうございます。

最初の書かれていました
>「つかむ」をHWNDを取得することで満足できるなら、
>FindWindow APIではだめなんでしょうか?

この意味がわかっていなかったようです・・・
例では子Windowを移動させていますが、(余計な手間をかけてすいません)
実際は子WindowのinnerText(もしくはソース)を引っ張って
データ取得しようしていました。
hwndからオブジェクトを取得するには、またまたAPIでやる必要がありそうですね。

提示して頂いたサンプルコードを調べていたのですが、
「AddressOf」演算子あたりで脳ミソから煙が出ました。
アドレスのポインタって・・C言語っぽい・・・

neptuneさんのコードはとりあえずBlackBoxとして・・・
下記のコードで子Windowを移動させることができました。
理解できないコードを使うのは怖いので、もうちょっとレベル上げに励みます。


Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
          (ByVal lpClassName As String, _
          ByVal lpWindowName As String) As Long

Private Declare Function EnumWindows Lib "user32" _
          (ByVal lpEnumFunc As Long, ByVal lparam As Long) As Long
     
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
          (ByVal hwnd As Long, _
          ByVal lpClassName As String, _
          ByVal nMaxCount As Long) As Long
          
Private Declare Function MoveWindow Lib "user32" _
          (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, _
          ByVal nWidth As Long, ByVal nHeight As Long, _
          ByVal bRepaint As Long) As Long
  

Private Const IEClassName As String = "IEFrame"   'IEのClass名
Private Const XLClassName As String = "XLMAIN"   'XL2000
Private Const MAX_PATH As Long = 255

Private FirstIE As Long   '1個目のIEのHWND保存用
Private OtherIE As Long   '戻り値用変数

Function FindIE(phWnd As Long) As Long
Dim handle As Long
Dim ret As Boolean
Dim sTitle As String

  handle = FindWindow(XLClassName, Application.Caption)
  OtherIE = -1  '戻り値用変数の初期化
 
  ret = EnumWindows(AddressOf EnumFunc, phWnd)
  '取得できたら
  If ret = False And OtherIE > 0 Then
    FindIE = OtherIE
  End If

End Function

Private Function EnumFunc(ByVal hwnd As Long, _
          ByVal lparam As Long) As Boolean
Dim sClassName As String * MAX_PATH
Dim sbuf As String

  EnumFunc = True
 
  GetClassName hwnd, sClassName, MAX_PATH
  sbuf = Left(sClassName, InStr(1, sClassName, Chr(0)) - 1)
  If sbuf = IEClassName Then
    If hwnd <> lparam Then
      OtherIE = hwnd
      EnumFunc = False
    End If
  End If
End Function

'−−−−ここまでが頂いたサンプル(Test_Sub以外)

Sub Main()
  Dim objIE As Object
  Dim StrURL As String
  Dim Cnt As Long
  Dim Target As Long '取得したい子Windowのhwnd
  Dim Old_Win() As Long '取得済みのhwndを管理する配列
  
  Cnt = 0
  ReDim Old_Win(Cnt)
  Old_Win(Cnt) = 0
  'すでに IEを開いてないかチェック
  FirstIE = FindWindow(IEClassName, vbNullString)
  If FirstIE <> 0 Then
    MsgBox "IEがすでに開いています。全て閉じてください"
    Exit Sub
  End If
  
  ''禁止語句に引っかかるのでこちらのTopページのアドレスを入れてください
  StrURL = "XXXX://www.vbalab.net/"
  Set objIE = CreateObject("InternetExplorer.application")
  With objIE
    .Navigate StrURL
    .Visible = True
    '読み込み終了を待つ
    Do While .Busy = True
      DoEvents
    Loop
    '念のため、もう1回 DoEvents
    DoEvents
  End With
  'ここで最初のWindowを取得
  FirstIE = FindWindow(IEClassName, vbNullString)
  Debug.Print "1個目: " & FirstIE
  
  '子Window1枚目を開く
  objIE.Document.Forms(0).Submit
  '5秒待つ
  Application.Wait Now + TimeSerial(0, 0, 5)
  DoEvents
  Target = GetNewIE(FirstIE, Old_Win)
  Debug.Print "2個目: " & Target
  '左上に移動
  MoveWindow Target, 1, 1, 300, 300, True
  'TargetをOld_Winに追加
  Cnt = Cnt + 1
  ReDim Preserve Old_Win(Cnt)
  Old_Win(Cnt) = Target
    

   '子Window2枚目を開く
  objIE.Document.links(0).Click
  '5秒待つ
  Application.Wait Now + TimeSerial(0, 0, 5)
  DoEvents
  Target = GetNewIE(FirstIE, Old_Win)
  Debug.Print "3個目: " & Target
  '移動
  MoveWindow Target, 300, 1, 300, 300, True
  'TargetをOld_Winに追加
  Cnt = Cnt + 1
  ReDim Preserve Old_Win(Cnt)
  Old_Win(Cnt) = Target
  
  MsgBox "終了"
  
  Set objIE = Nothing
  Erase Old_Win
  
End Sub

Function GetNewIE(ByVal ParentIE As Long, Old_Ary As Variant) As Long
  Dim v As Variant
  Dim Lmt As Integer '無限ループの防止用リミッタ
  Do
    v = FindIE(ParentIE)
    If Lmt > 30 Then
      GetNewIE = 0: Exit Function
    Else
      Lmt = Lmt + 1
    End If
  Loop Until IsError(Application.Match(v, Old_Ary, 0))
  GetNewIE = CLng(v)
End Function

【49563】Re:IEで新しく開いたWindowを制御する
発言  neptune  - 07/6/11(月) 15:06 -

引用なし
パスワード
   ▼ハチ さん:
こんにちは

>実際は子WindowのinnerText(もしくはソース)を引っ張って
>データ取得しようしていました。
>hwndからオブジェクトを取得するには、またまたAPIでやる必要がありそうですね。
え〜っと、IE内のテキストデータなどを取得したいなら、APIでやると
恐ろしく難しいことをしなければならないような気がします。
・・・・私はやったことないです。

その目的ならですが、Microsoft Web browserコントロールというものを
ご存知でしょうか?
確かOffice2000の頃はAccessには付属していたような気がします。(未確認です)

付属していなかったら、VB2005 ExpressEdition (MSが無料で配布しているやつ)
に付属しています。

これでやると、イベントも取得できるし、objectを作らなくても良いし
結構楽チンです。私も、過去ログを収集するのにツールを作ったことあります。
・・・今はどこかに行きましたけど。

大きなお世話かもしれませんが、ハチさんなら、環境が許すなら
OfficeのWebbrowserコントロールを使用するか、VB2005をタダでGet、
インストールして、そちらでおつくりになる方が将来のためにも
宜しいんじゃないでしょうか?
多分サンプルも沢山Web上に在りそうですし。割と簡単にできると思います。
VB2005自体はVBAと全く別物なので少しなれるのに時間はかかるとは思いますが。

>提示して頂いたサンプルコードを調べていたのですが、
>「AddressOf」演算子あたりで脳ミソから煙が出ました。
ビールでもかけて消して下さい^ ^;;

この辺りのことは既にご存知でしょうが、ややこしそうな気がするところを
一応簡単に説明しておきます。

EnumFuncはenumwindows用のコールバック関数、EnumWindowsProc API関数です。
関数の名前はEnumWindowsProc とする必要はなく、
BOOL CALLBACK EnumWindowsProc(
 HWND hwnd,   // 親ウィンドウのハンドル
 LPARAM lParam  // アプリケーション定義の値
);
の構造を持っていれば、任意の名前をつけることが出来ます。

 第2引数では、任意の数値を指定できるので、今回は除外するHWNDを渡してます。
>Private Function EnumFunc(ByVal hwnd As Long, _
>          ByVal lparam As Long) As Boolean

クラス名を保存するのに十分な文字数の領域を確保しておく。
MAX_PATHは、Cでは、普通255と定義されるものなので、わかりやすいので使用してます。
>Dim sClassName As String * MAX_PATH
>Dim sbuf As String
>
>  EnumFunc = True

引数hwndのクラス名を取得します。
>  GetClassName hwnd, sClassName, MAX_PATH
取得したクラス名には有効な文字以降255文字目まではchr(0)で満たされて
いますから、不要な文字chr(0)を取り除き、判断に使用します。
>  sbuf = Left(sClassName, InStr(1, sClassName, Chr(0)) - 1)
ここは良いですね。
>  If sbuf = IEClassName Then
>    If hwnd <> lparam Then
>      OtherIE = hwnd
見つかって、目的を達成したので、これで関数を走らせるのを止める。
(戻り値をFalseにする。Trueの場合は全てのWindowを列挙し終わるまで走り続ける。)
>      EnumFunc = False
>    End If
>  End If
>End Function
>

【49569】Re:IEで新しく開いたWindowを制御する
お礼  ハチ  - 07/6/11(月) 16:46 -

引用なし
パスワード
   ▼neptune さん:
たびたび、ありがとうございます。

>その目的ならですが、Microsoft Web browserコントロールというものを
>ご存知でしょうか?
>確かOffice2000の頃はAccessには付属していたような気がします。(未確認です)
>これでやると、イベントも取得できるし、objectを作らなくても良いし
>結構楽チンです。

コントロールツーバーの"コントロールの選択"で出てきました!
Office 2kProですのでAccessに入っているようです。
これは便利そうですね!

今回は他者に配布する予定ですので
(後出し条件なって申し訳ないです;; 一番ダメな質問の仕方ですね><)
最初の案2Classでイベント制御する方法で、
もうちょっと作り込んでみようと思います。

>VB2005をタダでGet、インストールして、
>そちらでおつくりになる方が将来のためにも
>宜しいんじゃないでしょうか?

MSのサイトを見てみました。
ユーザー登録したらタダなんですね・・・知りませんでした。
そろそろVBにもチャレンジしてみようかと思ってたところでしたので、
有益な情報をありがとうございました。

>>提示して頂いたサンプルコードを調べていたのですが、
>>「AddressOf」演算子あたりで脳ミソから煙が出ました。
>ビールでもかけて消して下さい^ ^;;

詳しい説明ありがとうございます。
少し解ってきました。ウマいビールが飲めそうです。
勝利の「ビールかけ」までは行ってませんが・・・

つまり

> 第2引数では、任意の数値を指定できるので、今回は除外するHWNDを渡してます。
>>Private Function EnumFunc(ByVal hwnd As Long, _
>>          ByVal lparam As Long) As Boolean

ここの hwndを配列にして除外する値を渡してしまえば、
戻り値をMatchで再検査する必要はない と言うことですね?

APIでは、メモリ領域(上限といいますか)を意識しないと危ない と
どこかのサイトで見た記憶があります。
APIを使うときには気をつけたいと思います。

うーん・・・VBAって(すでにVBAじゃない気もしますが)奥が深い・・

【49578】Re:IEで新しく開いたWindowを制御する
発言  neptune  - 07/6/11(月) 21:55 -

引用なし
パスワード
   ▼ハチ さん:

>今回は他者に配布する予定ですので
>(後出し条件なって申し訳ないです;; 一番ダメな質問の仕方ですね><)
>最初の案2Classでイベント制御する方法で、
>もうちょっと作り込んでみようと思います。
はい、都合の良い方にしてください。

>MSのサイトを見てみました。
>ユーザー登録したらタダなんですね・・・知りませんでした。
>そろそろVBにもチャレンジしてみようかと思ってたところでしたので、
>有益な情報をありがとうございました。
ここがお勧め。私もお世話になってます。VB6、2005の情報が沢山あります。
vb6はコントロール以外はVBAと同じですから、VBAの解説としてもいいと思います。
「Visual Basic中学校」
//homepage1.nifty.com/rucio/main/main.htm

以下にちょっと誤解があるようなので追加説明
>> 第2引数では、任意の数値を指定できるので、今回は除外するHWNDを渡してます。
>>>Private Function EnumFunc(ByVal hwnd As Long, _
>>>          ByVal lparam As Long) As Boolean
>
>ここの hwndを配列にして除外する値を渡してしまえば、
>戻り値をMatchで再検査する必要はない と言うことですね?
↑これが違います。第2引数の宣言は以下ですね。
ByVal lparam As Long
ここで、Long型の値を渡すわけですから、恐らく配列はまずいです。
Windowsの方でLong型のメモリ量しか確保してないはずですから、
他のメモリ領域のデータを侵してしまう可能性があります。
(恐ろしいのでやったことないです。)
配列は渡せないと思いますので、モジュールレベルの配列変数を作成しておいて
それを使うようになると思います。

>APIでは、メモリ領域(上限といいますか)を意識しないと危ない と
>どこかのサイトで見た記憶があります。
>APIを使うときには気をつけたいと思います。
気をつけて下さい。へたするとこけますよ。
>うーん・・・VBAって(すでにVBAじゃない気もしますが)奥が深い・・
はい。細かい事を言うとC言語+Windowsプログラミングの世界に入って
しまいます。
私もいつまで立っても入門レベルでよくわかりません。^ ^;;

【49586】Re:IEで新しく開いたWindowを制御する
発言  ハチ  - 07/6/12(火) 9:29 -

引用なし
パスワード
   ▼neptune さん:

>ここがお勧め。私もお世話になってます。VB6、2005の情報が沢山あります。
>vb6はコントロール以外はVBAと同じですから、VBAの解説としてもいいと思います。
>「Visual Basic中学校」
>//homepage1.nifty.com/rucio/main/main.htm

ちょっと覗いてみました。
ブックマークして、ゆっくり見ていこうと思います。
ありがとうございます。

>Windowsの方でLong型のメモリ量しか確保してないはずですから、
>他のメモリ領域のデータを侵してしまう可能性があります。
>(恐ろしいのでやったことないです。)
>配列は渡せないと思いますので、モジュールレベルの配列変数を作成しておいて
>それを使うようになると思います。

前回、回答頂いた
>EnumFuncはenumwindows用のコールバック関数、EnumWindowsProc API関数です。
>関数の名前はEnumWindowsProc とする必要はなく、
>BOOL CALLBACK EnumWindowsProc(
> HWND hwnd,   // 親ウィンドウのハンドル
> LPARAM lParam  // アプリケーション定義の値
>);
>の構造を持っていれば、任意の名前をつけることが出来ます。

こちらを見逃していました。
API関数ですね・・すいません。ユーザー定義関数かと思ってました。

>>うーん・・・VBAって(すでにVBAじゃない気もしますが)奥が深い・・
>はい。細かい事を言うとC言語+Windowsプログラミングの世界に入って
>しまいます。
>私もいつまで立っても入門レベルでよくわかりません。^ ^;;

neptuneさんが入門レベルだとすると・・・
自分は丁稚レベルですね;;

【49592】WebBrowserコントロールもやってみました
発言  ハチ  - 07/6/12(火) 11:23 -

引用なし
パスワード
   気になったのでWebBrowserコントロールもやってみました。
これは楽チンですね!

WorkSheetにWebBrowser1,WebBrowser2,CommandButton1を配置。
下記コードだけでOKでした。

Option Explicit

Private Sub CommandButton1_Click()
  Dim StrURL As String
  
  'xxxxを変更
  StrURL = "xxxx://www.vbalab.net/"
  WebBrowser1.Navigate StrURL
  Call Wait_Comp(WebBrowser1)
  
  WebBrowser1.Document.Forms(0).Submit
  Call Wait_Comp(WebBrowser2)
  Debug.Print WebBrowser2.Document.Body.innerText
  
  WebBrowser1.Document.links(0).Click
  Call Wait_Comp(WebBrowser2)
  Debug.Print WebBrowser2.Document.Body.innerText
  
End Sub

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
  Set ppDisp = WebBrowser2
End Sub

Private Sub Wait_Comp(objWeb As WebBrowser)
  Do
    DoEvents
  Loop While objWeb.Busy
  DoEvents
End Sub

【49600】Re:WebBrowserコントロールもやってみま...
発言  neptune  - 07/6/12(火) 14:08 -

引用なし
パスワード
   ▼ハチ さん:
こんにちは
>気になったのでWebBrowserコントロールもやってみました。
>これは楽チンですね!
私も殆ど遣ったことないのですが、楽チンでしょ!

少し気になったのですが、Wait_Compですが、
DownloadBegin イベント,DownloadComplete イベント, FrameBeforeNavigate イベント,
FrameNavigateComplete イベント, Navigate メソッド, NavigateComplete イベント,
ProgressChange イベント
等のイベントも用意されているのでそちらも研究したら、Wait_Compは
不要になるような気がします。

>neptuneさんが入門レベルだとすると・・・
>自分は丁稚レベルですね;;
これですが、C、VC++の話でした。m(_ _)m

VB(A)ではさすがにここまでは言えません^ ^;;
自分で使うのはそんなに難しい事はやらないので、自分で殆ど調べられる程度
(それなりに苦労しますが)です。。。

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