我有一个相对较小的(~100K)Excel 2010 电子表格,当它(通过 VBA)打开时,会关闭除起始页之外的所有工作表,检查用户名并与 SQL 表进行交叉检查,然后返回用户的记录以检查他们的权限。
一些单元格更新了 rangeUserName、rangeCurrentUser、rangeSystemAccess 等...
如果我打开此工作簿时有其他大型电子表格(也有 vba),则大约需要 30 到 60 秒才能打开,而如果没有打开其他工作簿,则需要不到 5 秒。
为什么是这样?
答案1
默认情况下,Excel 在单个 EXCEL.EXE 进程中打开每个文件 - 您可以在 Windows 任务管理器的“进程”选项卡中查看此过程。
因此继续打开文件可能会导致该进程内的争用 - 最终它将耗尽内存并变慢或崩溃。
为了避免这种情况,您可以将后续 Excel 窗口作为单独的 EXCEL.EXE 进程启动。您可以通过按住 Shift 键并从“开始”菜单中选择 Excel 或在任务栏中单击它来执行此操作。一旦它们作为单独的进程启动,Windows 似乎可以更好地管理资源 - 我相信它会将不活动的进程交换到虚拟内存中。
对于 Excel 2013,他们使这个游戏变得更难了一点 - 您必须按住 Shift + Alt 直到出现确认窗口。
我倾向于以这种方式打开每个 Excel 窗口,尤其是在处理大型文件、VBA 代码、数据透视表、外部数据或加载项时。除了首先避免资源问题之外,它还意味着如果发生崩溃或冻结,您只会丢失一个窗口中的工作,而不是一次丢失所有工作。