我已经在广泛地搜索有关此问题的答案,但是找不到任何具体的答案。我有一本excel工作簿,后面有许多宏。宏用于执行一些数据库查询,以及用于运行迭代计算的用户定义函数。数据库查询使用类模块,但是我小心地将它们设置为空。
无论如何-如果我打开工作簿并使用“正常”工作表功能,当我按“ X”关闭时,工作簿会问我是否要保存更改,然后退出。一切都很正常。但是,如果我运行导入数据的宏,那么当我尝试关闭工作簿时,我得到了“ wait”甜甜圈,并且闪烁了一下。我可以选择其他选项卡(因此它不是支持它的模式对话框)。
我打开VBA编辑器,甜甜圈大量闪烁,就像它试图在后台执行某些操作一样。通常,在VBA编辑器中,我可以单击“停止”或“暂停”按钮。有时候那行不通。这样做时,“是否要保存更改?”对话框出现,然后选择我的选项,工作簿将关闭。
我尝试修复该工作簿。我尝试导出并删除所有宏,然后重新导入它们。我尝试修复“ Workbook_BeforeClose”以启用和禁用显示警报,并设置“已保存”标志。什么都没有。
还有其他建议吗?真让我发疯!
编辑-突出代码:
编辑2:进一步更新: 我使用了一个用户定义的函数来处理查询中的数据,并将值作为数组返回。代码如下:
Public Function AllocateSPN(mda As Double, DQs As Range, MaxDQs As Range) As Variant
'//Input should be a range that has one row (and 10 columns)
If DQs.Rows.Count <> 1 Or MaxDQs.Rows.Count <> 1 Or DQs.Columns.Count <> MaxDQs.Columns.Count Then
AllocateSPN = "Check input! 1 row and Dqs must match Maxdq Columns"
Exit Function
End If
Dim colCount As Long
colCount = DQs.Columns.Count
Dim output() As Variant
ReDim output(1 To 1, 1 To colCount) As Variant
Dim sumMaxDQ As Long
Dim sumDQ As Long
Dim col As Long
For col = 1 To colCount
sumDQ = sumDQ + DQs.Cells(1, col).Value
sumMaxDQ = sumMaxDQ + MaxDQs.Cells(1, col).Value
Next col
If sumMaxDQ <= mda Then
For col = 1 To colCount
output(1, col) = MaxDQs.Cells(1, col).Value
Next col
AllocateSPN = output
Exit Function
End If
Dim thisAllocation As Double
Dim thisDQ As Double
Dim surplus As Double
For col = 1 To colCount
thisDQ = DQs.Cells(1, col).Value
thisAllocation = mda * thisDQ / sumDQ
If thisAllocation > MaxDQs.Cells(1, col).Value Then
surplus = surplus + (thisAllocation - MaxDQs.Cells(1, col).Value)
thisAllocation = MaxDQs.Cells(1, col).Value
output(1, col) = thisAllocation
Else
output(1, col) = thisAllocation
End If
Next col
If surplus = 0 Then
AllocateSPN = output
Exit Function
Else
Dim modDQ() As Double
ReDim modDQ(1 To colCount) As Double
Dim modDQsum As Double
While surplus > 0.1
ReDim modDQ(1 To colCount) As Double
modDQsum = 0
For col = 1 To colCount
If output(1, col) < MaxDQs(1, col).Value Then
modDQ(col) = DQs(1, col).Value
modDQsum = modDQsum + DQs(1, col).Value
Else
modDQ(col) = 0
End If
Next col
Dim maxAdditional As Double
For col = 1 To colCount
thisDQ = modDQ(col)
thisAllocation = surplus * thisDQ / modDQsum
maxAdditional = MaxDQs.Cells(1, col).Value - output(1, col)
If thisAllocation > maxAdditional Then
output(1, col) = MaxDQs.Cells(1, col).Value
Else
output(1, col) = output(1, col) + thisAllocation
End If
Next col
surplus = mda
For col = 1 To colCount
surplus = surplus - output(1, col)
Next col
Wend
AllocateSPN = output
End If
End Function
再次编辑:
好的-好像我已经“修复”了它,但是不知道如何。我发现,当我从工作表中删除UDF时,问题没有发生。认为这是一个问题。但是,当我在UDF表中手动更改输入数据时,也没有发生此问题。
所以...看来这与数据库调用代码和UDF之间的交互有关(数据库调用填充了UDF然后用作输入的单元格)。
我在数据下载开始时添加了application.Calculation = xlManual
和application.screenUpdating=false
,最后将它们重新打开(通常我还是这样做以提高效率)。似乎已经解决了问题!