访问在加载userform时崩溃

时间:2016-12-13 15:53:14

标签: ms-access access-vba ms-access-2010

我已经构建了我的应用程序,但出现了一个问题,我无法理解 - 我的应用程序还没有autoexec,所以我打开访问权限并双击我的用户窗体打开它。

打开userform Access崩溃并关闭

但是,如果我首先将userform放在设计视图中,那么在表单视图中打开表单就可以了。

这怎么可能?

它不能是表单加载编码,或者从设计视图到表单视图时仍然会崩溃。

我将在表格中包含表单加载编码:

Me.LastImport.Value = DLast("LastImport", "tbl_Import_Export_logger")
Me.Text42.Value = Date
Me.Text44.Value = Date - Weekday(Date, 3)

'Compliance Reporting
Me.Text68 = DCount("[CustomerAccountNumber]", "Q_HealthChecksOverdue") 'Overdue Health Checks
Me.Text76 = DCount("[CustomerAccountNumber]", "Q_HealthChecksdue") ' Due Health Checks
Me.Text74 = DCount("[CustomerAccountNumber]", "Q_HealthChecksCompleted") ' Completed Health Checks
Me.Text72 = DCount("[LettersDueStatus]", "Q_LettersSent_Query") 'Count number of letters sent

2 个答案:

答案 0 :(得分:2)

(最初写在Stack Overflow文档中)

如何解决Access崩溃问题

当您收到错误时:" Microsoft Access遇到问题并需要关闭",通常没有很多信息可以帮助您确定错误原因。以下是您可以采取的一系列步骤来解决错误原因。

反编译数据库

