2

Excel 工作簿由命令行调用,命令行本身是从 c# (3.5) 启动的。工作簿运行,但 VBA 中存在错误。例如,数据透视表中缺少一列,Excel 会向用户提示错误消息,并带有“调试”选项。

从C#中的流程我们可以检测到错误窗口是打开的,我们对错误信息进行截图,然后我们关闭错误框。

如果这是一个交互式会话,Excel 将在调试模式下显示 VBA 编辑器,并突出显示发生错误的行。

但是,因为这是在无人看管的终端会话中运行的,所以我们无法截取 VBA 编辑器的屏幕截图(屏幕截图是黑屏)。

然后,我们可以使用 windows PID 关闭 excel 程序。

问题是:我们如何获得 VBA 编辑器的屏幕截图,或者我们如何在调试模式下与 Excel 绑定(使用 COM 或互操作),并遍历 dom 以找到错误行,以及可能的错误消息?

4

3 回答 3

1

数据结构的快照,VBA excel

这听起来很像上面的问题,我建议将代码的状态写入单独的 txt 文件(在示例中,使用 FileSystemObject),然后您可以在其中分析卡住的位置:条件布尔值/对象实例化,成功循环的数字,变量中包含的值,以及 - 无论你想要什么......)。
结合错误处理程序(如前所述),您可以看到代码停止的位置 + 错误的代码/描述。

为了您的缘故复制粘贴:

dim sFile               As string
Dim FSO                 As FileSystemObject
Dim FSOFile             As TextStream
sFile = "U:/Log.txt"   

Set FSO = New FileSystemObject
Set FSOFile = FSO.OpenTextFile(sFile, 2, True)
FSOFile.writeline (<Descriptions+Property/variable value>)
FSOFile.Close set FSO = nothing  

我同意这是一项更多的工作,但是您会知道在哪里可以找到错误。
这一切都取决于您需要它的难度和频率,以及您需要描述的代码多长时间。由于我不了解您的情况,因此无法判断。

最后,看起来工作量很大,但实际上很容易,因为它只是描述已经存在的代码。
希望能帮助到你。

于 2012-10-23T14:22:03.433 回答
1

(1) 如果您对 Excel 工作簿具有创作控制权,则可以插入行号和错误处理程序以写入文件 Err.Number、Err.Description、Err.Source、Erl。

(2) 如果 (1) 不是一个选项,但您可以在主机上设置 Macro Security 以允许对 Visual Basic 项目进行编程控制,那么您可以获得活动行号:

Dim xl As excel.Application
Dim StartLine As Long, StartColumn As Long, EndLine As Long, EndColumn As Long
Set xl = GetObject(, "Excel.Application")
xl.VBE.ActiveCodePane.GetSelection StartLine, StartColumn, EndLine, EndColumn
Debug.Print StartLine, StartColumn, EndLine, EndColumn

(3)如果(1)和(2)都不是选项,那就有点毛骨悚然了,不过可以把窗口的位图内容复制出来:http: //msdn.microsoft.com/en-us/library/ windows/桌面/dd183402%28v=vs.85%29.aspx

于 2012-10-18T21:14:31.967 回答
1

如果您有权修改 VBA 代码,最简单的解决方案可能是使用 On Error GoTo 和行标签。这将阻止 Debug 消息弹出,相反,当发生运行时错误时,执行将跳转到指定的标签,此时您可以访问全局 Err 对象中可用的信息。VBA 没有 try/catch 块的概念,所以这几乎是最接近的。

Sub Main()
    On Error GoTo Catch

    ' Code that may trigger errors here...

   GoTo Finally
Catch:
    ' Log Err info, etc...
    Debug.Print "Error " & Err.Number & " - " & Err.Description
Finally:
    ' This is always reached last (error or no error)
End Sub
于 2012-10-21T16:03:38.793 回答