• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAでのIE画面操作)

エクセルVBAでのIE画面操作

このQ&Aのポイント
  • エクセルVBAを使用して、社内のイントラネットに顧客情報を自動入力し、結果を表示するためのVBAコードの改善方法について教えてください。
  • 現在、エクセルのA列に入力された顧客番号を自動転記し、検索をかけて結果を別の画面に表示するVBAコードがあります。しかし、2回目以降の検索では結果の画面が隠れたままになり、表示されません。これを改善する方法を教えてください。
  • エクセルVBAを使用して、顧客番号を自動入力し、検索結果を表示する際に結果の画面を自動的に表に表示させる方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

>連休をすべてつぶしてしまいましたが、もうお手上げ・・・。 >疲れました。  お疲れさまでしたぁ。。。  <(_ _)> >最初の1回目はうまくいきます。 >多分、2回目以降は開いているIEの数が増えるわけではないので...  そうですね。大変、失礼いたしました。  これが、merlionXX さんを疲れさせてしまいました。 >二度目以降の検索では新たな結果画面のIEは立ち上がらず、 >最初の結果画面IE上の表示が新しいものにかわります。 とのことですので、恐らく、「入力画面」の [検索] ボタン を クリック した結果の javascript に window.open('QresultVi.asp?honyarara', 'hoge') みたいなことが書いてあって、「最初の結果画面IE」に「hoge」みたいな名前が付いているのだと存じます。  従いまして、私が前回答で書きましたことは ヒント にはなりましたが、ちょっと ミス がありましたね。 「最初の結果画面IE」が開いた タイミング で、この ウィンドウ を objIE2 に set してしまえば、後は何もしなくてよいのだと存じます。  私もちょっと忙しくなってきましたので、検証までできておりませんが、下記のようなことで試行錯誤なさってみてください。 >冒頭に・・・ を書いておいて >Dim tmp As String の次に、・・・ を はそのままで、 > .Visible = True の次に・・・ を挿入します。 は無かったことにいたします。  それで、 End With の前に If objIE2 Is Nothing Then  Set objIE2 = myShell.Windows.Item(SWC + 1) End If SetForegroundWindow objIE2.hWnd でいかがでしょうか?

merlionXX
質問者

お礼

DOUGLAS_ さま、お手数をおかけしました。 最前面から動いてくれない検索入力画面を最小化することでなんとか解決できました。 VBAでのIE操作は経験が少ないだけにわたしにはとても難しいです。 これからもご指導のほど、よろしくお願い申し上げます。 (o。_。)oペコッ.  Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long Dim myShell As Object Dim objIE As Object Private Sub Worksheet_SelectionChange(ByVal Target As Range)   Dim tmp As String   Set myShell = CreateObject("Shell.Application")      If Target.Count > 1 Then Exit Sub '複数セル選択を除外   If Target.Column <> 1 Then Exit Sub 'A列以外を除外   If Target.Value = "" Then Exit Sub '空白セルを除外      On Error Resume Next   tmp = objIE.Name 'objIE.Nameの取得に成功したら起動とみなす。   If Err.Number <> 0 Then 'エラーならIEが起動していないので、起動する。     Set objIE = CreateObject("InternetExplorer.Application")   End If   On Error GoTo 0      With objIE     .navigate "http://xxxx.yyy.co.jp/imagef/Qspec.asp" '検索入力画面     Do While .busy = True '表示まで待機       DoEvents     Loop     .Visible = True     .document.getElementById("kokyakuNo").Value = Target.Text 'テストボックスへ入力:ID属性で指定     .navigate "javascript:Submit();" 'http://xxxx.yyy.co.jp/imagef/QresultVi.asp に結果が表示     Do While .busy = True       DoEvents     Loop     .Visible = True     Debug.Print myShell.Windows.Count     SetForegroundWindow myShell.Windows.Item(myShell.Windows.Count - 1).hWnd '最新の画面(結果)を前面に     ret = ShowWindow(.hWnd, 2) '検索入力画面を最小化   End With End Sub

