VBA编辑器在terminal的debugging模式下的屏幕截图,或者使用Excel DOM在VBA编辑器中查找错误行和desc?

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

从C#中的过程中,我们可以检测到错误窗口是打开的,我们截取错误信息的截图,然后closures错误框。

如果这是一个交互式会话,则Excel将以debugging模式显示VBA编辑器,其中突出显示错误的行。

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

然后我们可以使用windows PID来closuresexcel程序。

问题是:我们如何获得VBA编辑器的截图,或者我们如何在debugging模式下与Excel(与COM或interop)绑定,并遍历dom以find错误行,并且可能会出现错误消息?

(1)如果您拥有对Excel工作簿的创作控制,则可以插入行号和error handling程序,以写入文件Err.Number,Err.Description,Err.Source,Erl。

(2)如果(1)不是选项,但可以在主机上设置macros安全性以允许对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/窗户/桌面/ dd183402%28V = vs.85%29.aspx

如果您有权修改VBA代码,最简单的解决scheme可能是使用On Error GoTo和一个行标签。 这将停止popupdebugging消息,而是当发生运行时错误时,执行将跳转到指定的标签,在此处您可以访问全局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 

数据结构快照,VBA excel

这听起来很像上面的问题,我build议把你的代码的状态写入一个单独的txt文件(在本例中,使用FileSystemObject),然后在那里你可以分析你卡住的地方:布尔条件/实例化对象,成功的循环上的数字,variables中包含的值,以及任何你想要的…)。
结合error handling程序(如前所述),您可以看到代码停止的位置+代码/错误描述。

为了你的复制粘贴:

 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 

我同意这是一个更多的工作,但你会知道在哪里可以find错误。
所有这一切都取决于你需要多久努力,结合你需要描述多长时间的代码。 由于我不了解你的情况,所以我不能判断。

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