Excel 清除存储在内存中的数据或进一步简化此子模块?

Excel 清除存储在内存中的数据或进一步简化此子模块?,excel,vba,performance,optimization,Excel,Vba,Performance,Optimization,当我运行潜艇时,它的某个地方出了问题。我通过另一个潜艇呼叫它,但在这个例行程序中,我的整个电脑在某处崩溃了 1-有没有一种方法可以比我已有的方法更进一步地简化它,以及 2-我找不到在这一点之前删除内存中存储的任何内容的命令,或者如果合适的话,我可以在代码中插入类似的内容 Sub Splitbook() Dim xPath As String, xWs As Worksheet, Box As String xPath = Application.ActiveWorkbook.Path Appli

当我运行潜艇时,它的某个地方出了问题。我通过另一个潜艇呼叫它,但在这个例行程序中,我的整个电脑在某处崩溃了

1-有没有一种方法可以比我已有的方法更进一步地简化它,以及

2-我找不到在这一点之前删除内存中存储的任何内容的命令,或者如果合适的话,我可以在代码中插入类似的内容

Sub Splitbook()
Dim xPath As String, xWs As Worksheet, Box As String
xPath = Application.ActiveWorkbook.Path
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Box = Application.InputBox("Set?")

For Each xWs In ActiveWorkbook.Sheets
    If xWs.Name <> "Master" Then
        xWs.Copy
        Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWs.Name & " " & Box & ".xlsx"
        Application.ActiveWorkbook.Close False
    Else

    End If
Next

Application.DisplayAlerts = True
End Sub
Sub Splitbook()
将xPath设置为字符串,将xWs设置为工作表,将框设置为字符串
xPath=Application.active工作簿.Path
Application.ScreenUpdating=False
Application.DisplayAlerts=False
Box=应用程序.InputBox(“设置?”)
对于ActiveWorkbook.Sheets中的每个xWs
如果xWs.Name为“Master”,那么
拷贝
Application.ActiveWorkbook.SaveAs文件名:=xPath&“\”&xWs.Name&“&Box&“.xlsx”
Application.ActiveWorkbook.Close False
其他的
如果结束
下一个
Application.DisplayAlerts=True
端接头

如果这不是一个合适的主题,请提前道歉。

我建议您尝试使用VBA.DoEvents。您遇到的问题可能是由于在打开和关闭excel工作簿时使用了大量系统内存。当您有太多的工作簿在流通时,您的原始excel将变成“无响应” 使用VBA.DoEvents可能会降低总体速度,但应防止原始工作簿“无响应”

ActiveWorkbook.Sheets中每个xWs的

如果xWs.Name为“Master”,那么
vba.DoEvents
拷贝
Application.ActiveWorkbook.SaveAs文件名:=xPath&“\”&xWs.Name&“&Box&”_
“.xlsx”
Application.ActiveWorkbook.Close False
其他的
如果结束
下一个

您正在循环浏览工作簿的每个工作表。假设它有两张纸,两张都没有命名为“master”。您
。复制的第一张工作表
,然后保存
活动工作簿
。然后关闭
activeworkbook
。然后它迭代到现在已关闭的工作簿的第二页。。。这似乎不是你想发生的事。在循环完成之前,您可能不想关闭
activeworkbook
?也。。。为什么
。复制工作表。你从不把它贴在任何地方。这似乎是多余的,所以运行它的文件通常有96个选项卡。其中95只不过是一个门店编号,第96只则是包含所有信息的“主控”。这样做的目的是将每个选项卡拆分为一个单独的文件。您在
xWS.Copy
行中的操作是正确的;这应该被删除。至于
ActiveWorkbook
行,你是说
语句中的第一行是唯一需要的行吗?我担心所有这些“ActiveWorkbook”都会导致这个问题。在您的
上方进行
循环放置
设置xWB=ActiveWorkbook
。然后,对于xWB.Sheets中的每个xWs,您的
For
循环可以看起来像
。保持代码的其余部分不变,看看这是否能防止它崩溃。现在尝试。但我应该注意到,75%的情况下,这是完美的。当我在运行时打开了几个程序时,这就是电脑崩溃的时候。它已经运行了,但我无法在我想要的时候重现崩溃。但是,删除我提供的原始代码的任何其他部分并没有按预期完成。我刚刚测试了它,它确实运行到了完成阶段。你的答案肯定在我想要的轨道上,因为我认为是系统内存问题导致了我的崩溃。我将不得不再使用这个解决方案几次,以100%确定它已经解决了问题,但我觉得你回答了我的问题。谢谢
For Each xWs In ActiveWorkbook.Sheets
If xWs.Name <> "Master" Then
vba.DoEvents
    xWs.Copy
    Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWs.Name & " " & Box & _
".xlsx"
    Application.ActiveWorkbook.Close False
Else

End If
Next