コメント欄に示すプログラムのエラーの解決方法って分かりますか?よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/09/24 02:16:01
  • 終了:2010/09/26 19:00:05

回答(1件)

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 umI 112 11 0 2010-09-26 14:01:27
  • id:ReoReo7
    エラーの出るプログラム
    参考:http://ken3-info.blog.ocn.ne.jp/objie/2009/05/ie_set_newie_ob.html
    一番最後に開かれたアプリケーションがIEなら問題ないので、
    エラーというか、わざとエラーを出している感じですが。

    Sub newWindow()
    Dim objShell As Object 'Shell.ApplicationのWindowから探したいので
    Dim objIE As Object 'IEを入れる箱(捕まえてコントロールしたい)
    Dim n As Integer 'カウンターです。

    'これで、エクスプローラーのウインドウを取得する
    Set objShell = CreateObject("Shell.Application")
    Set objIE = Nothing '初期化する(フラグ代わりも兼ねて、後でIs Nothingでチェックしたいので)

    '後ろから探す(素直に前から探してよ(笑))
    '.Windowsでエクスプローラーとインターネットエクスプローラー(FullNameがIEXPLORE.EXE)にさわれる
    For n = objShell.Windows.Count To 1 Step -1 'MAXから-1ひいてく感じ
    MsgBox objShell.Windows(1).Name
    '.FullNameで普通のファイルエクスプローラーとIE(インターネットエクスプローラー)を区別する

    *****この下の行でエラーが出る*****
    エラー内容:
    実行時エラー91
    オブジェクト変数またはWithブロック変数が定義されていません
    **********************

    If Right(UCase(objShell.Windows(n - 1).FullName), 12) = "IEXPLORE.EXE" Then
    Set objIE = objShell.Windows(n - 1) 'n番目のウインドウ(FullNameがIEXPLORE.EXE)を代入
    Exit For '見つけたので、↑代入後、強制的にループを抜ける
    End If
    Next
    Set objShell = Nothing

    'もし起動済みのIEが見つからなければ、新たに起動する
    If objIE Is Nothing Then '上で見つけられたか?
    Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    End If
    objIE.Visible = True '可視、Trueで見えるようにします。

    '表示位置(左上の座標)とサイズ(高さ・幅)を調整する
    objIE.FullScreen = False '※Trueのモードだとびっくりするよ
    objIE.Top = 100 '左上 上位置
    objIE.Left = 100 '左上 左位置
    objIE.Width = 800 '横幅
    objIE.Height = 600 '高さ

    'XXXバー、外観・外枠の調整。
    objIE.Toolbar = True 'タブの切り替えで必要なので、ツールバーを表示にする
    objIE.MenuBar = False 'メニューは非表示にする
    objIE.AddressBar = True 'URLなど アドレスバーは確認のため、表示する
    objIE.StatusBar = True '一番下のステータスバーを表示。

    '処理したいページを表示します。
    objIE.Navigate "http://www.google.co.jp/" '.Navigate メソッドで Yahooを表示する。
    'Navigate と Navigate2 の 違いが私もイマイチわかってませんが

    'ページの表示完了を待ちます。
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True '.ReadyState <> 4の間まわる。
    DoEvents '重いので嫌いな人居るけど。
    Wend

    'ページが表示されたので、表示された文章に対して、処理を行います。
    'HTML文章objIE.Documentからデータを取得
    '入力フォームDocument.Formsでデータをセットしたり送信したり
    'リンクDocument.Linksでリンクの情報を取得
    'イメージDocument.Imagesで画像の情報を取得
    'フレームDocument.Framesフレーム分割の文章なら
    '↑ほかにもイロイロありますが、文章Documentです。
    'また、.ExecWBメソッドを使えば 印刷・コピー・貼付 などコマンド・命令を発行できます。(動作が可能です)

    '処理したいページを表示します。
    objIE.Navigate "http://www.kosho.or.jp/public/book/detailsearch.do" '.Navigate メソッドで表示する。

    '↑上記のページの表示が完了するまで待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
    DoEvents '重いので嫌いな人居るけど。
    Wend
    'ページが表示されたので、表示された文章に対して、処理を行います。
    ' objIE.document.all("p_shomei").Value = bookname 'A列の値を 書名にセットする。

    'データセット後にIEを前面にする方法がわからなかったので、とりあえず、Excelを最小化してごまかす
    Application.WindowState = xlMinimized 'excelの最小化


    '処理が終わったので、IEを閉じます。
    'テストの時は、↓確認して、残しておくと便利ですよ。
    If MsgBox("IEを閉じますか?", vbYesNo) = vbYes Then '終了確認
    objIE.Quit '.Quitで閉じる
    End If

    Set objIE = Nothing '使用したオブジェクト変数もキレイにしてね。

    End Sub
  • id:cx20
    > MsgBox objShell.Windows(1).Name

    MsgBox objShell.Windows(n-1).Name

    の誤りとか?
  • id:ReoReo7
    cx20さん

    ありがとうございます。

    MsgBox objShell.Windows(1).Name
    は後で自分でデバッグ用に自分でつけたものです。
    削除するつもりで忘れていました。この行は無視して下さい!
  • id:ken3memo
    objShell.Windows(n - 1).FullName
    .FullNameのプロパティを持っていないソフトでひっかかるのかなぁ。
    http://q.hatena.ne.jp/1282898854
    ↑の中で、何かあるのかなぁ。
    で、
    一番後ろに IEが立ち上がっていると、
    Exit Forでぬけるので、うまくいったように見えて、
    IEが無い状態だと、
    .Windows(n - 1).FullName が 何かのソフトに引っ掛かっているのかなぁ。
    そのサンプルを作った作者があまりテストしていないからじゃないかなぁキット。

    あとは、私の実例だと(自動巡回のPCがウイルスにやられた話だけど)
    http://d.hatena.ne.jp/ken3memo/20100812/1281608453
    ↑1つ名前を持たない アプリ が 悪さしていたみたいだけど、クリーンインストールしてしまったので、本当の原因はわからなかったり。

    原因がわかったら、ぜひ教えてくださいね(原因が判明することを願いつつ、失礼します)
  • id:ken3memo
    http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200809/08090181.txt
    をみると
    >IE in 2008/09/28(日) 18:32:43
    >Windows((i))
    >または
    >Windows.Item((i))
    で動作するみたいですね。※う~ん、イロイロと勉強になりますね。
    ※※だからすぐにウイルスのせいにしちゃいけないんだったば(笑)
  • id:ReoReo7
    ありがとうございます!
    プログラムは訂正前も訂正後も

    If UCase(Right(objShell.Windows((i)).FullName, 12)) = "IEXPLORE.EXE" Then

    のところで「IEが起動しているとき→OK、EXCELが一番後ろのアプリとなっているとき→エラー」となって止まっていたんですが、コンピュータを再起動したら、どのようなアプリケーションが一番後ろにあってもOKとなりました!!

    PCを立ち上げてVBAをいじっているうちに、EXCELのFullNameというパラメーターが取れなくなってしまったように見えますが・・・?

    とにかく試行錯誤したら解決しました。いつも役に立つプログラムを提供して下さりありがとうございます。ちなみに、ご指摘のノートPCではなく問題ないデスクトップを使っています!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません