代码之家  ›  专栏  ›  技术社区  ›  Anu

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

  •  -1
  • Anu  · 技术社区  · 6 年前

    脚本

    我有一个用户表单,当按下按钮时,它以只读方式打开一个Excel文件,获取一些值,然后关闭该文件。下面是我用来打开和关闭文件的代码。

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

    关闭: planbook.Close False

    问题

    关闭文件后,每次按下按钮,我都会在项目窗口中看到该文件。

    Modules show after closed Planner file.xlsx

    它占用了大量的内存。因此,Excel会间歇性挂起。

    为什么先前打开但当前关闭的文件仍显示在项目窗口中?

    注意,当按钮被按下三次(意味着打开和关闭工作簿三次)时,图片中列出了三个文件。

    编辑1
    剩下的不是模块,整个文件在VBA窗口中可见,尽管工作簿已关闭。

    编辑2
    注意,如果宏保持打开一段时间,项目窗口中显示的文件将逐个消失。

    编辑3
    我发现,该问题是由于打开和关闭共享工作簿造成的。更多解释见答案。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Anu    6 年前

    经过多次检查,发现问题不是由任何代码引起的。这纯粹是因为我正在打开和关闭一个共享工作簿。使用共享工作簿时,此类问题很常见。因此,最好避免使用共享工作簿。

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

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

      Eg: Set wb = nothing

    2. 尽可能以只读方式打开工作簿。

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

    3. 尝试使用 ByRef 而不是 ByVal 在传递数据时尽可能。但在使用这两个词时也请注意其含义
    4. 在复制了大量数据并用这些数据完成使用后,使用 Application.CutCopyMode = False
    5. 使用以下代码清空剪辑板,例如对象和复制的材料,并在运行宏时保存在剪贴板中。我从另一个论坛得到这个代码

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

    不管怎样,当我选择不使用共享工作簿时,大部分内存和挂断问题都消失了。所以主要是关于有缺陷的共享工作簿。

    推荐文章