如何摆脱使用“ Transferdatabase”创建的ms-access“ ghost模块”

时间:2019-09-19 09:21:18

标签: vba ms-access module

我们有一个ms-access数据库用作框架。

因此,我们使用一个称为“更新框架”的函数,在该函数中,我们使用此代码将一些模块从框架转移到目标数据库中

db_fw.DoCmd.DeleteObject xxx_obj_t, rec_ref!REFR_NAME
...
db_fw.DoCmd.TransferDatabase acImport, "Microsoft Access", dCopiedFrameworkFile, xxx_obj_t, rec_ref!REFR_NAME, rec_ref!REFR_NAME

大约99%的时间都可以正常工作。

但是自一段时间以来,我发现有时-很少-不用更换模块,ms-access会创建一个名称相同但末尾带有数字的模块。

例如模块“ ICanAfterStart”不再可见。而是可以看到模块“ ICanAfterStart1”。所有代码都像以前一样工作。因此,“ IcanAfterStart的实现”仍然可以编译并且可以正常工作。

当我再次更新框架时,将创建一个名为“ ICanAfterStart2”(依此类推)的模块。

直到现在,这仅在接口模块中发生,我们总是在开头用“ I”命名。

我已经尝试过:

  • 反编译数据库

  • 压缩和修复数据库

  • Application.SaveAsText;删除所有可见的“ ICanAfterStart *”模块,然后尝试使用Application.LoadFromText重新导入该模块。但是Application.LoadFromText导致“运行时错误2950:保留错误”

  • 我创建了一个名为“ ICanAfterStart”的新模块,在其中将代码作为文本复制到了其中。但是在下一个框架更新之后,“ ICanAfterStart”不再可见,并且“ ICanAfterStart1”在那里。

作为目前的“解决方案”,我尝试备份文件,直到找到一个没有此错误的文件为止。由于这是很多工作,因此我必须重新创建之前编写的所有代码,这是一个糟糕的解决方案。

那么,有谁知道问题出在哪里,并且为我找到了更实际的解决方案?

1 个答案:

答案 0 :(得分:0)

好。现在似乎可行(有时?)。这就是我要做的:

  • 用以下方法导出原始对象:

    Application.SaveAsText acModule,“ ICanAfterStart”,“ ICanAfterStart.txt”

  • 使用“ del”删除所有可见的“ ICanAfterStart *”模块

  • 创建了新的类模块“ ICanAfterStart”,“ ICanAfterStart1”等等
  • 通过

    删除新创建的模块

    DoCmd.DeleteObject acModule,“ ICanAfterStart”

  • 通过

    导入了原始模块

    Application.LoadFromText acModule,“ ICanAfterStart”,“ ICanAfterStart.txt”

从源数据库(框架)中删除并重新导入原始的“ ICanAfterStart”也可能有所帮助