URLを貼ったExcelファイルがあるのですが
そのリンクが有効かチェックするマクロを組みたいです。
Excel、Libre office、Open Officeどれかで実行できればいいです。
URLは、開くとPDFファイルがダウンロードできるものがほとんどです。HTMLもあったかも?とにかくすべてのタイプのURLをチェックしたいです。
以下のマクロを作ってみました。
チェックしたいファイルのパスを入力すると、URLをすべてチェックして表に◯か×を書く仕様です。
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Sub LinkChecker()
Dim ToolBook As Object
ToolBook = ThisWorkbook.sheets(1)
'■対象ファイルのURL記載位置を取得
Dim URLRange As String
URLRange = ToolBook.Range("G4")
'■ファイルパス開始位置を指定
Dim r As Long
Dim l As Long
Dim objURL As String
r = 13
l = 2
ActiveWindow.WindowState = xlMinimized 'ツールを最小化
Do While ToolBook.Cells(r, l) <> "" 'ファイルパス(B列)が空欄になるまで処理をループ
Dim objFile As String
objFile = ToolBook.Cells(r, l)
Workbooks.Open objFile
Dim wb As Workbook 'ブック格納
Dim sh As Worksheet
Dim countSh As Long
countSh = ActiveWorkbook.Sheets.Count 'シートの総数を取得
Dim bookName As String
bookName = ActiveWorkbook.Name '開いたファイル名を取得
ActiveWindow.WindowState = xlMinimized '対象ファイルも邪魔なので最小化
Dim a As Long
a = 1
Do While a > countSh
Dim objSh As Object
objSh = ActiveWorkbook.Sheets(a)
objURL = objSh.Range(URLRange)
Dim isURL As Long
isURL = InStr(1, objURL, "http")
If isURL > 0 Then
ThisWorkbook.Activate
l = l + 1
ToolBook.Cells(r, l) = objURL
If GetWebStatus(objURL) = "200" Then
'■リンク切れ確認処理
'---IE起動
Dim objIE As InternetExplorer 'IEを用意
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = True
objIE.navigate objURL
Call IEWait(objIE)
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.document.all(0).outerHTML 'htmlをすべて取得
Dim cannotFind As Long
Dim cannnotDes As Long
Dim cannotView As Long
cannotFind = InStr(1, htmlDoc, "見つかりませ")
cannnotDes = InStr(1, htmlDoc, "表示できませ")
cannotView = InStr(1, htmlDoc, "見られませ")
If cannotFind + cannnotDes + cannotView >0 Then
ThisWorkbook.Activate
ToolBook.Cells(r+1, l) = "×"
Call Act(wb, bookName)
Else
ThisWorkbook.Activate
ToolBook.Cells(r+1, l) = "〇"
Call Act(wb, bookName)
End If
objIE.Quit
Else
ThisWorkbook.Activate
ToolBook.Cells(r+1, l) = "×"
Call Act(wb, bookName)
End If
End If
a = a + 1
Call Act(wb, bookName)
Loop
call Act(wb, bookName)
ActiveWorkbook.Close
l = 2
r = r + 2
ThisWorkbook.Activate
Loop
MsgBox ("チェックが完了しました")
End Sub
'---------------------------------------------------------------------------------------------------
Function IEWait(objIE As InternetExplorer)
Do While objIE.Busy = True
DoEvents
Loop
End Function
'---------------------------------------------------------------------------------------------------
Function Act(wb As Workbook, bName As String)
For Each wb In Workbooks
If wb.Name = bName Then
wb.Activate
End If
Next
End Function
'---------------------------------------------------------------------------------------------------
Function GetWebStatus(URL As String) As String
Dim WinHttp As Object
'"WinHttp.WinHttpRequest.5.1"ではうまくいかなかったため
'"MSXML2.XMLHTTP"を利用
'Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Set WinHttp = CreateObject("MSXML2.XMLHTTP")
On Error GoTo INVALID
WinHttp.Open "GET", URL, False
WinHttp.send 'GETリクエストを送信
GetWebStatus = WinHttp.Status 'ステータスコードをセット
Set WinHttp = Nothing
Exit Function
INVALID:
GetWebStatus = "Invalid URL"
Set WinHttp = Nothing
End Function
'--------------------------------------------<End of Code>-------------------------------------
しかしLibreで実行すると以下のエラーでURLを開けません。
BASIC ランタイムエラー.
'1'
Type: com.sun.star.lang.IllegalArgumentException
Message: Unsupported URL <>: "from LoadEnv::initializeLoading"
PDFのURLだから?エラーをググってみてもよくわかりません…。
どこが間違っているか教えていただきたいです。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
以下は、昔作ったものを、多少、手を手を入れてみました。
Windows、Excel用のマクロコードです。
WinHTTP Servoces. version 5.1
は、ふつう、C:\WINDOWS\system32\winhttpcom.dll
として入ってますが、同様に使えるなら他のものでも可能です。
A列に入れてお試しください。
以下は、ゲイト式やダミーページを間に入れているサイトでは、この方法では取れません。
'//
Sub TestURlChecker()
For Each c In Range("A1", Cells(Rows.Count, "A").End(xlUp))
If c.Value <> "" Then
If c.Offset(, 1).Value = "" Then
buf = URLExists(c.Value)
c.Offset(, 1).Value = buf
DoEvents
End If
End If
Next c
End Sub
Function URLExists(URL As String)
Dim Request As Object
Dim ff As Long
Dim ii As Long
Dim rc As Variant
On Error GoTo EndNow
Set Request = CreateObject("WinHttp.WinHttpRequest.5.1")
With Request
.Open "GET", URL, False
.send
ii = InStr(1, Request.responseText, "charset=""", vbTextCompare)
rc = .StatusText
End With
Set Request = Nothing
If ii = 0 And rc = "OK" Then
URLExists = True
ElseIf ii > 0 And rc = "OK" Then
URLExists = "??"
Else
URLExists = False
End If
Exit Function
EndNow:
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Excel VBAでリンク切れをチェックしたい。
Excel(エクセル)
-
URLのリンク切れをマクロを使って表示する方法を教えてください。
その他(プログラミング・Web制作)
-
EXCEL VBAで、URLを入力して、そのURLが存在するかどうか調べるような命令はあるでしょうか。
Visual Basic(VBA)
-
-
4
【エクセル】ハイパーリンク先のチェック
Excel(エクセル)
-
5
Excel でのリンク切れの探し方
Excel(エクセル)
-
6
EXCEL VBAでたくさんのURLの一覧からHTTPレスポンスコードを取得したい。
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBA 指定したファイルが...
-
フォルダ内のexcelファイルを順...
-
エクセルのシートの数を数えた...
-
エクセルマクロで不特定なファ...
-
エクセルのxls形式からxlsx形式...
-
ファイルを開かずにマクロを実行
-
VBAでワークブックの名前を変数...
-
ACCESS VBAでファイルを開くダ...
-
ファイルの保存場所を変えたら...
-
VBA EXCELファイル選択⇒指定セ...
-
エクセル(マクロ)のファイル...
-
Accessのaccdbファイルを起動で...
-
エクセルマクロ 異なるファイ...
-
ファイル名を変更するマクロ
-
<ACCESS VBA -> EXCEL>getObjec...
-
LTSpiceにLMV358-Nのモデルを入...
-
EXCELマクロを無効にして開く方法
-
Excel VBA でファイルが開かれ...
-
vba初心者です。 質問です。 毎...
-
フォルダ内のブック全部にパス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCEL VBA 指定したファイルが...
-
エクセルマクロで不特定なファ...
-
VBAでワークブックの名前を変数...
-
エクセル 複数ファイルの一括...
-
フォルダ内のexcelファイルを順...
-
エクセルのxls形式からxlsx形式...
-
【Excel VBA】ファイル名が一...
-
エクセル(マクロ)のファイル...
-
vlookup関数の引数を変数で指定...
-
ファイルを開かずにマクロを実行
-
エクセルのシートの数を数えた...
-
Accessのaccdbファイルを起動で...
-
エクセルマクロ 異なるファイ...
-
vba初心者です。 質問です。 毎...
-
ファイルの保存場所を変えたら...
-
Excel VBA でファイルが開かれ...
-
accessフォルダを移動したらフ...
-
リンク切れチェックを行うマクロ
-
フォルダ内のブック全部にパス...
-
ACCESS VBAでファイルを開くダ...
おすすめ情報