VBA使用Sendkey执行Excel热键

时间:2016-02-10 16:32:58

标签: excel vba excel-vba

我知道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 个答案:

答案 0 :(得分:2)

不,你不耐心!如果您使用的是2007或更高版本,请使用:

    Application.CommandBars.ExecuteMso "PivotTableSubtotalsDoNotShow"