【发布时间】:2018-02-23 16:05:27
【问题描述】:
我有一个 VBA 函数,当我运行它时会导致 excel 崩溃(“Microsoft Excel 已停止工作”),但如果我单步执行编辑器中的每一行,它就可以正常工作。我想使用该功能打开另一个工作簿,更改给定工作表上的切片器,找到一个值,然后关闭新工作簿而不保存它。我的功能如下:
Function ValueLookup()
Dim Check As Boolean
Dim NewBook As Workbook
Check = IsWorkBookOpen("C:\Location\Filename")
If Check = False Then
Set NewBook = Workbooks.Open("C:\Location\Filename")
Else
Set NewBook = Workbooks("Filename")
End If
NewBook.Activate
Worksheets("Sheetname").Activate
ActiveSheet.PivotTables("pivottable1")ManualUpdate = True
With ActiveWorkbook.SlicerCaches("Slicer_SlicerName")
.ClearManualFilter
.VisibleSlicerItemsList = Array("[Tablename].[Columnname].&[MyValue]")
End With
ActiveSheet.PivotTables("pivottable1").ManualUpdate = False
ValueLookup = ActiveSheet.Cells.Find(What:="*", _
After:=Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
searchorder:=xlByRows, _
searchdirection:=xlPrevious, _
MatchCase:=False)
If Check = False Then NewBook.Close savechanges:=False
End Function
(IsWorkBookOpen() 取自 Detect whether Excel workbook is already open,似乎没有任何问题)。
似乎尝试关闭新工作簿是导致问题的原因,如果在我运行该功能之前工作簿已打开,则没有问题。调用该函数的子例程通常会在 excel 崩溃之前执行该函数之后的行(打开一个 MsgBox 供用户输入)。我尝试在每行之后添加 Sleep 1000 并在最后一行之后添加 DoEvents ,结果没有变化。我试过改变
NewBook.Close savechanges:= False
到
Application.Windows("NewBook").Close
没有任何区别。我也试过用
替换结尾If Check = False Then
Cancel = True
Application.OnTime Now, "Close_Xls"
End If
End Function
Sub Close_Xls()
ThisWorkBook.Close savechanges:=False
End Sub
但这会在我的子例程完成后关闭错误的工作簿(我希望从中运行宏的原始工作簿)。但是,在关闭错误的工作簿之前,它似乎确实成功执行了代码,并且不会导致 excel 崩溃。
有什么建议吗?
编辑:
它现在似乎可以正常工作了。我更改了以下内容:
If Check = False Then NewBook.Close savechanges:=False
End Function
到
NewBook.Saved = True
If Check = False Then
Cancel = True
Application.OnTime Now, "Close_Xls"
End If
End Function
Sub Close_Xls()
Workbooks("Filename").Close savechanges:=False
End Sub
谢谢!
【问题讨论】:
-
我遇到了我认为可能是类似的问题,并发现在探索了许多其他可能的解决方案之后,我必须重新创建正在打开的工作簿的文件(并在关闭时崩溃)才能解决它.
-
虽然我不确定是什么导致了问题,但您可以在关闭文件之前尝试 DoEvents。听起来你有某种时间问题。 DoEvents 会将控制权交给操作系统以完成任何待处理的任务。关于使用 DoEvents 有很多争论,但在这里它可能会对您有所帮助。
-
在关闭前尝试
NewBook.Saved = True。也可以在你的Close_Xls()sub 中尝试Workbooks("Filename").Close savechanges:=False。 -
@robinCTS 我添加了这两项更改,现在它似乎可以正常工作了,谢谢!
-
你能不能一次只做一个改变,如果有任何工作可以让我知道吗?