忍者ブログ

ブラウザ履歴をエクセルシートに出力するマクロ

2020年02月11日
同じ機能を有するマクロを書いたことがあって、
業務日誌やお気に入り集として活用しているけど、いかんせん重い。

今日は、配列を使って書き直してみた。

なお、ブラウザの履歴を取得する部分は丸パクリです。

cells(j,*)としていたところをArr(j,*)に変えただけ。

最後にArrをシートに転記。cells(*,*).resizeが便利。

要素数は仮で1万件としている。


出力の初期化をせずに毎度1万件の配列を出力するよりは
初期化して、j行まで転記としたほうが2.5倍早かった。

2020/02/12 追記
会社で試してみたら、効果なし。。。

2千行もいかないようなデータをがんばって配列にしたところで
目に見える効果はありませんでした。


Sub ブラウザ履歴を取得してメッセージ()
Dim tictoc As Double
tictoc = Timer
'Debug.Print "[" & Now & "] "; Format(Timer - tictoc, "0.00秒")
    Dim WS As Worksheet:    Set WS = Worksheets("最近")
    Dim kWS As Worksheet:   Set kWS = Worksheets("過去")
Dim shell
Dim f, f2, f3
Dim i, i2, i3
Dim j As Long: j = 0
Dim k As Long
Dim Arr(): ReDim Arr(10000, 7)
    Dim USERname As String: USERname = ユーザー名取得
    
    Set shell = CreateObject("Shell.Application")
    Set f = shell.Namespace("C:\Users\" & ユーザー名取得 & "\AppData\Local\Microsoft\Windows\History")
    
    Dim strAddress As String, strDate As String
    For Each i In f.Items
        DoEvents
        Set f2 = i.GetFolder
        For Each i2 In f2.Items
            Set f3 = i2.GetFolder
            For Each i3 In f3.Items
                j = j + 1
                strAddress = Replace(f3.getdetailsof(i3, 0), "%20", "")  '0:あどれす 1:タイトル 2:最終表示日時
                strDate = f3.getdetailsof(i3, 2)
                'Arr(j, 0) = i.Name
                Arr(j, 1) = i2.Name
                Arr(j, 2) = strDate '0:あどれす 1:タイトル 2:最終表示日時
                Arr(j, 4) = f3.getdetailsof(i3, 1)  '0:あどれす 1:タイトル 2:最終表示日時
                Arr(j, 5) = strAddress
                Arr(j, 6) = Left(strDate, 10)
                'Arr(j, 6) = DayGet日付取得(strDate)
                Arr(j, 7) = Right(strDate, 6)
                'Arr(j, 7) = TimeGet時刻取得(strDate)
            Next
        Next
    Next
    'タイトル作成
    Arr(0, 0) = f.getdetailsof("", 0)
    Arr(0, 1) = f2.getdetailsof("", 0)
    Arr(0, 2) = f3.getdetailsof("", 2) '0:あどれす 1:タイトル 2:最終表示日時
    Arr(0, 3) = "link"
    Arr(0, 4) = f3.getdetailsof("", 1)  '0:あどれす 1:タイトル 2:最終表示日時
    Arr(0, 5) = f3.getdetailsof("", 0) '
    Arr(0, 6) = "日付"
    Arr(0, 7) = "時刻"
    
    Dim target As Range:    Set target = WS.Cells(1, 1)
    
    Dim iRowMax:    iRowMax = UBound(Arr, 1) - LBound(Arr, 1) + 1 '// 1次元目の要素数を取得 '// 二次元配列の最大行数
    Dim iColMax:    iColMax = UBound(Arr, 2) - LBound(Arr, 2) + 1 '// 2次元目の要素数を取得'// 二次元配列の最大列数
'    target.Resize(iRowMax, iColMax).Value = Arr
    target.Resize(iRowMax, iColMax).ClearContents
    target.Resize(j, iColMax).Value = Arr
Debug.Print "[" & Now & "] "; Format(Timer - tictoc, "0.00秒")
End Sub
Private Function ユーザー名取得()
    Dim WshNetworkObject As Object
    Set WshNetworkObject = CreateObject("WScript.Network")
    ユーザー名取得 = WshNetworkObject.USERname
    Set WshNetworkObject = Nothing
End Function

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字