C# 如何以编程方式查看旧Access数据库的VBA代码?
为了便于迁移到Windows 10和Office 365环境,我需要编写一个程序(在C#或VB.NET中),该程序将读取旧Access数据库(从2003年起)的VBA代码,并查找特定的代码片段,如果可能的话,更改该代码并保存。这需要在大约500个Access数据库上执行 我以前在Word和Excel中做过这项工作,没有太多麻烦,但我似乎无法让它在Access中工作 我试过这样做:C# 如何以编程方式查看旧Access数据库的VBA代码?,c#,vba,ms-access,C#,Vba,Ms Access,为了便于迁移到Windows 10和Office 365环境,我需要编写一个程序(在C#或VB.NET中),该程序将读取旧Access数据库(从2003年起)的VBA代码,并查找特定的代码片段,如果可能的话,更改该代码并保存。这需要在大约500个Access数据库上执行 我以前在Word和Excel中做过这项工作,没有太多麻烦,但我似乎无法让它在Access中工作 我试过这样做: var appClass = new Microsoft.Office.Interop.Access.Applica
var appClass = new Microsoft.Office.Interop.Access.Application();
appClass.OpenCurrentDatabase(thefilepath, false, "");
var dbs = appClass.CurrentProject;
foreach (AccessObject myMods in dbs.AllModules)
{
//Look at the module here and look at the code
}
accessApp = new Microsoft.Office.Interop.Access.ApplicationClass();
accessApp.OpenCurrentDatabase(inputMdb, false, password);
foreach (Access.AccessObject obj in accessApp.CurrentProject.AllModules)
{
//Look at the module here and look at the code
}
就像这样:
var appClass = new Microsoft.Office.Interop.Access.Application();
appClass.OpenCurrentDatabase(thefilepath, false, "");
var dbs = appClass.CurrentProject;
foreach (AccessObject myMods in dbs.AllModules)
{
//Look at the module here and look at the code
}
accessApp = new Microsoft.Office.Interop.Access.ApplicationClass();
accessApp.OpenCurrentDatabase(inputMdb, false, password);
foreach (Access.AccessObject obj in accessApp.CurrentProject.AllModules)
{
//Look at the module here and look at the code
}
但我会遇到如下错误:
System.Runtime.InteropServices.ComeException:'您需要的表达式
“输入”是指已关闭或不存在的对象。”
就我的一生而言,我无法让它工作,任何帮助都将不胜感激。我不确定
AccessObject
或者它是否适用于其他MS Office程序,但我过去访问模块的方式是通过VBProject.VBComponents
以下方面应起作用:
using Microsoft.Vbe.Interop;
using MSAccess = Microsoft.Office.Interop.Access;
//...
var accessApp = new MSAccess.Application();
accessApp.OpenCurrentDatabase(inputMdb, false, password);
foreach (VBComponent vbc in accessApp.VBE.ActiveVBProject.VBComponents)
{
var module = vbc.CodeModule;
// To print all code in the file:
Console.WriteLine(module.Lines[1, module.CountOfLines]);
// To export to file:
vbc.Export(somePath);
// To insert code:
module.InsertLines(4, newLineOfCode);
// To replace code:
module.ReplaceLine(5, modifiedLineOfCode);
}
accessApp.CloseCurrentDatabase();
accessApp.Quit();
老兄,你是救命恩人!我试过你的代码,效果很好……但是。。。。我使用了“module.Replaceline(linenumber,modifiedcode)”,然后立即运行“Console.WriteLine(module.Lines[1,module.countofline]);”检查更改,它就在那里(非常棒),但是当我停下来重新运行代码时,更改就消失了。看起来更改没有保存。我查找了一个保存函数,但找不到。你知道我遗漏了什么吗?@Kevin对代码的更改似乎是自动为我保存的。你确定你的数据库文件不是只读的吗?如果不是,可以尝试调用
accessApp.DoCmd.Save(MSAccess.AcObjectType.acModule,module.Name)代码>在循环中,查看是否有任何区别。在这一行“accessApp.OpenCurrentDatabase(inputMdb,false,password);”中找到问题。false是设置独占访问的bool,它必须为true。改变这一点,并使用“accessApp.DoCmd.Save”的建议解决了这个问题。非常感谢您的帮助:)