为什么即使关闭该Excel文件,文件仍会出现在项目窗口中

时间:2018-08-08 07:05:58

标签: excel vba excel-vba out-of-memory userform

场景

我有一个用户窗体,当按下按钮时,它将以只读方式打开一个excel文件,并从该文件中获取一些值并关闭。以下是我用来打开和关闭文件的代码

要打开:Set planbook = Workbooks.Open(planFilePath, ReadOnly:=True)

要关闭:planbook.Close False

问题

我面临的问题是,即使关闭文件后,每当我按下按钮时,我仍会在宏文件的项目窗口(请参见图片)中看到该文件。因此,它占用了大量内存。因此,excel断断续续地挂起,整个事情变得一团糟。

我想知道为什么有些文件我以前打开过,但是当前关闭的文件仍然出现在项目窗口中。有人遇到过类似的问题吗?请看图片。请注意,我按了3次按钮(表示3次打开和关闭工作簿),因此图片中列出了三个文件

Modules show after closed Planner file.xlsx

编辑1

我刚刚意识到,实际上并不是剩下的模块了。实际上,尽管该工作簿已关闭,但整个文件似乎在VBA窗口中可见。

编辑2

注意到,如果我将宏打开一段时间,则在项目窗口中显示的文件将一一消失。

编辑3

经过多次检查,发现问题不是由于我的代码或其他原因引起的。完全是因为我要打开和关闭共享工作簿。请查看答案以获取更多说明

1 个答案:

答案 0 :(得分:0)

经过多次检查,发现该问题不是由于任何代码引起的。完全是因为我要打开和关闭共享工作簿。使用共享工作簿时,这种类型的问题很常见。因此,最好避免使用共享工作簿。

在这些过程中,我为清除内存问题所做的一些操作是

  1. 使用完后立即清除变量和对象。

    Eg: Set wb = nothing

  2. 尽可能打开只读的工作簿。

    Eg: Set wb = Workbooks.Open(blanketPo, ReadOnly:=True)

  3. 在传递数据时,尽可能尝试使用ByRef代替ByVal。但同时使用这两者时,也请注意其含义。
  4. 复制大量数据并用完这些数据后,使用Application.CutCopyMode = False
  5. 从内存中清除数据
  6. 使用以下代码清空剪贴板,例如在运行宏时复制并保存在剪贴板中的对象和东西。我从另一个论坛获得了这段代码

    Dim DataObj As New MSForms.DataObject 'empty the clipboard DataObj.SetText "" DataObj.PutInClipboard

无论如何,当我选择不使用共享工作簿时,大部分内存和挂断问题就消失了。因此,这主要是关于越野车共享工作簿的。