尽管我最后的问题没有被很好地接受,但我会再试一次。
我正在开发一个能够通过使用 Microsoft 为 Word/Access/Excel 提供的 COM/Interop-Interface 来控制大量办公应用程序行为的程序。仍然有一些功能彼此不同,它们保持特定于被寻址的程序的方式。
我的目标是将宏代码插入现有的 Access 数据库并在数据库打开时运行代码,并在数据库关闭之前删除代码。通过使用以下 C# 代码,这可以部分地工作:
VBProject found = null;
Access.Application currApplication = this._currentInstance.Application;
if (target.Equals("") || scriptText.Equals(""))
return false;
foreach (VBProject vb in currApplication.VBE.VBProjects)
{
if (currApplication.CurrentDb().Name.Equals(vb.FileName))
{
found = vb;
break;
}
}
if (found != null)
{
foreach (VBComponent foundComponent in found.VBComponents)
{
if (foundComponent.Name.Equals(target))
{
return true;
}
}
VBComponent module = found.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
module.Name = target;
module.CodeModule.AddFromString(scriptText);
return true;
}
else
{
return false;
}
现在特别是,Access 在代码编辑器中可见的 VBA 代码模块和加载到数据库本身的模块之间进行了转移。要将模块插入数据库,需要再次保存。使用 GUI 时,会弹出一个窗口并要求在将其保存到数据库时使用名称。它已经采用了正确的等等,并且在手工完成之后就可以了。
除了手动解决方案之外,我发现无法以编程方式执行此步骤。
最初的想法是:
currApplication.DoCmd.OpenModule(target, Type.Missing);
currApplication.DoCmd.Save(Access.AcObjectType.acMacro, target);
或者
found.VBE.ActiveVBProject.SaveAs("");
我能想象的唯一两种方法就是做我想要的步骤。VBE 在其新的 .NET 兼容形式中的记录非常糟糕。应用于本机版本的方法不再有罪。所以我现在坚持下去。
如果有人问,你为什么要保存这个模块,因为一旦它被插入到 VBE 中,它就可以像 Access 中列出的任何其他模块一样运行,这是真的,但是由于一些未知的原因,这似乎更容易出错保存两次。启动宏时出现运行时错误(如 2501),正确保存时不会出现这种情况。
将它永远保存在 Access-Databases 中将是最后的选择,但由于这些 MDB 很多,因此它们经常变化,我认为让它动态化会很好。
希望有人理解我在这里写的东西,(对我来说不是那么容易),并且能够以某种方式提供帮助:)
感谢大家的阅读。期待一些好的结果,来自最好的社区,呵呵。