首页 > 解决方案 > 创建宏来制作数据透视表 + 直方图不起作用

问题描述

我使用创建 2 个文本文件的 grep 制作了一个日志文件解析工具。1 个文本文件包含所有错误代码 + 错误消息,另一个仅包含错误代码。

我通过一个简单的 vba 脚本将它们导入到一个 excel 文件中。然后我有两个宏可以将文本转换为列,这样excel就可以更容易地阅读它们,这很好用。

错误代码 + 错误消息(在表 2 上)仅包含宏之后的代码 + 消息,以将它们放入列中,然后删除双打,使其成为一种列表,用户可以在其中查看错误代码给出的内容信息。还行吧。

然后将错误代码放入工作表 1,宏只创建 A 列中所有代码的列表。

现在,我想做的是有一个宏,它将接受所有这些错误代码(范围将根据已解析的日志文件以及它将包含多少错误代码而有所不同)并将它们放入直方图中,因此用户可以直观地看到哪些错误代码出现最多。

我的理想情况是用户只定义一条路径,然后其他所有内容都自动进行到直方图显示的程度,并清楚地了解哪个错误返回最多。

到目前为止,我所拥有的是 grep 解析日志文件并生成一些新的 txt 文件。然后自动打开 Excel 文件,并自动将 txt 文件导入正确的工作表中。然后宏正在做他们的事情。

我需要帮助的是如何为直方图创建自动化。我尝试在 google 和 here 上进行大量搜索,但大多数代码都非常复杂且如此庞大,以至于对我在这里尝试做的事情没有帮助。我希望我能找到一个简单的解决方案来解决这个问题。

提前感谢您的想法!

在录制像 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",但这也无济于事。

标签: excelvbahistogram

解决方案


我不会说来源是错误的,问题是它是硬编码的。

您需要对其进行更改,使其不是硬编码,特别是您需要更改 107 以反映 Sheet1 上 A 列中的最后一行数据。

此外,其他一些东西被赋予看似任意的名称,例如 PivotTable25 - 如果您在代码中使用特定名称会更好。

另一件事,您应该在包含错误代码的列中添加一个标题。

在下面的代码中,假设数据在 Sheet1 上并且具有“错误”标题,并且“ErrorPivot”已用于正在创建的数据透视表的名称。

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

推荐阅读