这应该始终是您的初步修复。一个好的策略是在每次发布之前对数据库进行反编译。

  1. 创建反编译快捷方式

    这会使用" /反编译"加载数据库。开关。

    1. 右键单击数据库文件。选择复制
    2. 右键单击资源管理器窗口,然后选择"粘贴快捷方式"
    3. 右键单击快捷方式,然后选择"属性"
    4. 在目标框中,转到该行的末尾并添加/decompile
    5. 单击“确定”关闭快捷方式
  2. 使用Shift打开数据库。

    双击此快捷键时按住Shift键。 这可以防止在数据库中执行任何自动运行。 你应该直接进入导航窗口。

  3. 压缩并修复数据库。

    加载数据库后,您需要单击“压缩和修复”按钮。

  4. 工具功能区上找到压缩和修复数据库按钮。

  5. 按住Shift键。单击压缩和修复按钮时按住它。

  6. 重新编译数据库

  7. 进入VBA窗口(Control + G)

  8. 选择调试 - >从菜单编译
  9. 这是完整的反编译过程。通常它应该修复99%的所有Access崩溃或奇怪的表单行为。

    重建整个数据库

    这是很多工作,所以在用完所有其他选项之后这是最后的手段。如果在不同的计算机上针对不同的用户发生问题,则只需执行此操作。如果没有为所有用户发生,那么很可能它不是一个损坏的数据库容器。

    与删除二进制数据的步骤类似,您将从头开始重建数据库。这个过程有点仪式化,但如果小心翼翼地完成,不要“保持"任何可能的腐败,那么这个过程非常有效。

    创建新的访问数据库容器。

    • 在“访问”中,在“文件”选项卡上,您可以选择"新"。以ACCDB格式创建一个新的空数据库。

    将所有对象移至新容器

    使用Access中的导入/导出功能移动对象,而不是简单地单击并拖动。这样做可以将损坏的项目复制到新容器中。

    <强>表格

    • 对于旧访问容器中的每个表,在新容器中创建一个新表。
    • 从设计视图中,复制/粘贴字段定义。
    • 检查表属性以确保它们在两个数据库中都匹配
    • 同时移动任何数据宏(请参阅宏部分了解如何执行此操作)
    • 要移动数据,请将旧数据导出为XML或CSV,然后从该格式导入。

    <强>查询:

    • 将每个查询加载到SQL视图中。
    • 复制/粘贴SQL文本。
    • 粘贴到新数据库中。
    • 比较查询属性以确保它们匹配。

    表单/报告:

    • 对于每个表单/报表,使用Application.SaveAsText函数将表单/报表导出到文本文件。
    • 删除二进制数据(请参阅从表单中删除二进制数据文档以熟悉此过程)
    • 使用Application.LoadFromText函数将对象重新导入新数据库

    <强>的宏

    您有三种移动宏的方法。

    1. 在新数据库容器中手动重新创建每个宏。
    2. Application.SaveAsText / Application.LoadFromText方法与acMacro参数一起使用。
    3. 复制/粘贴每个宏的宏定义
      • 选择全部(Control + A)以选择所有宏元素。然后复制(Control + C)。
      • 打开一个空白的记事本文档并粘贴(Control + V)宏XML。
      • 在新数据库容器中创建一个新的空白宏。
      • 在记事本中,选择所有文本(Control + A)。然后复制(Control + C)
      • 在空白宏中,粘贴(Control + V)。应该出现宏。保存它。
    4. <强>模块

      • 对于每个模块,选择所有代码(Control + A)并粘贴(Control + V)到新数据库容器中。
      • 请务必检查数据库属性(在VBA窗口中,转到工具 - &gt;客户端属性)

      数据宏

      对于每个数据宏,请使用SaveAsText / LoadFromText方法。

      1. 进入VBA立即窗口(Control + G)
      2. 键入Application.SaveAsText acTableDataMacro, "MyTableName", CurrentProject.Path & "\MyTableName.txt"(将MyTableName替换为包含数据宏的表的名称)
      3. 查看文件是否有任何损坏迹象
      4. 在新数据库容器中,使用Application.LoadFromText acTableDataMacro, "MyTableName", CurrentProject.Path & "\MyTableName.txt"
      5. 加载定义

        如前所述,这是 LOT 的工作,但它有结果。将Access 97数据库迁移到2000或将Access 2000数据库迁移到2003时,也应使用此方法。

        删除&#34; OLE对象&#34;字段

        如果您将Access本身存储的图像或其他数据作为OLE对象,那么您应该找到更好的方法。存储OLE数据时,根据存储它的计算机上的软件(和软件版本)存储它。当另一台计算机在窗体上显示该OLE对象数据但没有安装确切的软件/版本时 - 这通常会导致应用程序崩溃。

        如果要存储图像数据,则更好的方法是存储文件名,而不是将图像保存到标准位置。较新版本的访问具有本机控件,可以实现这一目标。

        从表单

        中删除二进制数据

        有时,崩溃会在单个表单或报告中不断发生,或者仅在打印时发生。表单/报表中的二进制数据可能已损坏。

        将表单/报表对象另存为文本

        有两个未记录的功能。 Application.SaveAsText和Application.LoadFromText。您可以使用这些函数导出表单/报表定义,清理定义,然后再次导入。

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

          清理表单/报告定义文件

          1. 在记事本中打开导出的文件(例如MyForm.txt)
          2. 删除&#34; Checksum =&#34;线(应该在第3行)
          3. 清除二进制数据
            1. 识别二进制数据块。查看文件,您将看到以&#34;参数=开始&#34;开头的行。在这些行之后,您将拥有编码二进制数据行。最后,二进制块将以仅包含&#34; End&#34;的行结束。二进制数据块包括第一行(带有Begin语句)和所有行,包括最后一行(带有End语句)。 注意:所有这些块都应出现在窗体控件定义
            2. 之前
            3. 删除以下参数的二进制数据块:
              • NameMap
              • PrtMip
              • PrtDevMode
              • PrtDevNames
              • PrtDevModeW
              • PrtDevNamesW
          4. 寻找其他问题。打开文件时,滚动文件的其余部分并查找引人注目的内容,尤其是底部的VBA模块代码。你将寻找任何与其他人相关的东西,并且可能是腐败。
          5. 保存文件。
          6. 将表单/报表重新加载到Access和Test

            1. 将表单重新加载到Access。

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

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

              测试计算机内存

              如果您的崩溃是随机或偶发的,请执行此步骤。如果每次运行数据库时都会发生崩溃,那么此步骤不会解决问题(尽管可能是内存不良导致首先发生损坏的原因)。

              使用在操作系统外部启动并运行多次传递的内存测试程序。两种流行的选择是MemTest86(商业)和MemTest86+(开源)

              开始测试并让它在工作时间运行。原因是因为建筑物中的其他因素(如电源电路上的噪声)可能会导致内存错误,因此您希望尝试保持变量不变。

              如果您有内存错误,则需要确定是由于计算机内存不良还是其他因素造成的。但是,这超出了本文档的范围。

              说明

              确保在测试时从等式中删除其他变量

              网络损坏

              请勿将客户端从网络加载。把它放在本地驱动器上并从那里运行。

              企业建设

              如果您所处的公司环境正在使用&#34;计算机构建&#34;并且在反编译,测试内存和剥离二进制数据方面没有成功 - 然后拒绝进行进一步测试,直到IT团队可以为用户提供仅安装了Windows,Office和Service Pack的测试计算机。

              应手动安装所有软件和更新,而无需使用无人参与安装。请勿在此计算机上安装防病毒软件进行测试。

              了解许多IT部门只是尝试使用构建执行One-Size-Fits-All方法,并且它们的构建都基于彼此。随着时间的推移,软件冲突可能直接导致访问崩溃或行为异常。

              电力不足

              如内存示例中所述 - 电源波动可能导致计算机错误。如果数据库位于工业建筑物中,那么请尝试使用电源调节器或提供清洁电源的UPS(关闭电池,而不是通过金属氧化物压敏电阻器离开主电源)

              另外,检查插入电源插座或插座的电源线。确保仪表和电压规格足够。 IT部门经常将电源线插入工作站,然后卸下机器。多年以后,他们正在使用更强大的电源,但没有关闭电缆。它有所作为。如有疑问,请带上一根新的,更粗的电缆。

答案 1 :(得分:0)

感谢您的回复。我最终没有测试你们所提到的建议。

在我的情况下,在VB中我运行了调试,它突出显示了我的代码中的2个问题所以我对它们进行了排序,现在运行正常。

谢谢大家