WordPressのプラグイン Pretty Links のクリック統計を集計する マクロ(Excel VBA)です。
Pretty Links 3.2.3 が出力するクリック統計で動作確認しています。
所詮Excelグラフなので、描画できる以上のデータを与えたり、ちょっと例外があると止まります(メンテナンスできる方向け)。
概要
ボタンを押して、[Pretty Links]-[クリック統計] から出力されるcsvファイルを読み込ませてください。結果はデスクトップに「yymmddhhmmss_all_links_pretty_link_clicks_9-9999_9.xlsx」という名前で出力されます。
シートが3つ出力されます。
コード
Sub PrettyLinksTotal() Dim FSO As Object 'ファイルシステムオブジェクト Dim FD As FileDialog, f As Variant 'ファイルダイアログ用変数 Dim DefaultPath As String 'ファイルダイアログのデフォルト表示パス Dim wKLine As String '1行 Dim wkLineCm As Variant '1行をカンマ区切りで分割した配列 Dim wkData Dim strBaseName As String '拡張子なしのファイル名 Dim blnTimestamp As Boolean 'Timestamp が存在するかどうかのフラグ Dim blnLink As Boolean 'Link が存在するかどうかのフラグ Dim xlsWorkbookOutput As Workbook '出力ファイル Dim shName As String 'シート名(可変。csvファイルからつける) Const shPivot As String = "Pivot_Link" 'シート名(固定) Dim temp As Long '出力ファイル作成時のデフォルトワークシート数保存用 Dim x As Long, y As Long Dim lngMaxCol As Long Dim strOutputFileName As String '出力ファイル名 Const strExtName As String = "xlsx" '出力ファイル名の拡張子 Dim i As Long Const intColHeadColer As Long = 15917529 '出力ファイルの表見出しの色(水色) Dim strOutputFont As String '出力ファイルに使うフォント 'ファイルシステムオブジェクト Set FSO = CreateObject("Scripting.FileSystemObject") '出力ファイルに使うフォント strOutputFont = "" ThisWorkbook.Activate Worksheets("tool").Select Cells(1, 1).Select 'セルを選択してないとCommandbarsのListCountがエラーになる With Application.CommandBars.FindControl(ID:=1728) For i = 1 To .ListCount If .List(i) = "BIZ UDゴシック" Then strOutputFont = "BIZ UDゴシック" Exit For End If Next i End With If strOutputFont = "" Then strOutputFont = "MS ゴシック" End If '-------------------------------------- 'ファイルダイアログ '-------------------------------------- 'ファイルダイアログ Set FD = Application.FileDialog(msoFileDialogOpen) 'デフォルトで表示するフォルダ DefaultPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\..\Downloads" & "\" 'ダウンロードフォルダ、"\"まで入れる With FD .AllowMultiSelect = False 'ファイルの複数選択は不可 .InitialFileName = DefaultPath 'デフォルトフォルダ With .Filters ''「ファイルの種類」をクリア .Clear .Add "PrettyLinks", "*.csv" End With If .Show = True Then 'ダイアログが返したファイルの読み込み For Each f In .SelectedItems '-------------------------------------- '出力ファイル作成 '-------------------------------------- temp = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 Set xlsWorkbookOutput = Workbooks.Add Application.SheetsInNewWorkbook = temp 'シート名 strBaseName = FSO.GetBaseName(f) shName = Left(strBaseName, 12) '「yyyymmddss_all_links_pretty_link_clicks_x-xxx.csv」の日付部(UTC) xlsWorkbookOutput.ActiveSheet.Name = shName 'フォント(標準を変更) xlsWorkbookOutput.Styles("Normal").Font.Name = strOutputFont 'ウィンドウ枠の固定 xlsWorkbookOutput.Worksheets(shName).Cells(2, 1).Select ActiveWindow.FreezePanes = True '列の幅 Columns("A:A").ColumnWidth = 15 'Browser Columns("B:B").ColumnWidth = 10 'Browser Version Columns("C:C").ColumnWidth = 15 'Platform Columns("D:D").ColumnWidth = 18 'IP Columns("E:E").ColumnWidth = 18 'Visitor ID Columns("F:F").ColumnWidth = 22 'Timestamp Columns("G:G").ColumnWidth = 40 'Host Columns("H:H").ColumnWidth = 35 'URI Columns("I:I").ColumnWidth = 40 'Referrer Columns("J:J").ColumnWidth = 30 'Link '列の書式 Columns("D:E").NumberFormatLocal = "@" '全列にデータがある項目のみ文字列(配列貼付するため) Columns("F:F").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss" 'ファイルの読み込み(カンマ区切り、ダブルコーテーション括り) x = 0 blnTimestamp = False blnLink = False ReDim wkData(99999, 100) '適当に大きな配列 With CreateObject("ADODB.Stream") .Charset = "UTF-8" '文字コード .LineSeparator = 10 '改行LF(10) 'ファイルオープン .Open .LoadFromFile f Do Until .EOS wKLine = .ReadText(-2) wkLineCm = Split(wKLine, ",") x = x + 1 If x = 1 Then lngMaxCol = UBound(wkLineCm) + 1 If x > 99999 Then Exit Do For y = 0 To UBound(wkLineCm) If Len(wkLineCm(y)) >= 2 Then '2文字以上 wkData(x - 1, y) = Mid(wkLineCm(y), 2, Len(wkLineCm(y)) - 2) Else '1文字以下ならそのまま出力(エラー回避) wkData(x - 1, y) = wkLineCm(y) End If Next y Loop 'ファイルクローズ .Close Worksheets(shName).Range("A1").Resize(99999, 100) = wkData End With '-------------------------------------- '出力ファイルの見栄え設定 '-------------------------------------- With xlsWorkbookOutput.Worksheets(shName) '表見出しの背景色 .Range(Cells(1, 1), Cells(1, lngMaxCol)).Interior.Color = intColHeadColer 'オートフィルタ設定 .Cells.AutoFilter End With Next f Else Exit Sub End If End With '出力ファイルがある場合 If Not xlsWorkbookOutput Is Nothing Then '-------------------------------------- 'ピボットテーブルの作成 '-------------------------------------- '1行目にTimestampとLinkが存在するかチェック(ピボットテーブルで使うため) blnTimestamp = False blnLink = False For y = 0 To lngMaxCol If Cells(1, y + 1) = "Timestamp" Then blnTimestamp = True If Cells(1, y + 1) = "Link" Then blnLink = True Next y 'TimestampとLinkがある場合、ピボットテーブルの作成 If blnTimestamp = True And blnLink = True Then xlsWorkbookOutput.PivotCaches.Create(xlDatabase, _ Worksheets(shName).UsedRange).CreatePivotTable Sheets.Add.Range("A3") With ActiveSheet.PivotTables(1) .PivotFields("Link").Orientation = xlRowField 'Linkが縦 .PivotFields("Timestamp").Orientation = xlColumnField 'TimeStampが横 .PivotFields("Timestamp").AutoGroup 'TimeStampは日付型なので自動グループ化 .PivotFields("四半期").Orientation = xlHidden 'TimeStampの四半期は非表示(好み) .PivotFields("年").ShowDetail = True 'TimeStampの年を展開 .PivotFields("Link").Orientation = xlDataField '集計する値 .PivotFields("Link").AutoSort xlDescending, "個数 / Link" '並び替え(降順) End With 'シート名とタイトル ActiveSheet.Name = shPivot Cells(1, 1) = "Link 集計" End If '-------------------------------------- '出力ファイル保存 '-------------------------------------- DefaultPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" strOutputFileName = strBaseName i = 0 Do If FSO.FileExists(DefaultPath & "\" & strOutputFileName & "." & strExtName) = False Then Exit Do Else 'ファイル名 i = i + 1 strOutputFileName = strBaseName & "_" & i End If Loop 'ファイルを保存 xlsWorkbookOutput.SaveAs Filename:=DefaultPath & strOutputFileName & "." & strExtName '-------------------------------------- 'グラフ出力 '-------------------------------------- '積み上げ横棒グラフ With Worksheets(shPivot).Shapes.AddChart.Chart .ChartType = xlBarStacked .SetSourceData Worksheets(shPivot).Range("A3").CurrentRegion .Location Where:=xlLocationAsNewSheet End With With ActiveChart '緑 .ChartColor = 26 '軸の要素の間隔 .FullSeriesCollection(1).Select .ChartGroups(1).GapWidth = 50 '軸 .Axes(xlCategory).TickLabels.Font.Name = strOutputFont 'フォント '凡例 With .Legend .Position = xlCorner '位置は右上 .IncludeInLayout = False 'グラフに重ねて表示 .Font.Name = strOutputFont 'フォント End With End With 'グラフシート名 ActiveSheet.Name = "グラフ_Link" '-------------------------------------- '出力ファイル上書き保存 '-------------------------------------- xlsWorkbookOutput.Save End If '完了メッセージ MsgBox "終了しました。" & vbLf & vbLf & _ "出力ファイル:" & DefaultPath & xlsWorkbookOutput.Name & vbCrLf & vbCrLf, _ vbOKOnly + vbInformation, Title:="終了" Set FSO = Nothing Set FD = Nothing Set f = Nothing Set wkLineCm = Nothing Set xlsWorkbookOutput = Nothing End Sub
補足
- クリック統計のフォーマットのバリエーションは調べきれてませんが、デフォルトで出力されるフォーマットで問題なく動作することを確認して公開しています。もし動かない場合はどういう設定になっているのかご連絡ください。時間があるときに、私の環境で再現可能な範囲で善処します。
- クリック統計ファイルの最大行数がどこまでいくのかわからないのですが、ツール上は99999行読めるように作ってあります。行数が多くなると、Excelがまともに動くのかという心配がありますが…。
- クリック統計ファイルにおいて、Linksが多い場合や期間が長い場合、グラフ作成がエラーになったり、表示されるグラフがおかしくなるかもしれません。Excel側で上限値を設けていないのもあってきっちり作り込むのは難しそうです。代わりに、グラフ作成でエラーになる可能性を考慮して、作成直前で出力ファイルを保存するようにしました。(読み込ませるクリック統計ファイル側をエディタで加工して列を減らしてもらうのがよいです)