VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. Other
  3. movingserver


WebServerのお引っ越し援用

プロバイダーが無料ホームページサービスを打ち切るというので、Webサーバーの引っ越しを余儀なくされました
サイトの管理ソフトを使用していますし、今時考えられないほど小容量のサービスでしたので、ファイルの引っ越し自体は容易でした。
ただ単純に引っ越すと、検索サイトの評価がリセットされてしまいますので、引き継ぐ方法を調べてみました。
301リダイレクトというのがあるそうですが、Appacheの.htaccessを編集できるWebサーバーである事が前提で、 何もいじれない現行サイトは対象外です。
代替策を検索してみると、
link rel=”canonical”タグにより、検索エンジン(クローラー)に対して「代替先のページ」を指定することと、
meta http-equiv="refresh"タグにより、設定時間後に新サイトに遷移させる事を
併用する方法がありそうです。
サイトの管理ソフトにより、全ページから新サイトのトップページに飛ぶ設定は容易ですが、各ページ毎に対応する新ページを 設定する事は難しそうなので、VBAで自動化してみました。
全ページTitleタグの中味が同じという手抜き?でしたので、そこを置換する事で、header内に所期の情報を埋め込みました。
百数十のページがありましたが、実行は一瞬で、ちゃんと動いているかどうか心配になる程でした。至極簡単なテキスト処理なのでしょう。
検索サイトの検索結果に、翌日は反映されていませんでしたが、翌々日には新しいUrlに変更されていました。

※当方の事情に合わせて、htmlは文字コードUTF-8での書込みとなっています。


Dim fileList As Collection
Dim FSO As Object
Dim folderName As String

Const homeUrl As String = "http://gdipluscode.sakura.ne.jp/"

'ホームページの移行支援
'検索エンジンの評価継続対策
Sub setNewAddressOnHtml()
  Dim I As Long
  Dim counter As Long
  
    folderName = myGetFolder
    If folderName = "" Then Exit Sub
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set fileList = New Collection
    '再帰的に指定フォルダー内のパス群をCollectionに取得
    Call searchSubFolder(FSO.GetFolder(folderName))
    
    For I = 1 To fileList.Count
    With fileList(I)
      If Not Left(fileList(I).parentFolder.Name, 1) = "_" Then
        If LCase(FSO.GetExtensionName(.Path)) = "html" Or LCase(FSO.GetExtensionName(.Path)) = "htm" Then
          treatUTF8 .Path
        End If
      End If
    End With
    Next
    Set FSO = Nothing
End Sub

'各ファイルの書き換え処理
Private Sub treatUTF8(filePath As String)
  Dim bytData() As Byte
  Dim buf As String
  Dim strLink As String
  Dim strMeta As String
  Dim newdata As String
  Dim url As String
  
  Const adTypeText = 2
  Const adTypeBinary = 1
  Const adSaveCreateOverWrite = 2 ' adSaveCreateNotExist = 1
  Const adreadall = -1
  Const adreadline = -2
  
  'ローカルの保管場所のファイルパスから新サーバーのUrlに変換
  If LCase(FSO.getfilename(filePath)) <> "index.html" And LCase(FSO.getfilename(filePath)) <> "index.htm" Then
    url = homeUrl & Replace(Replace(filePath, folderName & "\", ""), "\", "/")
  Else
    url = homeUrl
  End If
    
  '追加データの生成
  newdata = "<title>GDIplusCODE</title>"
  strLink = "<link rel=""canonical"" href=""" & url & """ />"
  strMeta = "<meta http-equiv=""refresh"" content=""5; url=" & url & """ />"
  newdata = newdata & vbCrLf & strLink & vbCrLf & strMeta
  
  'ファイルを開いて処理
  With CreateObject("ADODB.Stream")
      'Streamのオープン
      .Open
      ' UTF-8に変換
      .Type = adTypeText
      .Charset = "UTF-8"
      'ファイル読み込み
      .LoadFromFile (filePath)
      buf = .readText(adreadall) 'すべて読み込み
      'タイトルタグ部に情報を追加する
      buf = Replace(buf, "<title>GDIplusCODE</title>", newdata)
      '上書き保存
      .Position = 0
      .WriteText buf
      .SaveToFile filePath, adSaveCreateOverWrite
      .Close
  End With
End Sub

'指定フォルダー以下のファイルを再帰検索
Private Sub searchSubFolder(parentFolder As Object)
    Dim subFolder As Object
    Dim myFile As Object
    
    For Each subFolder In parentFolder.SubFolders
    Call searchSubFolder(subFolder)
    Next subFolder
    
    For Each myFile In parentFolder.Files
    fileList.Add Item:=myFile
    Next myFile
    Set parentFolder = Nothing
End Sub

'ダイアログを開いてフォルダを取得
Private Function myGetFolder() As String
  Dim objShell  As Object 'Shell
  Dim objFolder As Object 'Shell32.Folder
  Const strTitle = "フォルダを選択してください。"

  'シェルのオブジェクトを作成する
  Set objShell = CreateObject("Shell.Application")
  'フォルダー参照に設定
  Const lngRef = &H1
  'ルートフォルダーをMy Documentsに設定
  Const fldRoot = &H5
  Set objFolder = _
    objShell.BrowseForFolder(0, _
    strTitle, lngRef, fldRoot)
  Set objShell = Nothing
  
  'フォルダー名を取出す
  Dim strMSG
  If objFolder Is Nothing Then 'キャンセルチェック
    myGetFolder = ""
  Else
    If objFolder.parentFolder Is Nothing Then
      'ルートが選択された時
      myGetFolder = ""
    Else
      myGetFolder = objFolder.Items.Item.Path
    End If
  End If
    
End Function