0

尽管我最后的问题没有被很好地接受,但我会再试一次。

我正在开发一个能够通过使用 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 很多,因此它们经常变化,我认为让它动态化会很好。

希望有人理解我在这里写的东西,(对我来说不是那么容易),并且能够以某种方式提供帮助:)

感谢大家的阅读。期待一些好的结果,来自最好的社区,呵呵。

4

0 回答 0