专为易于使用而设计的 Microsoft 关系数据库管理系统系列。
注:此回复已自动翻译。因此,它可能包含语法错误或表达尴尬。
感谢您来到 Q&A 论坛提问,并分享了如此详细的环境信息、引用库设置以及事件查看器日志。这些细节非常有帮助。
由于我无法拥有与您完全相同的环境(设备驱动、Windows 版本、Office 版本等),同时我也没有您的 Access 文件来进行直接复现,因此以下建议主要基于我的查阅资料与过往经验整理而成。
您 VBA 代码中有一个非常可疑的点:在 64 位环境下,API 声明可能使用了不正确的数据类型(Long 与 LongPtr)。在 64 位 Office 中,句柄/指针类参数应当使用 LongPtr。如果仍使用 Long,可能导致内存破坏,从而引起 Access 随机崩溃,甚至在多个数据库文件中都出现类似问题。您可以尝试将代码从 Long 修改为 LongPtr,例如:
' Win64 Compatible Declarations
' hWnd 和返回值必须是 LongPtr
Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
' hWnd 和 hDC 都是句柄(指针)-> LongPtr;返回值是 Long
Public Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As Long
' nIndex 只是整数,这里用 Long 没问题;返回值是 Long
Public Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
' hDC 是句柄 -> LongPtr
Public Declare PtrSafe Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As LongPtr, ByVal index As Long) As Long
' saArray 暗示指向数组结构的指针 -> 我这里保持您原来的写法,
' 但很多情况下如果能用 UBound(),就不需要调用 SafeArrayGetDim
Public Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long
此外,在执行任何修复操作之前,请先保护您的文件。方法是将 Access 文件复制到另一个本地位置并重命名,例如:Copy_您的文件名.accdb(这样,即使操作失败,原始文件也不会丢失)。
您还可以尝试修复 Microsoft 365:在控制面板中搜索 > 卸载程序 > 右键单击 Microsoft 365 > 更改。选择“快速修复”,如果问题仍然存在,请选择“联机修复”。
为了减少加载项的干扰并隔离问题,请尝试在安全模式下打开 Access 并修复复制的文件:按 Win + R > 输入 msaccess /safe
- 打开数据库(请打开复制/重命名后的那个文件)
- 在 Access 功能区:文件 → 信息 → 压缩并修复数据库(Compact and Repair Database)
- 如果成功,Access 通常会生成一个修复后的文件(可能在原路径、但名称会变化)。请打开它并检查数据是否完整。
如果在界面里“压缩并修复”失败,可以尝试命令行方式:
- 按 Win + R > 输入
cmd> 回车 - 运行以下命令(请用您的实际路径替换):"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "Your file path.accdb" /compact
- 回车执行并等待完成;如果成功,请打开修复后的数据库并验证数据。
如果修复仍然失败,建议尝试将对象导入到一个新数据库中(即使原文件损坏,很多时候也能通过这种方式抢救出内容):
- 打开 Microsoft Access(启动后先不要打开任何文件)
- 点击 文件 → 新建 → 空白桌面数据库
- 创建一个新文件,例如
NewBackup.accdb,保存到桌面或本地目录 - 在新数据库中:外部数据 → 新建数据源 → 从数据库 → Access
- 在“导入对象”窗口,选择: “将表、查询、窗体、报表、宏和模块导入到当前数据库”
- 点击 浏览 选择您损坏文件的“复制件”
- 点击 确定 如果 Access 能读取文件,会列出对象;请选择需要的对象(或全选)然后点击 导入
- 如果只能部分导入成功,请优先检查表数据(最重要),然后把新文件保存为备份。
如果在导入过程中仍然崩溃,您可以尝试使用 /decompile 清理编译缓存,然后再尝试修复或导入:"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "Your file path.accdb" /decompile
关于您提到的 Windows 错误:很抱歉这一部分超出我的能力范围,不过您可以尝试一些基础的系统修复步骤:
- 按 Win + R,输入
services.msc并回车 - 找到 Windows Update → 右键 → 停止
- 以管理员身份打开命令提示符(右键开始菜单 → 命令提示符/终端(管理员))
- 依次执行以下命令:
sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth
另外,我注意到一条可能比较关键的错误:
- 事件 ID 11(Disk - Controller Error)(日期:2025/12/7) “驱动程序在 \Device\Harddisk1\DR6 上检测到控制器错误。”
由于存储/控制器相关错误可能导致文件损坏并引发应用程序不可预测的崩溃,我建议您考虑联系购买设备的商家/卖家(或联想官方支持)进一步检查该磁盘/控制器错误(SSD 健康、控制器/固件、驱动等)。
希望这些信息能对您有所帮助。请您尝试以上建议并告诉我结果(尤其是把 Long 改为 LongPtr 后崩溃是否减少,以及“压缩修复”或“导入对象”是否成功)。如果这仍然不能反映你的情况,请在评论区告诉我。
注意:如果您希望收到此线程的相关电子邮件通知,请按照我们的文档中的步骤启用电子邮件通知功能