その他の回答 (3)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>.Document.Title & " - " & .Name が何を返すか見てみた >それでは、結果画面のタイトルを直接指定すればいいんじゃん >タイトルのスペースの全半角等の違いかと思い  理想的な対処のなさり方かと存じますねぇ。 >そのままコピーして >Sub TEST() >で試すと、ちゃんと結果の画面が表に出てきます。 >プロシージャの中ではだめなのかと >Call TEST >としてみたら、やはり同じ実行時エラーです。  ん~。。。 ●先ず、確認ですが、 >計2つのIEが現れます。 とお書きなのは、「IE の ウィンドウ が2つある」という意味であって、「1つの ウィンドウ で 2つの タブ が開いている」という意味ではありませんよね? 【質問1】  「1つの ウィンドウ で 2つの タブ が開いている」場合は、最初から、前回答の【3】のヤリ方になりますが、しかも、この場合は、問題が複雑になります(これの場合は、別途、回答いたします)。 ●ちなみに、「入力画面」の方は、 AppActivate .Document.Title & " - " & .Name & " の提供元: ○○○ Company" と、「提供元」の後ろの コロン が全角になっていますが、「結果画面」の方は AppActivate "検索 結果 - Microsoft Internet Explorer の提供元: ○○○ Company" と、「提供元」の後ろの コロン が半角になっています。  これは、間違いではないのですね? 【質問2】 ●【質問1・2】の答えが、ともに「はい」の場合は、試しに、プロシージャ の中に AppActivate "検索 結果" と書くといかがでしょうか?  [AppActivate ステートメント] の ヘルプ の一番最後の「解説」に、 ------------------------- 完全に一致するものが見つからないときは、アプリケーション ウィンドウのタイトル バーの文字列が名前付き引数 title で始まるアプリケーションをアクティブにします。 ------------------------- とありますので、AppActivate の引数 title は正確でなくてもよいようですので。。。 ●これで、ダメなようでしたら、前回答の【3】のヤリ方になろうかと存じます(下記のような感じ)。  冒頭に Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Dim myShell As Object Dim SWC As Long Dim objIE2 As Object を書いておいて Dim tmp As String の次に、 Set myShell = CreateObject("Shell.Application") SWC = myShell.Windows.Count を .Visible = True の次に Set objIE2 = myShell.Windows.Item(SWC + 1) SetForegroundWindow objIE2.hWnd を挿入します。  要するに、 1)最初に、Shell.Application で、ウィンドウ(エクスプローラ 及び IE)の数を数えておいて、 2)IE が更に2つ開いた場合に、最後の ウィンドウ を オブジェクト(objIE2)に格納、 3)そして、それを SetForegroundWindow する ということです。  なお、myShell.Windows.Item の インデックス は「0」から始りますので、「IE が更に2つ開いた場合」には、「最後の ウィンドウ」の インデックス は「SWC + 1」になります。

merlionXX
質問者

お礼

> とお書きなのは、「IE の ウィンドウ が2つある」という意味であって、「1つの ウィンドウ で 2つの タブ が開いている」という意味ではありませんよね? 【質問1】 はい、IE6.0ですから、タブはありません。IEのウィンドウ が2つ(検索入力画面と検索結果画面)あります。 正確には、その他イントラの入り口のページ(これを真っ先に立ち上げます)もあるので、IEのウィンドウ が3つ(+他に立ち上がっていれば、そのページの数)です。 これはタスクマネ^ジャで見てもその数だけIEが立ち上がっているのが確認できます。 コロンの全角半角の違いは、この質問サイトにコピペしたときに化けたようです。 モジュール内ではすべて半角でした。 > 試しに、プロシージャ の中にAppActivate "検索 結果"と書くといかがでしょうか? やってみました。 まず単独で試しました。 Sub TEST00() AppActivate "検索 結果 - Microsoft Internet Explorer の提供元 ○○○" 'これは表示される。 End Sub Sub TEST01() AppActivate "検索 結果" 'これは実行時エラーエラー'5':プロシージャの呼び出し、または引数が不正です。 End Sub Sub TEST02() AppActivate "検索 条件入力 - Microsoft Internet Explorer の提供元: ○○○" 'これは表示される。 End Sub Sub TEST03() AppActivate "検索 条件入力" 'これは実行時エラーエラー'5':プロシージャの呼び出し、または引数が不正です。 End Sub 本体の記述に組み込んでも同様でした。 > これで、ダメなようでしたら、前回答の【3】のヤリ方になろうかと存じます(下記のような感じ)。 やってみました。 最初の1回目はうまくいきます。 ただし、2度目の検索以降は 「実行時エラー91、オブジェクト変数またはWithブロック変数が指定されていません」となり、 SetForegroundWindow objIE2.hWnd がハイライトとします。 このとき、objIE2はNotingになっています。 多分、2回目以降は開いているIEの数が増えるわけではないので、Windows.Item(SWC + 1)の「インデックスが有効ではない」と出ます。 インデックスは0から始まるとのことなので、 Set objIE2 = myShell.Windows.Item(myShell.Windows.Count - 1) SetForegroundWindow objIE2.hWnd End With として試してみましたが、今度はエラーは出ませんが、結果画面は隠れたままです。 ただし、これまでと違うのは、タスクバー上の検索結果画面IEのアイコンの色が反転しました。 もうひといきにようなきがします。

