【问题标题】:Excel 2016 - VBA - Pivot Table - exclude from copying a row if it contains "(blank)"Excel 2016 - VBA - 数据透视表 - 如果包含“(空白)”,则从复制行中排除
【发布时间】:2018-07-12 03:58:15
【问题描述】:

注意:如果您个人对本文中的某些内容不清楚,建设性途径是询问您需要澄清的具体内容。

我有以下代码,它可以满足我的需要 - 它适用于活动工作表上唯一的数据透视表。这些数据透视表总是只有两列。选择不包括页眉/页脚,仅选择数据。复制第一列,将其粘贴到第二列的右侧。扩展选择以包括粘贴的数据和第二列 - 复制它。

问题:如果一行包含“(空白)”,如何排除复制

Sub PivotPrep4POST()
'
' PivotPrep4POST Macro
'
Application.ScreenUpdating = False
Dim pt As PivotTable
Set pt = ActiveSheet.PivotTables(1)
Dim ws As Worksheet
'selects Row range of pivot
pt.RowRange.Select
'trims two last rows off selection
Selection.Resize(Selection.Rows.Count - 2, Selection.Columns.Count + 0).Select
'shifts selection one row down, resulting in selection minus top and bottom row
Selection.Offset(1, 0).Select
Selection.Copy
Selection.Offset(0, 2).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Resize(Selection.Rows.Count - 0, Selection.Columns.Count + 1).Select
Selection.Offset(0, -1).Select

Selection.Copy
Application.ScreenUpdating = True
'
End Sub

【问题讨论】:

  • Alex:您开头的注释与您的问题无关。建设性的 StackOverflow 响应者已经知道如何使用 cmets 提出建设性的后续问题。那张纸条的语气有点侮辱人,我想说的是,放在那里除了有可能投反对票之外,对你的问题没有任何帮助。
  • NOTE 是基于经验,而不是理论,并不是教如何使用 cmets,而是帮助一些人看到 - 不理解帖子并不意味着帖子不清楚,而是可能对他们不清楚,并进一步询问他们需要澄清的细节,而不是张贴声明“不清楚”。 NOTE 进一步不适用于建设性的受访者或收集意见,这对解决问题没有任何帮助。 @jeffreyweir
  • 我们都是志愿者。如果花时间阅读您的问题的志愿者有不清楚的地方,那么他们完全有效可以按照“您的问题/意图不清楚”的方式添加评论。他们没有必要在最后添加“给我”……我们知道他们并不是在为整个 SO 社区说话。如果您遇到过有人抱怨您的问题不清楚,那么它可能并没有您想象的那么清楚。这不是他们的错……这只是您提供更多信息的机会。给志愿者。
  • 以下是您遗漏的内容:NOTE 是基于经验而非理论,呼吁询问他们需要澄清的具体内容,而不是张贴声明性的“不清楚”。看到不同。同样,NOTE 不适用于建设性的受访者或收集意见,这对解决问题没有任何帮助。 @jeffreyweir
  • 什么“经验”?什么“理论”?

标签: excel vba pivot-table


【解决方案1】:

我建议不要逐行复制,而是过滤掉空白,然后将全部内容一次性复制到您需要的地方,这样会更容易、更有效。或者,如果要重新排列列的顺序,请逐列复制。

要查看过滤空白的代码,请参阅Pivot Field Show All Except Blank

Jon Peltier 在https://peltiertech.com/referencing-pivot-table-ranges-in-vba/ 上发表了一篇关于引用数据透视表范围的精彩帖子

【讨论】:

  • 在 Dim ws As Worksheet 之后添加你的代码到我的工作表(下面的代码来自你的链接)没有任何区别@jeffreyweir:在错误继续下一个 pt .ClearAllFilters .PivotItems("(blank) ").Visible = 假结尾
【解决方案2】:

添加了一些代码,如果它包含“空白”,则将选择的大小调整为短一行 - 这有效:

Sub PivotPrep4POST2()
'
' PivotPrep4POST Macro
'
Application.ScreenUpdating = False
Dim pt As PivotTable
Set pt = ActiveSheet.PivotTables(1)
Dim ws As Worksheet

'selects Row range of pivot
pt.RowRange.Select
'trims two last rows off selection
Selection.Resize(Selection.Rows.Count - 2, Selection.Columns.Count + 0).Select
'shifts selection one row down, resulting in selection minus top and bottom row
Selection.Offset(1, 0).Select
Selection.Copy
Selection.Offset(0, 2).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Resize(Selection.Rows.Count - 0, Selection.Columns.Count + 1).Select
Selection.Offset(0, -1).Select


'Added this
Dim SrchRng As Range, cel As Range

Set SrchRng = Selection

For Each cel In SrchRng
    If InStr(1, cel.Value, "blank") > 0 Then
    Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count + 0).Select
    End If
Next cel
'end of addition

Selection.Copy
Application.ScreenUpdating = True
'
End Sub

【讨论】:

    【解决方案3】:

    我很快就把它放在一起了。如果要检查多个列,则需要进行修改,但这应该可以帮助您开始。

    Sub PivotPrep4POST()
    '
    ' PivotPrep4POST Macro
    '
    Application.ScreenUpdating = False
    Dim pt As PivotTable
    Set pt = ActiveSheet.PivotTables(1)
    Dim ws As Worksheet
    'selects Row range of pivot
    pt.RowRange.Select
    'trims two last rows off selection
    Selection.Resize(Selection.Rows.Count - 2, Selection.Columns.Count + 0).Select
    'shifts selection one row down, resulting in selection minus top and bottom row
    Selection.Offset(1, 0).Select
    Selection.Copy
    Selection.Offset(0, 2).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Resize(Selection.Rows.Count - 0, Selection.Columns.Count + 1).Select
    Selection.Offset(0, -1).Select
    
    
    'New Code (7/11/2018)
    Dim rCell As Range, newRng As Range, tRng As Range
    
    Set tRng = Selection
    
    For Each rCell In tRng.Columns(1).Cells
        If rCell.Value2 <> "(blank)" Then
            If newRng Is Nothing Then
                Set newRng = Intersect(rCell.EntireRow, tRng)
            Else
                Set newRng = Union(newRng, Intersect(rCell.EntireRow, tRng))
            End If
        End If
    Next rCell
    newRng.Select
    'End new code
    
    
    Selection.Copy
    Application.ScreenUpdating = True
    '
    End Sub
    

    【讨论】:

    • 差不多了,但是在复制之前,代码最终会出现多个选择,因为它只排除了带有“空白”的单元格,而不是排除了整行。给出“运行时错误'1004':此操作不适用于多项选择。”您可能会在一分钟内解决这个问题,以您的出色技能? @PGCodeRider
    • @Alex 我仅根据您选择的第一列对其进行了更新。如果您发布屏幕截图或更好的示例来说明您正在做什么,那会更容易。如果可行,请标记为已接受。谢谢。
    • 更新的“新代码(2018 年 7 月 11 日)”不会从选择中排除(空白)。前一天我已经解决了我自己的问题,并且工作代码发布在这里。感谢您尝试提供帮助! @PGCodeRider
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 2017-10-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多