如何在数据透视表更新事件中抑制 "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 |
参考文献:
- Suppress Overwrite Existing Data Alert In VBA Macro
- Prevent Overwrite Warning in VBA
如前所述,当事件触发时为时已晚。
我的技巧是创建一个 public 变量来保存 pvt.ColumnRange.Columns.Count,其中 pvt 是一个隐藏的重复数据透视表(所讨论的数据透视表),列中包含所有可能的选择项.然后在上面做一个加 1 来设置添加数据的起始区域,即不会发生重叠。这是在 Init 过程中设置的,因此在触发事件之前可用。
情况:
我正在使用 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 |
参考文献:
- Suppress Overwrite Existing Data Alert In VBA Macro
- Prevent Overwrite Warning in VBA
如前所述,当事件触发时为时已晚。
我的技巧是创建一个 public 变量来保存 pvt.ColumnRange.Columns.Count,其中 pvt 是一个隐藏的重复数据透视表(所讨论的数据透视表),列中包含所有可能的选择项.然后在上面做一个加 1 来设置添加数据的起始区域,即不会发生重叠。这是在 Init 过程中设置的,因此在触发事件之前可用。