電子書籍の厳選無料作品が豊富!

マクロ初心者です。
すでにインターネットとエクセルが開いている状態とします。
エクセルのマクロ【モジュール】で
すでに開いている「インターネットエキスプローラを閉じ」
尚、開いている「エクセルも閉じる」
っと言うマクロ【モジュール】を教えてください。

ヨロシクお願いします。

A 回答 (9件)

「End Sub, End Function または End Property 以降には、コメントのみが記述できます。


というエラーは、これらの記述以降にプログラムステートメントが入っているということです。
私のコードは、そのまま貼り付けることで稼動するようになっています。


・最初のSub test2() の行と一番最後の二重になっているEnd Sub の一つを削除してください。

Public ObjectIE As ....
Private objShell As .....
Dim ieFlg As Boolean
Private Declare...
の行のSub Main は、モジュールの最上部のSub プロシージャの外に置きます。Sub test2() の中に入れてはいけません。


-------------------------------------------VBEditor のEditor ペイン
'Option Explicit
Public ObjectIE As ....
Private objShell As .....
Dim ieFlg As Boolean
Private Declare...
-------------------------------------------
Sub Main()


End Sub
-------------------------------------------
 線が入るのは、そういう設定になっているからです。今回は、前回のものよりも、遥かに難しい内容ですから、サブルーチンを入れて複数のマクロにしないと、うまくコードが管理できません。
    • good
    • 0
この回答へのお礼

こんばんわ、Wendy02様。

お礼が遅くなりました。

理想通りのことができるようになりました。

本当にお世話になりました。

ありがとうございました。

お礼日時:2009/10/26 20:23

こんばんは。



>(1)例えばセルB2~B100までを対象にしたい場合、

それは、前のものとはコードも違いますし、とたんに難しくなります。どちらかというと、ハイパーリンクでないほうが扱いやすいようですが、それは、どちらでも対応するように作りました。余談ですが、この種のコードは、今も、私は、よい方法はないか模索中です。

たぶん、想像しているものよりも、遥かに難しいと思います。私も思い出すのに、しばらく時間が掛かりました。

なるほど、複数のURLのある場合は、Excelが一番使いやすいですし、今回のような場合は、Excelは他のツールと比較して驚くほど便利です。たとえば、オークションサイトを回るときとか、ここの掲示板を回るときなど、それと、ソースを自分で書き換えられる点でも便利です。

前回書いたものと違うのは、ループだけでなくて、IE のObjectを回しながら使うことにコツがあります。サイトにもよりますが、出来れば、JavaScript などをOFFにして回ると比較的楽です。

なお、動作試験は、ここのサイトを利用しました。

Wait は、Sleep に換えましたので負担は軽くなりました。秒数の調整は、2000で2秒、3000で3秒の意味です。

IEをVBAで扱うサイトで調べてみれば分かりますが、通常のコードでは、IE をOpen - Close を繰り返すと、IE は数回で止まってしまいます。また、Vista + IE7/8 の場合は、特殊なコードが必要になります。基本的には、Vista+IE7/8 は、除外対象にさせていただきます。このコードのままでVistaで使う場合は、IE7のセキュリティをOFFにしなければなりません。

参照設定が必要ですから、あらかじめ行ってください。理由は、事前バインディングのほうが軽くなるからです。Shell.Application 側をしないのは、単に2つも参照設定しなければならないのは、面倒かと思っていたからですが、もちろん設定しても良いです。

その場合は、Set objShell = CreateObject("Shell.Application") を、
参照設定名
Microsoft Shell Controls And Automation
宣言が、
Dim objShell As Shell

Set objShell = New Shell
と変わります。

'-------------------------------------------

'要参照設定--ツール--参照設定--Microsoft Internet Controls
Public objIE As InternetExplorer
Private objShell As Object
Dim ieFlg As Boolean
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub Main()
  Dim wb As Workbook
  Dim sURL As String
  Dim c As Range
  ieFlg = False
  On Error Resume Next
  Set objShell = CreateObject("Shell.Application")
  If objIE Is Nothing Then
    Set objIE = New InternetExplorer
  End If
  'B列から最後まで
  For Each c In Range("B2", Range("B65536").End(xlUp))
    If c.Hyperlinks.Count > 0 Then
      sURL = c.Hyperlinks(1).Address
    ElseIf InStr(1, c.Value, "http://", 1) > 0 Then
      sURL = c.Value
    End If
    If sURL <> "" Then
      Err.Clear
      
      IE_Open sURL
      If ieFlg Then Exit For
      If Err.Number > 0 Then Exit For
    End If
  Next
  If ieFlg Or Err.Number > 0 Then
    MsgBox "異常終了しました。", vbExclamation
    Err.Clear
    ieFlg = False
  End If
  objIE.Quit
  On Error GoTo 0
  Set objIE = Nothing
  Set objShell = Nothing
  Beep '終了音
  Call Excel_Closing
