VBA使用Sendkey执行Excel快捷键

4
我知道sendkeys被认为是不好的和危险的,但我正在努力找出如何处理VBA中的问题,与前端Excel相比。
我编写了一个个人宏,用于设置未知数据透视表以重复所有标签,设置为表格形式,按字段列表升序排序,并最终隐藏小计。一切工作正常,只有子总计需要循环,当存在大量数据时,这个循环可能需要很长时间。奇怪的是,如果你只是从前端控件关闭子总计,那么它是瞬间的。因此,使用Sendkey比实际循环更快。(Sendkey执行热键按压以执行关闭子总计)
Sub formatpivotTable()
Dim pivotName As Variant
Dim pf As pivotField

On Error Resume Next
pivotName = ActiveCell.PivotTable.Name
If pivotName = "" Then
    MsgBox "You did not select a pivot table"
    Exit Sub
End If
ActiveSheet.PivotTables("" & pivotName & "").ManualUpdate = True
With ActiveSheet.PivotTables("" & pivotName & "")
    .RepeatAllLabels (xlRepeatLabels)
    .RowAxisLayout (xlTabularRow)
    .FieldListSortAscending = True
    'For Each pf In .PivotFields
    '    pf.Subtotals(1) = True
    '    pf.Subtotals(1) = False
    'Next
End With
ActiveSheet.PivotTables("" & pivotName & "").ManualUpdate = False

'Remove the Loop and instead use the Front End Hotkey
ActiveSheet.Activate  'Normally using activate is bad, but maybe it's good here to ensure your sendkeys hit excel? not even sure this prevents it
Application.SendKeys "%", True
Application.SendKeys "{J}", True
Application.SendKeys "{Y}", True
Application.SendKeys "{T}", True
Application.SendKeys "{D}", True
End Sub

当它工作时,它的表现是很好的。整个过程不到一秒钟就完成了。但我觉得如果出了问题,您的“sendkeys”可能会覆盖透视信息而变成“JYTD”,这还存在一定风险。我已经注释掉了原始循环,因为处理大量数据时太慢了。您有什么想法吗?我只是使用循环方法太心急了吗?
1个回答

2

不,你并不是不耐烦!如果你使用的是2007或更高版本,请使用以下内容:

    Application.CommandBars.ExecuteMso "PivotTableSubtotalsDoNotShow"

哇,这太棒了。我以前从未见过这样的东西。唯一的问题是,如果他们尝试在小计已经关闭的情况下运行此命令,它会抛出错误。我该如何正确地条件检查,只有在小计已经关闭时才运行此命令? - Snoobie
我尝试了另一个数据透视表,现在没有问题了。我会继续关注它,感谢你的提示,这太棒了! - Snoobie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接