2017-04-26 105 views
1

我在VBA中广泛使用了32位2013 Excel。我已禁用硬件图形加速和COM加载项,但我仍然努力解决以下问题:Excel VBA:内存超过第二次导入的限制

我导入另一个大型工作簿的格式与单元格但没有公式(〜3MB Excel文件)的内容到有问题的Excel工作簿。第一次尝试 - 当内容尚未导入时 - 导入成功。我导入通过VBA类似于下面的代码内容:

Application.Workbooks(F_Home).Activate 
Workbooks(F_Home).Sheets(Sheet1).Visible = xlSheetVisible 
... 
Application.Workbooks(F_Source).Activate 
Workbooks(F_Source).Sheets(S_Source).Cells.Copy Destination:=Workbooks(F_Home).Sheets(Sheet1).Cells 
Application.Workbooks(F_Home).Activate 

F_Home是有问题的Excel工作簿和F_Source与我们导入的内容的工作簿在这样做时第一次它的工作原理,然后。我保存该文件并关闭它,然后重新打开该文件,然后再次尝试。在第二次尝试导入内容时(当内容已经导入时),F_Home工作簿在将F_Source内容复制到的行上崩溃,出现内存不足错误(没有足够的内存来完成此操作...) F_Home。

使用Process Explorer我发现Excel进程的虚拟内存大小通常在600mb-700mb左右,但是当我们运行VBA脚本第二次导入内容时,虚拟内存大小突然跳到4GB(这不会发生在第一次,其中保持在600mb - 700mb范围内)。我应该如何解决这个问题?我无法做一个解决方法,比如在第二次导入内容之前保存文件,因为使用了该文件的时间戳,并且通过VBA保存文件会使某些用户感到困惑。

谢谢你的帮助。

+0

工作簿上没有公式要导入的内容 - 只是数据。 – haans

+1

您的问题来自您复制1048576 * 16384单元的事实。你知道那有多大?你真的需要这样做吗?您只能复制其中包含数据的范围,而且速度更快,计算成本更低。 – Masoud

+0

另外,如果没有公式,请考虑将它们分配给范围而不是复制/粘贴。 – Masoud

回答

0

复制并粘贴整张纸不是明智的做法。假设您有来自“A1:Z99999”的数据。你可以做到这一点会更快。

Set S_Range = Workbooks(F_Source).Sheets(S_Source).Range("A1:Z99999") 
Set H_Range = Workbooks(F_Home).Sheets(Sheet1).Range("A1:Z99999") 

H_Range.Value = S_Range.Value 

也读出why you should avoid selecting and activating in vba

+0

不幸的是,我遇到了使用此方法复制数据的问题。处于调试模式时,将使用F_Source工作簿中的所有数据填充S_Range变量,并将数据复制到F_Home工作簿。但是,在不调试代码的情况下调用此函数时,它仅复制3行数据,而不是F_Source工作簿中的数千行。 – haans

+0

请[编辑](http://stackoverflow.com/posts/43644970/edit)你的问题,并包括你正在使用的确切代码。这部分代码没有任何问题。别的东西会触发它。 – Masoud