C# 如何以编程方式查看旧Access数据库的VBA代码?

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

为了便于迁移到Windows 10和Office 365环境,我需要编写一个程序(在C#或VB.NET中),该程序将读取旧Access数据库(从2003年起)的VBA代码,并查找特定的代码片段,如果可能的话,更改该代码并保存。这需要在大约500个Access数据库上执行

我以前在Word和Excel中做过这项工作,没有太多麻烦,但我似乎无法让它在Access中工作

我试过这样做:

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”的建议解决了这个问题。非常感谢您的帮助:)