No.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
-------------------------------------------
線が入るのは、そういう設定になっているからです。今回は、前回のものよりも、遥かに難しい内容ですから、サブルーチンを入れて複数のマクロにしないと、うまくコードが管理できません。
こんばんわ、Wendy02様。
お礼が遅くなりました。
理想通りのことができるようになりました。
本当にお世話になりました。
ありがとうございました。
No.8
- 回答日時:
こんばんは。
>(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でご回答頂きましたタグを貼り付け試してみました。
この時にエラーとその他の現象が発生しました。
No.7
- 回答日時:
こんばんは。
>残りは、「何もせず、ホームページを閉じたい」ということです。
最初から、それを聞いていれば、もう少し解答には早く近づいただろうと思います。
いずれにしても、中には、文句を言うひともいるけれども、最初から、回答者にゲタを預けてしまったほうが、お互いに楽ですね!
ここの掲示板でも、質問者さんの中には、まったくマクロを知らないと宣言しているのに、まるでマクロを知っているかのように、その工程作業を書ける人がいます。でも、ほとんどの方は、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だけ任意の回数(ループ?)させてから
同様、インターネットとエクセルを閉じる
とする場合、何をどこに付け加えればいいでしょうか?
ご迷惑ついでによろしければご教授ください。
重ね重ね申し訳ございませんが、
ぜひ、ヨロシクお願いします。
再度、お世話になります。
>最初から、それを聞いていれば、
>自力で何とかしたいけれども
本当にお手間を取らせまして申し訳ございません。
どう表現したらいいか解りませんでした。ごめんなさい。
>本当に、使いこなせるようになるには
本当にそのようですね。実感しました。
>Excel自体を使わなくてはならないのですか?
これしか思いつきませんでした。
「マクロ・モジュール」など言葉(名詞)は知っているものの
使ったことは「ほとんど」と言うのも、おこがましいくらいの
初心者です。
>WSH(WScript) で
???・・・
「java script」など言葉(名詞)は知っているものの使ったことは
全くありません。
あと「この回答への補足」に上げさせて頂きました2つが満たされれば
大満足です。
本当に、本当に、ありがとうございます。
重ねて御礼申し上げます。(^O^)/
No.5
- 回答日時:
こんにちは。
#2の回答者ですが、作業の流れが分からないのです。
'-------------------------------------------
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit
'-------------------------------------------
全体の流れを、具体的にもう一度教えてもらわなくてはなりません。
>やはりホームページ(インターネットエキスプローラ)を
>閉じるに至りません。
こちらの提供したマクロ単独で動かす場合、閉じないようなことはあえりません。
基本的なことが理解されていないような気がします。上記のExcel VBAのコードをどういじっても、そして、私のコードを付け足しても、Application.Quit の後では、ホームページを閉じるなんていうことはありえません。
マクロのコード自体よりも、きちんとした、作業(マクロ)の工程を提示していただかないと、ご質問の目的の解答は得られないと思います。
こんばんわ、Wendy02さん。
重ね重ね本当にありがとうございます。
説明不足で本当に申し訳なく思います。
>作業の流れが分からないのです。
例えば、セルB2にハイパーリンクの貼ったURL
この場合、http://www.yahoo.co.jp
だったとします。
マクロの実行ボタンを押し、
ヤフーのホームページが開かせる。
ここまでの流れが↓以下のタグになるのではないか?と考えます。
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
開いたら何もせず、このヤフーのホームページを閉じたいのです。
そして、又何もせずエクセルを閉じるというようにしたいのです。
これは【エクセルを閉じる】、Application.Quitで閉じれるようになりました。
残りは、「何もせず、ホームページを閉じたい」ということです。
専用用語等が初心者なので表現することが出来てないかもしれませんが
何卒よろしくお願いします。
ありがとうございました。
No.4
- 回答日時:
IEについてはこちら
http://www.ken3.org/vba/backno/vba156.html
Excelについてはこちら
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
が参考になりますが、いずれにしても「マクロ初心者」向きの話にはなりません。
こんにちは、cistronezkさん。(^-^)/
現在↓以下のところまで出来るところまできましたが、
【ハイパーリンクからホームページを開き、エクセルを閉じる。】
やはりホームページ(インターネットエキスプローラ)を
閉じるに至りません。
>いずれにしても「マクロ初心者」向きの話にはなりません
確かに初心者には難しいですね。【マクロ】
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit
いろいろとご紹介いただきましたものを試しているのですが、
上手く行ってないのが現状です。
せっかくご教授いただいて成果がだせていないことを申し訳なく思っていますがもう少し頑張ってみます。
ありがとうございました。o(^▽^)o
No.3
- 回答日時:
こんにちは。
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
こんにちは、Wendy02さん。(^-^)/
現在↓以下のところまで出来るところまできましたが、
【ハイパーリンクからホームページを開き、エクセルを閉じる。】
やはりホームページ(インターネットエキスプローラ)を
閉じるに至りません。
Range("B2").Select
Selection.Hyperlinks(1).Follow NewWindow:=False,AddHistory:=True
Application.WindowState = xlNormal
Application.Quit
いろいろとご紹介いただきましたものを試しているのですが、
上手く行ってないのが現状です。
せっかくご教授いただいて成果がだせていないことを申し訳なく思っていますがもう少し頑張ってみます。
ありがとうございました。o(^▽^)o
No.2
- 回答日時:
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
ココから、開いているインターネットを閉じなさいと言う命令文を
付け加えたいのです。
そして、エクセル(アプリケーション)を閉じなさいと言う命令文を付け加えたいのです。
なにぶん初心者ですので、説明不足をお許しください。
又、懲りずに御教授頂きたいと思いますのでヨロシクお願いします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/22 11:43
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) エクセルのマクロの有効について 4 2023/08/03 11:40
- Excel(エクセル) マクロの保存先、開いてるすべてのブックの意味 エクセルを開き、表示→マクロ→マクロの表示と順番に開く 3 2022/06/25 17:52
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/08 15:45
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel マクロの編集がグレーに...
-
WPSOffice_マクロの有効化について
-
エクセルの表を複数枚印刷した...
-
エクセル ボタンに設定したマク...
-
エクセル マクロ名にブック名...
-
エクセルで明日の日付を表示す...
-
Excelマクロで、稼働中のマクロ...
-
Excelのマクロでボタンを押すと...
-
Excelマクロをバックグラウンド...
-
エクセルで、「いいね」のよう...
-
エクセルの、記録を終了したマ...
-
エクセルでマクロ(Excel 4.0)...
-
複数のマクロボタンをまとめて...
-
エクセルマクロで、別のブック...
-
WORDを使って印刷部数分の連番...
-
マクロをマクロを使ってコピー...
-
Ctrl+Zが使えない
-
【マクロ】マクロボタンをクリ...
-
エクセル マクロ【モジュール...
-
Excelで、マクロが含まれ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WPSOffice_マクロの有効化について
-
Excel マクロの編集がグレーに...
-
Excelのマクロでボタンを押すと...
-
エクセル ボタンに設定したマク...
-
エクセルで、「いいね」のよう...
-
エクセルの表を複数枚印刷した...
-
エクセル マクロ名にブック名...
-
エクセルの、記録を終了したマ...
-
エクセルマクロで、別のブック...
-
複数のマクロボタンをまとめて...
-
Excelマクロで、稼働中のマクロ...
-
エクセルでマクロ(Excel 4.0)...
-
エクセルで明日の日付を表示す...
-
(Excel VBA)シートコピー時マ...
-
EXCELのマクロが他のパソコンで...
-
マクロをマクロを使ってコピー...
-
マクロ実行ボタンを自動削除したい
-
なぜマクロの記録がなくなって...
-
別シートのマクロボタンをマク...
-
VBAについての質問です
おすすめ情報