我有一个C#程序,它打开几个Microsoft Access文件,并从每个文件中执行功能.
本质上,代码看起来像这样:
Microsoft.Office.Interop.Access.Application app =
new Microsoft.Office.Interop.Access.Application();
app.Visible = true;
app.OpenCurrentDatabase(accessFileFullPath, false, "");
//Call the function
app.Eval(function);
Run Code Online (Sandbox Code Playgroud)
但是,当VBA代码中发生调试错误时,我想将其捕获到我的C#程序中.
请不要回答:"在您的VBA程序中捕获错误".由于我不会涉及的原因,这是不可能的.
我过去使用的一种方法是让一个线程间歇性地监视任何Visual Basic Debug窗口的句柄(FindWindowEx Win32函数返回非零值).我不喜欢这种方法,也不想继续使用它.
我找到了这个适用于Microsoft Excel的线程.从本质上讲,它使用的Microsoft.VisualBasic.CallByName()功能显然可以被困在try/catch块中,而无需用户交互.但是,我无法使用Microsoft Access - 主要是因为我无法弄清楚如何使用此命令调用函数/ sub.
任何建议都将真诚地感谢!
编辑:正如我在下面的一个答案中提到的,我尝试Eval()在try/catch块中包装,我的C#程序似乎忽略它,直到用户点击"Microsoft Visual Basic"错误对话框上的"结束"按钮.我不希望任何用户交互,而是想要捕获VBA错误以便在我的C#程序中处理.
ALTER PROCEDURE [dbo].[REPORTING_MonthlyClientTimesheet_wrapper2_TRR_Month]
(@StartDate DATETIME,
@taskcode VARCHAR(250),
@username VARCHAR(250))
AS
BEGIN
SET NOCOUNT ON
DECLARE @ProcedureName SYSNAME
-- Give them one full month of records
DECLARE @EndDate DATETIME
SET @ProcedureName = OBJECT_NAME(@@PROCID)
--SET @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)) -- end month
SET @EndDate = DATEADD(s, -1, DATEADD(YY, DATEDIFF(YYYY, 0, @StartDate) + 1, 0)) --set to end of Year
BEGIN TRY
SELECT DISTINCT
@username,
cal.calendaryear,
cal.calendarmonth,
cal.calendarday,
DATEPART(wk, Calendardate) AS weekno,
DATENAME(month, DATEADD(month, cal.calendarmonth - 1, 0)) AS iMonthName,
DATEADD(s, -1, DATEADD(YY, …Run Code Online (Sandbox Code Playgroud)