VBA使用Sendkey执行Excel热键

我知道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”覆盖枢轴信息.我已经注释掉了我的原始循环,这在处理大量数据时花费的时间太长了.

有什么想法吗?我只是不耐烦使用循环方法?

最佳答案 不,你不耐烦!如果您使用的是2007或更高版本,请使用:

    Application.CommandBars.ExecuteMso "PivotTableSubtotalsDoNotShow"
点赞