如何在数据透视表更新事件中抑制 "overwrite existing data" 警报?

How to suppress "overwrite existing data" alert within a pivottable update event?

情况:

我正在使用 PivotTableUpdate 事件清除 PivotTable 右侧的范围,然后在 PivotTable.DataBodyRange 右侧的下一个可用列中插入值.

单个切片器项目 selection:

在下面的第一张图片中,我正在 select 一个切片器项目然后使用

.Offset(, .Columns.Count).Resize(.Rows.Count, 25)

清除 DataBodyRange 右侧的区域。 Resize 是为了考虑先前的 select 离子,这些离子可能填充了与当前下一个可用的列不同的列。

我正在使用

.Offset(, .Columns.Count).Resize(.Rows.Count, 1) = "1"

将下一个可用的空闲列的值设置为 1

示例:Sheet1 中的一个切片器项目 selection、table 和数据透视表:

所以我将从 "before" 到 "after",如下所示:

这很好用。下一个可用列地址没有变化。

多项目切片器selection:

当我用 multi-select 尝试同样的事情时,代码会以标准 "Alert before overwriting cells" 停止,即我得到:

There is already data in..Do you want to replace it?

示例:Sheet1 中的多切片器项目 selection、table 和数据透视表:

我尝试过的:

Application.DisplayAlerts = False

Application.AlertBeforeOverwriting = False

并且(清除弹出窗口)

Application.SendKeys "{ENTER}"

对于 multi-select 消息仍然出现,并且在我手动按下 OK

之前不会消失

想法:

我想也许消息是在事件代码 运行 之前触发的,但是当我覆盖相同的范围(即单个切片器项目 selection)时,我没有收到此消息

我知道您可以通过“文件”>“选项”>“高级设置”手动关闭此警报,但不确定如何在我当前的代码中通过代码来抑制。

有人知道如何抑制此警报吗?

代码:

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

    Application.DisplayAlerts = False

    With Target.DataBodyRange

        Dim clearRange As Range

        Set clearRange = .Offset(, .Columns.Count).Resize(.Rows.Count, 25)

        clearRange.ClearContents

        .Offset(, .Columns.Count).Resize(.Rows.Count, 1) = "1"

    End With

    Application.DisplayAlerts = True

End Sub

测试数据:

| Trust | STP  | Val |
|-------|------|-----|
| A     | STPa | 1   |
| B     | STPb | 2   |
| C     | STPc | 3   |

参考文献:

  1. Suppress Overwrite Existing Data Alert In VBA Macro
  2. Prevent Overwrite Warning in VBA

如前所述,当事件触发时为时已晚。

我的技巧是创建一个 public 变量来保存 pvt.ColumnRange.Columns.Count,其中 pvt 是一个隐藏的重复数据透视表(所讨论的数据透视表),列中包含所有可能的选择项.然后在上面做一个加 1 来设置添加数据的起始区域,即不会发生重叠。这是在 Init 过程中设置的,因此在触发事件之前可用。