merlionXX
質問者

補足

もう一息と思い、あちこち検索しまくり、 冒頭に Private Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long SetForegroundWindow objIE2.hWndの下に ret = ShowWindow(objIE2.hWnd, 3) を入れたところ、検索結果画面は最大化されました。 それでも、入力画面はその前面に浮いている状態です。 objIE2.TheaterMode = True というのも試しました。 これは最大化され、かつ最前面に出てくれますが、タスクバーなどが消えてしまいます。 連休をすべてつぶしてしまいましたが、もうお手上げ・・・。 疲れました。 今日はもう帰宅します。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>あいかわらず入力画面が表で、結果画面は裏に隠れています。  では、とりあえず、代替策を一つ。 【1】前回答は無視して、「End With」の前に、 AppActivate .Document.Title & " - " & .Name を挿入する。  これでいかがでしょうか? 【2】上記でもダメな場合 前回答では「.Visible = True」の次にとしましたが、どうせなら検索結果が出てから IE が前面に出る方が スマート でしたね。  ということで、ダミー の ブック で、下記を シートモジュール に貼り付けてお試しください。 '----------------- Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Dim objIE As Object Private Sub Worksheet_SelectionChange(ByVal Target As Range)   Dim tmp As String   If Target.Count > 1 Then Exit Sub '複数セル選択を除外   If Target.Column <> 1 Then Exit Sub 'A列以外を除外   If Target.Value = "" Then Exit Sub '空白セルを除外   On Error Resume Next   tmp = objIE.Name 'objIE.Nameの取得に成功したら起動とみなす。   If Err.Number <> 0 Then 'エラーならIEが起動していないので、起動する。     Set objIE = CreateObject("InternetExplorer.Application")   End If   On Error GoTo 0   With objIE     .navigate "http://www.yahoo.co.jp/"     While .Busy Or .ReadyState <> 4: DoEvents: Wend     .document.getElementById("srchtxt").Value = Target.Text 'テストボックスへ入力:ID属性で指定     .document.getElementById("srchbtn").Click     Do While .busy = True       DoEvents     Loop     .Visible = True     SetForegroundWindow .hWnd   End With End Sub '-----------------  ご質問に提示された コード からの変更点は、 1)冒頭に... 2)「.Visible = True」の後に...  ついでに「.Visible = True」も「SetForegroundWindow .hWnd」も「End With」の前に移動 3)navigate するのは Yahoo! Japan の ページ 4)そして、検索ボックス に Target.Text を入力 5)[検索] ボタン を クリック 以上の5点のみです。  私の環境では、問題なく下記のように動きます。 1)シートモジュール の書かれた シート の A1:A3 に、それぞれ、「apple、orange、banana」と入力しておく。 2)A1 を クリック すると、Yahoo! Japan の ページ が開き、検索ボックス に「apple」と入力されて、[検索] ボタン が押され、検索結果の ページ に遷移します。 3)[Alt] + [Tab] で Excel の ウィンドウ に 切り替え A3 を クリック すると、(2) の IE が自動的に Excel の前面に出てきて、検索ボックス に「banana」と入力されて、[検索] ボタン が押され、検索結果の ページ に遷移します。  ちなみに、(3) の IE で、[Alt] + [←] を押下すると、Yahoo! Japan の ページ に戻り、さらに、[Alt] + [←] を押下すると、「apple」の検索結果の ページ に戻りますので、同じ インスタンス の IE であることは間違いありません。 【3】もし、上記が動くようであれば、「イントラネット」の問題ではなくて、「エクセル2000、Windows2000」の問題かと存じますが、この場合は、 CreateObject("WScript.Shell") などで ウィンドウハンドル を掴んで無理矢理前面に引っ張り出す...みたいなことになりますか。。。 http://www.google.co.jp/search?q=%E5%89%8D%E9%9D%A2%E3%81%AB%E5%87%BA%E3%81%99+%22CreateObject(InternetExplorer.Application)+%22

