从表单中删除二进制数据

有时崩溃始终以单一形式或报告发生,或仅在打印时发生。表单/报表中的二进制数据可能已损坏。

将表单/报表对象另存为文本有两个未记录的函数。Application.SaveAsText 和 Application.LoadFromText。你可以使用这些函数导出表单/报表定义,清理定义,然后再次导入。

  1. 在继续之前备份数据库
  2. 转到 VBA 立即窗口(Control + G)
  3. 输入 Application.SaveAsText acForm, "MyForm", CurrentProject.Path & "\MyForm.txt"(将 MyForm 替换为 Form / Report 的名称。如果是正在修复的损坏报告,请使用 acReport)
  4. 在数据库窗口中重命名原始表单项(例如,重命名为 MyForm.Bak)

清理表单/报告定义文件

  1. 在记事本中打开导出的文件(例如 MyForm.txt)

  2. 删除“Checksum =”行(应该在第 3 行)

  3. 清除二进制数据

    1. 识别二进制数据块。查看文件,你将看到以“Parameter = Begin”开头的行。在这些行之后,你将拥有编码二进制数据行。最后,二进制块将以仅包含 End 的行结束。二进制数据块包括第一行(带有 Begin 语句)和所有行,包括最后一行(带有 End 语句)。

      注意:所有这些块应该出现在窗体控件定义之前

    2. 删除以下参数的二进制数据块:

      • NameMap
      • PrtMip
      • PrtDevMode
      • PrtDevNames
      • PrtDevModeW
      • PrtDevNamesW
  4. 寻找其他问题。打开文件时,滚动文件的其余部分并查找引人注目的内容,尤其是底部的 VBA 模块代码。你将寻找任何与其他人相关的东西,可能是腐败。

  5. 保存文件。

将表单/报表加载回 Access 和 Test

  1. 将表单加载回 Access。
    • 在 Access 中,转到即时窗口(Control + G)
    • 输入 Application.LoadFromText acForm, "MyForm", CurrentProject.Path & "\MyForm.txt"
    • 反编译/压缩修复/重新编译(参见文档中的其他示例)
    • 打开表单/报告进行测试。希望现在一切正常。
    • 删除旧的损坏表格(例如 MyForm.bak)

防止将来发生这种腐败

报表/表单中损坏的二进制数据的最常见原因是多个计算机/用户使用相同的数据库客户端文件而不是拥有自己的单独副本。这就是为什么每个用户都应该在他们运行的桌面上拥有自己的客户端文件。