End Sub
Sub IE_Open(ByVal sURL As String)
  Dim i As Integer
  Dim objWin As Object
  Dim objI As Object
  On Error Resume Next
  For Each objWin In objShell.Windows
     If TypeName(objWin.Document) = "HTMLDocument" Then
       Set objI = objWin
       objI.Refresh
     End If
  Next
  
  On Error GoTo 0
  objI.Visible = True
  objI.Navigate sURL
  i = 0
  Do While objI.Busy
    DoEvents
    Sleep 1000 '1秒
  Loop
  Do Until objI.ReadyState = 4
    DoEvents
    i = i + 1
    If i > 20 Then '20回アクセスを繰り返し成功しなかったら離脱
      MsgBox "アクセスできません。", vbInformation
      ieFlg = True
      Exit Sub
    End If
  Loop
  Sleep 2000 '2秒
End Sub

Sub Excel_Closing()
Dim wb As Workbook
  On Error Resume Next
  For Each wb In Workbooks
    If wb.Saved = False Then
      wb.Save
      Beep
    End If
    If wb.Name <> ThisWorkbook.Name Then
      wb.Close False
    End If
  Next wb
  On Error GoTo 0
  Application.DisplayAlerts = False
  Application.Quit
  Application.DisplayAlerts = True '

End Sub

この回答への補足

おはようございます、Wendy02様。

#8でご回答頂きましたタグを貼り付け試してみました。

この時にエラーとその他の現象が発生しました。

補足日時:2009/10/25 02:06
    • good
    • 0

こんばんは。



>残りは、「何もせず、ホームページを閉じたい」ということです。

最初から、それを聞いていれば、もう少し解答には早く近づいただろうと思います。
いずれにしても、中には、文句を言うひともいるけれども、最初から、回答者にゲタを預けてしまったほうが、お互いに楽ですね!

ここの掲示板でも、質問者さんの中には、まったくマクロを知らないと宣言しているのに、まるでマクロを知っているかのように、その工程作業を書ける人がいます。でも、ほとんどの方は、fine-topさんのように、自力で何とかしたいけれども、と頑張ってしまうと、なかなか、先か見えなくなってしまうのです。一連の流れの中で、ひとつ・ふたつ取り上げても、簡単にはいかないことが多いのです。VBAマクロって、なかなか覚えられないし、やっと使えるようになっても、本当に、使いこなせるようになるには、それからまた年月が必要です。

話は戻るけれども、マクロでは、瞬時に画面が出る前に閉じてしまうので、以下では、3秒間のWait を入れておきました。それはともかく、Excel自体を使わなくてはならないのですか?以下のコードでは、必要はないような気がします。少しコードを換えれば、WSH(WScript) で稼動するような気がします。

前置きが長くなりましたが、これでどうでしょうか。

'-------------------------------------------
''出来るだけ、標準モジュールにおいてください。
''そうでないなら、コントロールツール・ボタンの配下でよいです。
'-------------------------------------------
Sub IE_Open_Close()
  Dim objIE As Object
  Dim myURL As String
  Dim wb As Workbook
  If Range("B2").Hyperlinks.Count > 0 Then 'B2 のハイパーリンクを拾う
    myURL = Range("B2").Hyperlinks(1).Address
  Else
    MsgBox "ハイパーリンクがありません。", vbInformation
    Exit Sub
  End If
  Set objIE = CreateObject("InternetExplorer.Application")
  objIE.Visible = True
  objIE.Navigate myURL
  
  Do While objIE.Busy
    DoEvents
  Loop
  Do Until objIE.ReadyState = 4
    DoEvents
  Loop
  Application.Wait Now() + TimeSerial(0, 0, 3) '3秒間待つ
  objIE.Quit
  Set objIE = Nothing
  On Error Resume Next
  For Each wb In Workbooks
    If wb.Saved = False Then
      wb.Save
      Beep
    End If
    If wb.Name <> ThisWorkbook.Name Then
      wb.Close False
    End If
  Next wb
  
  On Error GoTo 0
  Application.DisplayAlerts = False
  Application.Quit
  Application.DisplayAlerts = True '