merlionXX
質問者

お礼

何度もありがとうございます。 休日出勤してイントラを試しておりました。 まず、【1】です。 End Withの前に、AppActivate .Document.Title & " - " & .Name を挿入しましたが、その個所が 「実行時エラー'5':プロシージャの呼び出し、または引数が不正です。」となりました。 .Document.Title & " - " & .Name が何を返すか見てみたところ、入力画面の方のタイトルを返しました。 ただ、イントラネットなので、IEの最上部タイトルの最後に、 「の提供元: ○○○ Company」 と表示されます。(返された文字列とこの部分だけが違います。) 多分このせいだと思い、 AppActivate .Document.Title & " - " & .Name & " の提供元: ○○○ Company" と変えてみたところ、エラーは出なくなりました。 しかし、入力画面の方のタイトルが返されるので、入力画面がアクティブになったままです。 それでは、結果画面のタイトルを直接指定すればいいんじゃんと AppActivate "検索 結果 - Microsoft Internet Explorer の提供元: ○○○ Company" と変えてみたところ、その個所が 「実行時エラー'5':プロシージャの呼び出し、または引数が不正です。」 となりました。 Σ( ̄ロ ̄lll) タイトルのスペースの全半角等の違いかと思い、まず、そのままコピーして Sub TEST() AppActivate "検索 結果 - Microsoft Internet Explorer の提供元: ○○○ Company" End Sub で試すと、ちゃんと結果の画面が表に出てきます。 プロシージャの中ではだめなのかと、もとの記述の AppActivate "検索 結果 - Microsoft Internet Explorer の提供元: ○○○ Company" を Call TEST としてみたら、やはり同じ実行時エラーです。 いったいどうなっているのでしょう? もうわけがわかりません・・・・。 ( ̄∇ ̄; ? 【2】は問題なくYahoo画面がエクセルの前面に出ます。 でも、わたしが困っているのは結果画面のIEがエクセルの影に隠れることではなく、入力の画面のIEの影に隠れることなんです。 Yahooでの場合は、IE画面はひとつだけです。(入力画面がそのまま結果画面に変わります。) ところが、うちのイントラの画面は入力画面のIEで入力し、最初に検索ボタンを押すと、別の結果画面のIEが新たに立ち上がり、計2つのIEが現れます。 二度目以降の検索では新たな結果画面のIEは立ち上がらず、最初の結果画面IE上の表示が新しいものにかわります。その結果画面が表に出ないで入力画面のIEの下にかくれたままなので困っているのです。 【3】はまだよく見ていません。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

 冒頭に Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long を書いておいて .Visible = True の後に SetForegroundWindow objIE.hWnd を挿入すれば、できるみたいですが、私的には、「画面を並べておいて操作する」方が簡単そうに思えますけど。。。

merlionXX
質問者

お礼

DOUGLAS_さま、 qa6811541 では大変お世話になりありがとうございました。 今回、 Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long をモジュール最上部に書き、 Visible = True の下に、SetForegroundWindow objIE.hWnd  を挿入しましたが、あいかわらず入力画面が表で、結果画面は裏に隠れています。 並べて表示させればたしかに見えますが、結果画面を大きくして閲覧したいのです。 よろしくお願いします。

関連するQ&A