好的,所以我正在尝试从 C# 自动化 Microsoft Access。显然,您不能在 VBA 本身中异步执行 VBA 代码,但我的想法是使用委托从 C# 强制执行此操作。
我们有一个遗留报告系统,它运行数百个设计不良的查询来获取信息,这些查询在宏内部同步运行。每个查询都是使用 MS Access 查询设计器设计的,并通过 ODBC 查询 MySql 数据库。它们需要 2-3 分钟才能运行,并且宏可能包含 <=20 个查询,这意味着宏将需要一个小时的大部分时间来运行。如果我运行这些异步,我可以在几分钟内运行整个宏。
我的完整 C# 代码如下:
using System;
using Microsoft.Office.Interop.Access;
namespace AsyncVBA
{
class Program
{
private static Application ap;
private delegate void ExportThread(string queryName, string exportLocation);
private static int count;
static void Main(string[] args)
{
var dbName = @"C:\Users\JMK\Desktop\MyDatabase.accdb";
count = 0;
ExportThread queryThread = new ExportThread(ExportQuery);
ap = new Application();
ap.OpenCurrentDatabase(dbName);
queryThread.BeginInvoke("qryOne", @"C:\Users\JMK\Desktop\x\one.xlsx", null, null);
queryThread.BeginInvoke("qryTwo", @"C:\Users\JMK\Desktop\x\two.xlsx", null, null);
queryThread.BeginInvoke("qryThree", @"C:\Users\JMK\Desktop\x\three.xlsx", null, null);
queryThread.BeginInvoke("qryFour", @"C:\Users\JMK\Desktop\x\four.xlsx", null, null);
queryThread.BeginInvoke("qryFive", @"C:\Users\JMK\Desktop\x\five.xlsx", null, null);
queryThread.BeginInvoke("qrySix", @"C:\Users\JMK\Desktop\x\six.xlsx", null, null);
queryThread.BeginInvoke("qrySeven", @"C:\Users\JMK\Desktop\x\seven.xlsx", null, null);
queryThread.BeginInvoke("qryEight", @"C:\Users\JMK\Desktop\x\eight.xlsx", null, null);
queryThread.BeginInvoke("qryNine", @"C:\Users\JMK\Desktop\x\nine.xlsx", null, null);
queryThread.BeginInvoke("qryTen", @"C:\Users\JMK\Desktop\x\ten.xlsx", null, null);
while (count < 10)
{
Console.ReadLine();
}
ap.CloseCurrentDatabase();
}
private static void ExportQuery(string queryName, string exportLocation)
{
ap.DoCmd.TransferSpreadsheet(AcDataTransferType.acExport, AcSpreadSheetType.acSpreadsheetTypeExcel9, queryName, exportLocation);
count++;
}
}
}
我目前有两个问题,第一个是我的代码似乎仍在同步执行,这可能与 MS Access 的限制有关。我猜 MS Access 在收到请求或其他请求时正在对请求进行排队。第二个不太重要的问题是我的计数似乎没有增加。
我哪里错了?
谢谢