metaタグ修正のVBA
仕事でHTMLファイル編集する必要が出てきたので
EXCELVBAで組んでみた。
大量のHTMLファイルを修正する際に使えそうなので
メモしとくまぁ、過去問の応用編みたいな感じです。
相変わらずエラー制御は甘い
ちなみに<は全角に置き換えてるんで注意ください。
あくまで主要ロジック箇所だけ抜き出しているだけなので、
これだけコピペしても動きません。
エラー制御がしっかりかけてメタタグがない場合のロジックがかけたら
どっかで公開してもいいかなぁと。
お役に立てていただけると幸いです。
EXCELVBAで組んでみた。
大量のHTMLファイルを修正する際に使えそうなので
メモしとくまぁ、過去問の応用編みたいな感じです。
相変わらずエラー制御は甘い
ちなみに<は全角に置き換えてるんで注意ください。
Option Explicit
Public Type metaExcelRtn
code As Boolean
excelFilepath As String
meta_Discription As String
meta_Keyword As String
meta_title As String
End Type
'meta変換用EXCELシート読込
Function readMetaExcel(readmetaExcelbook As Variant) As metaExcelRtn()
On Error GoTo Error_Sub
Dim orgExcel As Workbook
Dim orgWorksheet As Worksheet
Dim sn As Long 'シート番号
Dim sc As String '開始列
Dim ec As String '終了列
Dim rowCount As Long
Dim colCount As Long
Dim i As Long
Dim rtnVal() As metaExcelRtn
Dim t_title As Long
Dim t_keyword As Long
Dim t_description As Long
Dim fpath As Long
Const STAR = "J"
Const ENDR = "L"
'読込EXCEL指定
Set orgExcel = Workbooks.Open(readmetaExcelbook)
sn = InputBox("読込対象のシート番号を入力してください。", "シート番号読取", 1)
If IsNumeric(sn) Then
Set orgWorksheet = orgExcel.Worksheets(sn)
Else
MsgBox ("番号で入力してください。")
Exit Function
End If
'meta記載箇所の指定
sc = InputBox("メタタグ読込開始列アルファベットを入力してください。", "列読取", STAR)
If sc Like "[A-Z]" = True Then
ec = InputBox("メタタグ読込終了列アルファベットを入力してください。", "列読取", ENDR)
If ec Like "[A-Z]" = True Then
rowCount = Cells(Rows.Count, 1).End(xlUp).Row + 1 '最終行番号を取得
colCount = Cells(1, Columns.Count).End(xlToLeft).Column
'タイトル行判別を取得しそれぞれの列アルファベットを取得
For i = colCount To 1 Step -1
If Cells(1, i).Value Like "*FILE_PATH*" Then
fpath = Cells(1, i).Column
ElseIf Cells(1, i).Value Like "*DESCRIPTION*" Then
t_description = Cells(1, i).Column
ElseIf Cells(1, i).Value Like "*KYEWORD*" Then
t_keyword = Cells(1, i).Column
ElseIf Cells(1, i).Value Like "*TITLE*" Then
t_title = Cells(1, i).Column
End If
Next i
'格納用配列定義
ReDim rtnVal(rowCount)
For i = 1 To rowCount
rtnVal(i).code = True
rtnVal(i).excelFilepath = Cells(i, fpath).Value
rtnVal(i).meta_Discription = Cells(i, t_description).Value
rtnVal(i).meta_Keyword = Cells(i, t_keyword).Value
rtnVal(i).meta_title = Cells(i, t_title).Value
Next i
Else
MsgBox ("終了列名はアルファベットで入力してください。")
Exit Function
End If
Else
MsgBox ("開始列名はアルファベットで入力してください。")
Exit Function
End If
orgExcel.Close
Set orgExcel = Nothing
readMetaExcel = rtnVal
Exit Function
Error_Sub:
For i = 1 To rowCount
rtnVal(i).code = False
Next i
readMetaExcel = rtnVal
MsgBox ("ERROR:" & Err.Number & ":" & Err.Description)
End Function
' フォルダ内のファイル名を取得し変換対象シートのファイル名と比較する
Function FileSearch(path As Variant, targetStrcut() As metaExcelRtn, sCol As Long) As String
On Error GoTo Error_Sub
Dim objFs As Object, objFiles As Object, objFolders As Object, objHtml As Object
Dim File_Path As String, File_Name As String
Dim i As Long, arrData
Dim j As Long
Dim s As Variant
Dim wHtml As String
'タグ
Dim start_metaDis As String
start_metaDis = "<meta name=" & Chr(34) & "description" & Chr(34) & " content=" & Chr(34)
Dim start_Metakey As String
start_Metakey = "<meta name=" & Chr(34) & "keywords" & Chr(34) & " content=" & Chr(34)
Dim end_tag As String
end_tag = Chr(34) & ">"
Dim start_Title As String
start_Title = "<title>"
Dim end_Title As String
end_Title = "</title>"
Application.ScreenUpdating = False
Set objFs = CreateObject("Scripting.FileSystemObject")
i = sCol
'パスの取得
For Each objFolders In objFs.getFolder(path).SubFolders
'サブフォルダまで検索するために再帰実行
Call FileSearch(objFolders.path, targetStrcut, i)
Next
'ファイル名の取得
For Each objFiles In objFs.getFolder(path).Files
If objFs.GetExtensionName(objFiles.path) = "html" Or objFs.GetExtensionName(objFiles.path) = "htm" Then
'一致したら置換
For s = LBound(targetStrcut) To UBound(targetStrcut)
If targetStrcut(s).excelFilepath = objFiles.path Then
wHtml = readHtml(objFiles.path)
'description
If targetStrcut(s).meta_Discription <> "" Then
wHtml = metaTranslate(wHtml, start_metaDis, end_tag, targetStrcut(s).meta_Discription)
End If
'keyword
If targetStrcut(s).meta_Keyword <> "" Then
wHtml = metaTranslate(wHtml, start_Metakey, end_tag, targetStrcut(s).meta_Keyword)
End If
'title
If targetStrcut(s).meta_title <> "" Then
wHtml = metaTranslate(wHtml, start_Title, end_Title, targetStrcut(s).meta_title)
End If
'HTMLファイルをUTF-8で保存
Call saveHtml(wHtml, objFiles.path)
End If
Next s
End If
Next
sCol = i
Application.ScreenUpdating = True
FileSearch = "True"
Exit Function
Error_Sub: 'あまりよろしくないが予期せぬエラー処理
Application.ScreenUpdating = True
FileSearch = "False"
MsgBox ("ERROR:" & Err.Number & ":" & Err.Description)
End Function
'読込んだHTMLを返す
Function readHtml(fileName As String) As String
On Error GoTo Error_Sub
Dim buf_strTxt As String '読み込みバッファ
'全文読み込み
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile fileName
buf_strTxt = .ReadText
.Close
End With
readHtml = buf_strTxt
Exit Function
Error_Sub:
readHtml = "False"
MsgBox ("ERROR:" & Err.Number & ":" & Err.Description)
End Function
'含む文字列が存在すればその間を置換、存在しなければ挿入
Function metaTranslate(targetHtml As String, startText As String, endText As String, Newtext As String) As String
'Dim wkText As String
Dim replaceWord As Variant
Dim fPos As Long
Dim dPos As Long
Dim Reg As Object
Dim mc As Object
Dim Match As Object
Set Reg = CreateObject("VBScript.RegExp")
With Reg
.Pattern = startText & "[\s\S]*?" & endText 'パターン設定
.IgnoreCase = False '大文字小文字を区別
.Global = True '文字列全体を検索
End With
If InStr(targetHtml, startText) <> 0 Then
'開始文字列と終了文字列の間を置換する
Set mc = Reg.Execute(targetHtml)
If mc.Count <> 0 Then
For Each Match In mc
metaTranslate = Replace(targetHtml, Match.Value, Newtext)
Next
End If
Set Reg = Nothing
Else
'メタタグを挿入する
'TOTO メタタグがない場合にheadタグの間に埋め込むロジック必要
End If
End Function
'HTMLファイルを保存する
Function saveHtml(buf_strTxt As String, fileName As String) As String
On Error GoTo Error_Sub
'全文書き込み
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Type = 2
.Open
.WriteText buf_strTxt
.SaveToFile (fileName), 2
.Close
End With
saveHtml = "True"
Exit Function
Error_Sub:
saveHtml = "False"
MsgBox ("ERROR:" & Err.Number & ":" & Err.Description)
End Function
あくまで主要ロジック箇所だけ抜き出しているだけなので、
これだけコピペしても動きません。
エラー制御がしっかりかけてメタタグがない場合のロジックがかけたら
どっかで公開してもいいかなぁと。
お役に立てていただけると幸いです。
コメント