计算Excel插入行所用的时间

我们遇到了大量工作表的一些性能问题。 特别是,三个操作看起来非常慢:插入行,删除行和撤消。

我一直在阅读优化,并想量化哪些变化真的有所作为。 要做到这一点,我想设置一些跟踪上面列出的事件stream逝时间的VBA,但我找不到任何钩子。

我想要像worksheet_change_start,worksheet_change_end,但我还没有find像这样的东西。

我有一个“伟大”的想法,但没有奏效。 我以为我会做两个插入行背靠背,每个时间戳,然后计算差异…但Excel胜过我,并以某种方式将它们一起批处理。

在此先感谢您的build议

注:感谢迄今为止的答案。 我知道计时器function,但我不知道如何捕捉事件,我可以开始和结束计时器的一些用户行为,如用户插入一行之前和之后。

您可以使用如下所示的小macros来计算工作簿执行操作需要多长时间

Dim t As Date t = Now() 'your code for inserting new line here MsgBox Format(Now() - t, "hh:mm:ss") 

来源: http : //www.mrexcel.com/archive/VBA/20164.html

你可以使用一个基本的计时器类(从以前的SO问题 – 引用TBA)通过把它放到一个类模块 (称为CTimer )。 这种方法的好处是可重用的。

 Option Explicit Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long Private m_CounterStart As LARGE_INTEGER Private m_CounterEnd As LARGE_INTEGER Private m_crFrequency As Double Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256# Private Function LI2Double(LI As LARGE_INTEGER) As Double Dim Low As Double Low = LI.lowpart If Low < 0 Then Low = Low + TWO_32 End If LI2Double = LI.highpart * TWO_32 + Low End Function Private Sub Class_Initialize() Dim PerfFrequency As LARGE_INTEGER QueryPerformanceFrequency PerfFrequency m_crFrequency = LI2Double(PerfFrequency) End Sub Public Sub StartCounter() QueryPerformanceCounter m_CounterStart End Sub Property Get TimeElapsed() As Double Dim crStart As Double Dim crStop As Double QueryPerformanceCounter m_CounterEnd crStart = LI2Double(m_CounterStart) crStop = LI2Double(m_CounterEnd) TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency End Property 

然后在一个普通的代码模块中,你可以像这样使用它:

 Sub test_time() Dim time_this As New CTimer Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") time_this.StartCounter ws.Rows("6:6").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove ws.Rows("8:8").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove MsgBox time_this.TimeElapsed End Sub