运行宏后,Excel无法关闭

时间:2019-02-28 23:37:36

标签: excel vba

我已经在广泛地搜索有关此问题的答案,但是找不到任何具体的答案。我有一本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 = xlManualapplication.screenUpdating=false,最后将它们重新打开(通常我还是这样做以提高效率)。似乎已经解决了问题!

0 个答案:

没有答案