I have made a logfile parsing tool using grep that creates 2 text files. 1 text file contains all the error codes + error messages and the other only the error codes.
I import them via a simple vba script into an excel file. Then I have two macro's that make text to columns so it is possible for the excel to read them more easily, this works fine.
The error codes + error messages (on sheet 2) only contain the codes + messages after the macro to put them into a column and then the doubles are deleted, making it a sort of list where the user can then see what error codes gives which message. This is OK.
The error codes are then put into Sheet 1 and the macro just creates a list of all the codes in column A.
Now, what I would like to do is have a macro that will take all of these error codes (the range will differ depending on which log file has been parsed an how many error codes it will contain) and put them into a histogram so the user can see visually which error codes comes up the most.
My ideal situation would be that the user just defines a path and then everything else is automated to the point where the histogram will show up and gives a clear look on which error is comming back the most.
What I have so far is that the grep parses through the log file and makes a few new txt files. The Excel file is then opened automatically and the txt files are being brought in automatically into the correct sheets. Then the macros are doing their things.
What I would need help with is how to create an automation for the histogram. I tried to search a lot on google and on here but most of the code is so convoluted and so big that it is not helpful for what I am trying to do here. I hope I can find an easy solution to this issue.
Thanks in advance for your ideas!
When recording a macro like Norie suggested, I get the following error:
Run Time error '1004' Application defined or Object defined error.
This is the code that the VBA then produces automatically:
Option Explicit
Sub Histogram()
'
' Histogram Macro
'
'
Columns("A:A").Select
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Sheet1!R1C1:R107C1", Version:=6).CreatePivotTable TableDestination:= _
"Sheet10!R3C1", TableName:="PivotTable25", DefaultVersion:=6
Sheets("Sheet10").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("PivotTable25")
.ColumnGrand = True
.HasAutoFormat = True
.DisplayErrorString = False
.DisplayNullString = True
.EnableDrilldown = True
.ErrorString = ""
.MergeLabels = False
.NullString = ""
.PageFieldOrder = 2
.PageFieldWrapCount = 0
.PreserveFormatting = True
.RowGrand = True
.SaveData = True
.PrintTitles = False
.RepeatItemsOnEachPrintedPage = True
.TotalsAnnotation = False
.CompactRowIndent = 1
.InGridDropZones = False
.DisplayFieldCaptions = True
.DisplayMemberPropertyTooltips = False
.DisplayContextTooltips = True
.ShowDrillIndicators = True
.PrintDrillIndicators = False
.AllowMultipleFilters = False
.SortUsingCustomLists = True
.FieldListSortAscending = False
.ShowValuesRow = False
.CalculatedMembersInFilters = False
.RowAxisLayout xlCompactRow
End With
With ActiveSheet.PivotTables("PivotTable25").PivotCache
.RefreshOnFileOpen = False
.MissingItemsLimit = xlMissingItemsDefault
End With
ActiveSheet.PivotTables("PivotTable25").RepeatAllLabels xlRepeatLabels
With ActiveSheet.PivotTables("PivotTable25").PivotFields("40520")
.Orientation = xlRowField
.Position = 1
End With
ActiveSheet.PivotTables("PivotTable25").AddDataField ActiveSheet.PivotTables( _
"PivotTable25").PivotFields("40520"), "Count of 40520", xlCount
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=Range( _
"[From notepad to excel test 1.xlsm]Sheet10!PivotTable25")
End Sub
It seems like the source is incorrect. I tried changing "Sheet1!R1C1:R107C1"
to "Sheet1!$A:$A"
but this did not help either.
I wouldn't say the source is wrong, the problem is it's hard-coded.
You need to change it so it's not hard-coded, specifically you need to change 107 to reflect the last row of data in column A on Sheet1.
Also, some other things are being give seemingly arbitrary names, e.g. PivotTable25 - it would be better if you used specific names in the code.
Another thing, you should add a header to the column with the error codes.
In the following code it's assumed the data is on Sheet1 and has a header of 'Errors', and 'ErrorPivot' has been used for the name of the pivot table being created.
Sub Histogram()
Dim wsPivot As Worksheet
Dim chtErrors As Chart
Dim ptErrors As PivotTable
Dim lngLastRow As Long
lngLastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
Set wsPivot = Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Sheet1!R1C1:R" & lngLastRow & " C1", Version:=6).CreatePivotTable TableDestination:= _
wsPivot.Name & "!R3C1", TableName:="ErrorPivot", DefaultVersion:=6
Set ptErrors = wsPivot.PivotTables("ErrorPivot")
With ptErrors
.ColumnGrand = True
.HasAutoFormat = True
.DisplayErrorString = False
.DisplayNullString = True
.EnableDrilldown = True
.ErrorString = ""
.MergeLabels = False
.NullString = ""
.PageFieldOrder = 2
.PageFieldWrapCount = 0
.PreserveFormatting = True
.RowGrand = True
.SaveData = True
.PrintTitles = False
.RepeatItemsOnEachPrintedPage = True
.TotalsAnnotation = False
.CompactRowIndent = 1
.InGridDropZones = False
.DisplayFieldCaptions = True
.DisplayMemberPropertyTooltips = False
.DisplayContextTooltips = True
.ShowDrillIndicators = True
.PrintDrillIndicators = False
.AllowMultipleFilters = False
.SortUsingCustomLists = True
.FieldListSortAscending = False
.ShowValuesRow = False
.CalculatedMembersInFilters = False
.RowAxisLayout xlCompactRow
End With
With ptErrors.PivotCache
.RefreshOnFileOpen = False
.MissingItemsLimit = xlMissingItemsDefault
End With
ptErrors.RepeatAllLabels xlRepeatLabels
ptErrors.AddDataField ptErrors.PivotFields("Errors"), "Count of Errors", xlCount
With ptErrors.PivotFields("Errors")
.Orientation = xlRowField
.Position = 1
End With
Set chtErrors = wsPivot.Shapes.AddChart2(201, xlColumnClustered).Chart
chtErrors.SetSourceData Source:=ptErrors.DataBodyRange
End Sub