分析Microsoft Word的VBA代码

时间:2008-10-28 14:17:52

标签: vba optimization ms-word profiling word-vba

我有一些遗留代码,它使用VBA来解析word文档并构建一些XML输出;

毋庸置疑,它像狗一样运行,但我有兴趣对其进行分析,看看它在哪里崩溃,也许有一些选项可以让它更快。

我不想尝试任何东西,直到我可以开始测量我的结果,所以剖析是必须的 - 我已经做了一些搜索,但找不到任何可以轻松完成这项工作的东西。布伦特伍德有一个工具?这需要修改你的代码,但它没有用,我跑出去了。

任何人都知道任何有用的简单方法吗?

更新:代码库大约有20个左右的文件,每个文件至少有100个方法 - 为每个方法手动添加开始/结束调用是不合适的 - 特别是之后将它们全部删除 - 我实际上在考虑做某种形式的REGEX可以解决这个问题,另一种形式可以解决这个问题但是它只是有点过于干扰但可能是唯一的解决方案。我早些时候在这里找到了一些不错的时序代码,所以它的时序部分不是问题。

5 个答案:

答案 0 :(得分:1)

可以使用模板为每个过程添加一行:

http://msdn.microsoft.com/en-us/library/aa191135(office.10).aspx

错误处理程序模板通常包含一些描述的ExitHere标签..标签后面的第一行可能是计时器打印。

也可以通过代码修改代码:"Example: Add some lines required for DAO"是一个Access示例,但类似的东西可以用Word完成。

希望这会缩小该区域以寻找问题。然后可以注释掉该行,或者您可以恢复备份。

答案 1 :(得分:1)

使用类和#if会使“为每个方法添加代码”更容易......

Profiler 课程模块:

#If PROFILE = 1 Then

Private m_locationName As String
Private Sub Class_Initialize()
    m_locationName = "unknown"
End Sub

Public Sub Start(locationName As String)
    m_locationName = locationName
    MsgBox m_locationName
End Sub

Private Sub Class_Terminate()
    MsgBox m_locationName & " end"
End Sub

#Else

Public Sub Start(locationName As String)
 'no op
End Sub

#End If

其他一些代码模块:

' helper "factory" since VBA classes don't have ctor params (or do they?)
Private Function start_profile(location As String) As Profiler
    Set start_profile = New Profiler
    start_profile.Start location
End Function

Private Sub test()
    Set p = start_profile("test")
    MsgBox "do work"
    subroutine
End Sub

Private Sub subroutine()
    Set p = start_profile("subroutine")
End Sub

在项目属性中,将条件编译参数设置为:

PROFILE = 1

删除正常的非配置文件的行。

添加行很痛苦,我不知道有什么方法可以自动获取当前的方法名称,这样可以轻松地为每个函数添加分析行。您可以使用VBE对象模型为您注入代码 - 但我想知道手动执行此操作最终会更快。

答案 2 :(得分:0)

插入一堆

Debug.Print "before/after foo", Now

你认为可能长期运行的片段之前和之后,然后只是比较它们,瞧你在那里。

答案 3 :(得分:0)

我的建议是分裂和征服,在几个关键位置插入一些时间线以试图隔离问题,然后深入研究该区域。

如果问题更加分散且不明显,我建议通过逐步禁用整个代码块进行简化,尽可能在不破坏过程的情况下进行。这类似于在Excel工作簿中通过逐步硬编码工作表或部分工作表来查找速度颠簸,直到速度问题消失为止。

答案 4 :(得分:0)

关于“现在”功能(上面,svinto)......

我使用了“计时器”功能(在Excel VBA中),它返回一个Single。 它似乎工作得很好。拉里