创建一个宏来制作一个枢轴 table + 直方图不起作用
Creating a macro to make a pivot table + histogram does not work
我使用 grep 创建了一个日志文件解析工具,它创建了 2 个文本文件。 1 个文本文件包含所有错误代码 + 错误消息,另一个仅包含错误代码。
我通过一个简单的 vba 脚本将它们导入到 excel 文件中。然后我有两个宏将文本制作成列,因此 excel 可以更轻松地阅读它们,这很好用。
错误代码+错误信息(在sheet2)只包含宏后的代码+信息,将它们放入一列,然后删除双打,使其成为一种列表,其中然后用户可以看到哪些错误代码给出了哪些消息。这个可以。
然后将错误代码放入 Sheet 1,宏仅在 A 列中创建所有代码的列表。
现在,我想做的是有一个宏,它将获取所有这些错误代码(范围会有所不同,具体取决于已解析的日志文件以及它将包含多少错误代码)并将它们放入成直方图,以便用户可以直观地看到哪些错误代码出现最多。
我的理想情况是用户只需定义一条路径,然后其他所有内容都会自动显示直方图并清楚地显示哪个错误返回最多。
到目前为止,我所知道的是 grep 通过日志文件进行解析并生成了一些新的 txt 文件。然后 Excel 文件自动打开,txt 文件自动导入正确的 sheets。然后宏正在做他们的事情。
我需要帮助的是如何为直方图创建自动化。我尝试在 google 和此处进行大量搜索,但大部分代码都非常复杂且庞大,以至于对我在这里尝试做的事情没有帮助。我希望我能找到解决这个问题的简单方法。
提前感谢您的想法!
像 Norie 建议的那样录制宏时,出现以下错误:
运行 时间错误“1004”应用程序定义或对象定义错误。
这是 VBA 然后自动生成的代码:
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
看来来源有误。我尝试将 "Sheet1!R1C1:R107C1"
更改为 "Sheet1!$A:$A"
但这也没有帮助。
我不会说来源有误,问题是 hard-coded。
您需要将其更改为 hard-coded,具体而言,您需要更改 107 以反映 Sheet1 上 A 列中的最后一行数据。
此外,还有一些其他的东西被赋予看似随意的名称,例如PivotTable25 - 如果您在代码中使用特定名称会更好。
另外,您应该在包含错误代码的列中添加 header。
在下面的代码中,假设数据在 Sheet1 上并且具有 'Errors' 的 header,并且 'ErrorPivot' 已用于数据透视表的名称 table 正在创建。
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
我使用 grep 创建了一个日志文件解析工具,它创建了 2 个文本文件。 1 个文本文件包含所有错误代码 + 错误消息,另一个仅包含错误代码。
我通过一个简单的 vba 脚本将它们导入到 excel 文件中。然后我有两个宏将文本制作成列,因此 excel 可以更轻松地阅读它们,这很好用。
错误代码+错误信息(在sheet2)只包含宏后的代码+信息,将它们放入一列,然后删除双打,使其成为一种列表,其中然后用户可以看到哪些错误代码给出了哪些消息。这个可以。
然后将错误代码放入 Sheet 1,宏仅在 A 列中创建所有代码的列表。
现在,我想做的是有一个宏,它将获取所有这些错误代码(范围会有所不同,具体取决于已解析的日志文件以及它将包含多少错误代码)并将它们放入成直方图,以便用户可以直观地看到哪些错误代码出现最多。
我的理想情况是用户只需定义一条路径,然后其他所有内容都会自动显示直方图并清楚地显示哪个错误返回最多。
到目前为止,我所知道的是 grep 通过日志文件进行解析并生成了一些新的 txt 文件。然后 Excel 文件自动打开,txt 文件自动导入正确的 sheets。然后宏正在做他们的事情。
我需要帮助的是如何为直方图创建自动化。我尝试在 google 和此处进行大量搜索,但大部分代码都非常复杂且庞大,以至于对我在这里尝试做的事情没有帮助。我希望我能找到解决这个问题的简单方法。
提前感谢您的想法!
像 Norie 建议的那样录制宏时,出现以下错误:
运行 时间错误“1004”应用程序定义或对象定义错误。
这是 VBA 然后自动生成的代码:
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
看来来源有误。我尝试将 "Sheet1!R1C1:R107C1"
更改为 "Sheet1!$A:$A"
但这也没有帮助。
我不会说来源有误,问题是 hard-coded。
您需要将其更改为 hard-coded,具体而言,您需要更改 107 以反映 Sheet1 上 A 列中的最后一行数据。
此外,还有一些其他的东西被赋予看似随意的名称,例如PivotTable25 - 如果您在代码中使用特定名称会更好。
另外,您应该在包含错误代码的列中添加 header。
在下面的代码中,假设数据在 Sheet1 上并且具有 'Errors' 的 header,并且 'ErrorPivot' 已用于数据透视表的名称 table 正在创建。
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