好吧,我試圖從C#中自動化Microsoft Access。顯然你不能在VBA本身異步執行VBA代碼,但我的想法是使用委託從C#強制執行此操作。這個VBA代碼是否會異步執行
我們有一個傳統的報告系統,它運行數百個設計不當的查詢來獲取信息,並且這些查詢在宏內同步運行。每個查詢都是使用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會在請求收到它們之後排隊請求。第二個不太重要的問題是,我的計數似乎並沒有增加。
我哪裏錯了?
謝謝
計數是一個靜態變量嗎? – Paparazzi 2012-04-15 12:55:46
是的,這是一個問題嗎? – JMK 2012-04-15 12:57:47
不,它是使用C#異步運行VBA代碼,導出只是我想運行的VBA代碼類型的一個示例。 – JMK 2012-04-15 14:34:07