End Sub

この回答への補足

こんばんわ、Wendy02様。(^-^)/

すごいです。(@_@)

バッチリです。o(^▽^)o

理想どおりです。

贅沢を申せば、もう2つあるのですが、

先ほど セルB2 を例に上げましたが、

(1)例えばセルB2~B100までを対象にしたい場合、

どこを変えれば可能でしょうか?

(2)例えばセルB2とB3だけ任意の回数(ループ?)させてから

同様、インターネットとエクセルを閉じる

とする場合、何をどこに付け加えればいいでしょうか?

ご迷惑ついでによろしければご教授ください。

重ね重ね申し訳ございませんが、

ぜひ、ヨロシクお願いします。

補足日時:2009/10/24 19:46
    • good
    • 0
この回答へのお礼

再度、お世話になります。

>最初から、それを聞いていれば、
>自力で何とかしたいけれども
本当にお手間を取らせまして申し訳ございません。
どう表現したらいいか解りませんでした。ごめんなさい。

>本当に、使いこなせるようになるには
本当にそのようですね。実感しました。

>Excel自体を使わなくてはならないのですか?
これしか思いつきませんでした。
「マクロ・モジュール」など言葉(名詞)は知っているものの
使ったことは「ほとんど」と言うのも、おこがましいくらいの
初心者です。

>WSH(WScript) で
???・・・
「java script」など言葉(名詞)は知っているものの使ったことは
全くありません。

あと「この回答への補足」に上げさせて頂きました2つが満たされれば
大満足です。

本当に、本当に、ありがとうございます。

重ねて御礼申し上げます。(^O^)/

お礼日時:2009/10/24 20:17

#5の訂正


× #2の回答者ですが、
   #3の回答者ですが、
と読み換えてください。
    • good
    • 0
この回答へのお礼

再度こんばんわ、お世話になります Wendy02さん。
>#5の訂正
>× #2の回答者ですが、
>   #3の回答者ですが、
>と読み換えてください。

了解しました。

お礼日時:2009/10/24 18:02

こんにちは。



#2の回答者ですが、作業の流れが分からないのです。

'-------------------------------------------
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit
'-------------------------------------------
全体の流れを、具体的にもう一度教えてもらわなくてはなりません。

>やはりホームページ(インターネットエキスプローラ)を
>閉じるに至りません。

こちらの提供したマクロ単独で動かす場合、閉じないようなことはあえりません。

基本的なことが理解されていないような気がします。上記のExcel VBAのコードをどういじっても、そして、私のコードを付け足しても、Application.Quit の後では、ホームページを閉じるなんていうことはありえません。

マクロのコード自体よりも、きちんとした、作業(マクロ)の工程を提示していただかないと、ご質問の目的の解答は得られないと思います。
    • good
    • 0
この回答へのお礼

こんばんわ、Wendy02さん。

重ね重ね本当にありがとうございます。

説明不足で本当に申し訳なく思います。

>作業の流れが分からないのです。

例えば、セルB2にハイパーリンクの貼ったURL
この場合、http://www.yahoo.co.jp
だったとします。

マクロの実行ボタンを押し、
ヤフーのホームページが開かせる。
ここまでの流れが↓以下のタグになるのではないか?と考えます。
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
開いたら何もせず、このヤフーのホームページを閉じたいのです。
そして、又何もせずエクセルを閉じるというようにしたいのです。
これは【エクセルを閉じる】、Application.Quitで閉じれるようになりました。

残りは、「何もせず、ホームページを閉じたい」ということです。

専用用語等が初心者なので表現することが出来てないかもしれませんが
何卒よろしくお願いします。

ありがとうございました。

お礼日時:2009/10/24 17:59

IEについてはこちら


http://www.ken3.org/vba/backno/vba156.html
Excelについてはこちら
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
が参考になりますが、いずれにしても「マクロ初心者」向きの話にはなりません。
    • good
    • 0
この回答へのお礼

こんにちは、cistronezkさん。(^-^)/
現在↓以下のところまで出来るところまできましたが、
【ハイパーリンクからホームページを開き、エクセルを閉じる。】
やはりホームページ(インターネットエキスプローラ)を
閉じるに至りません。

>いずれにしても「マクロ初心者」向きの話にはなりません
確かに初心者には難しいですね。【マクロ】

Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit

いろいろとご紹介いただきましたものを試しているのですが、
上手く行ってないのが現状です。

せっかくご教授いただいて成果がだせていないことを申し訳なく思っていますがもう少し頑張ってみます。

ありがとうございました。o(^▽^)o

お礼日時:2009/10/24 14:46

こんにちは。



Excelのバージョンが、2007 では調べていませんが、IWebBrowser2 から、IEを取得すればよいのではないかと思います。つまり、IEの操作も可能です。#2のimogasiさんのが普通かもしれません。

#1の補足
>>そのIEは、マクロで起動したものですか?
>そうです。

マクロで起動して、IEObject のオートメーションが残っていたらうまくありませんから、一度、解放させたほうがよいと思います。しかし、モジュールスコープ変数などに残していない状態で、起動したマクロが終わっていれば、それは無視してよいです。簡単に調べるには、Task Manager を起動して、IE が残っているか確認したほうが早いです。


'-------------------------------------------

Sub TestMacro()
  Dim objShellWindows As Object
  Dim w As Object
  Dim wb As Workbook
  Set objShellWindows = CreateObject("Shell.Application").Windows()
  For Each w In objShellWindows
   If TypeName(w) = "IWebBrowser2" Then
     w.Quit
   End If
  Next
  Set objShellWindows = Nothing
 
  On Error Resume Next
  For Each wb In Workbooks
   If wb.Saved = False Then
    wb.Save
    Beep
   End If
   If wb.Name <> ThisWorkbook.Name Then
     wb.Close False
   End If
  Next wb
  On Error GoTo 0
   Application.DisplayAlerts = False
   Application.Quit
   Application.DisplayAlerts = True 'ここは、97では生きていようですが、新しいバージョンで生きてはいない
End Sub
    • good
    • 0
この回答へのお礼

こんにちは、Wendy02さん。(^-^)/
現在↓以下のところまで出来るところまできましたが、
【ハイパーリンクからホームページを開き、エクセルを閉じる。】
やはりホームページ(インターネットエキスプローラ)を
閉じるに至りません。

Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit

いろいろとご紹介いただきましたものを試しているのですが、
上手く行ってないのが現状です。

せっかくご教授いただいて成果がだせていないことを申し訳なく思っていますがもう少し頑張ってみます。

ありがとうございました。o(^▽^)o

お礼日時:2009/10/24 14:43

WEBに似たものを見つけたので、少々修正して


Sub test06()
Set objShell = CreateObject("Shell.Application")
For Each objIE In objShell.Windows
MsgBox objIE.LocationUrl
MsgBox objIE.Document.Title
objIE.Quit
Next
End Sub
これをやってみてください。質問の意図と違いますか。
Msgboxの行は、確認用に入れてあるもの。
「問題にしているモジュールのあるエクセル」を閉じるのは判りますね。
ーー
VBAの初心者が、他アプリとの関連のプログラムを造るのは、背伸びであると思うが。
無理しないで、残しておいて、コンピュータを落とすとき、基本の手動で閉じる、でよいのでは。

この回答への補足

おはようございます、imogasiさん。
私の質問の仕方が悪いようです。
記入していただきましたタグを貼り付けてみましたが
残念ながらインターネットは閉じませんでした。
↓現在のモジュールです。
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
ココから、開いているインターネットを閉じなさいと言う命令文を
付け加えたいのです。
そして、エクセル(アプリケーション)を閉じなさいと言う命令文を付け加えたいのです。

なにぶん初心者ですので、説明不足をお許しください。

又、懲りずに御教授頂きたいと思いますのでヨロシクお願いします。

ありがとうございました。

補足日時:2009/10/24 11:46
    • good
    • 0

>すでにインターネットとエクセルが開いている状態とします



確認です。
そのIEは、マクロで起動したものですか?それとも手で起動したもの?
「エクセル」とは1ブックを閉じることではなくて、プロセスを終了したいということですね?

この回答への補足

おはようございます、cistronezkさん。
>確認です。
>そのIEは、マクロで起動したものですか?
そうです。

>プロセスを終了したいということですね?
そうです。

このようなことは出来るのでしょうか?

ありがとうございます。

補足日時:2009/10/24 10:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!