macros从VBA界面运行时,Excel崩溃,但使用button时工作

我有一个macros,它采用不同的范围,使用它们中的值执行计算,然后将值复制到一个单元格,以供工作表中的公式使用。 我希望这个macros在特定范围内的值被修改时运行。 我在不同的工作表中使用相同的代码,最初放置一个ActiveXbutton。 问题是,当我把macros放在工作表中,或者Worksheet_SelectionChange Excel全部崩溃。 起初,我假设我造成无限迭代,但使用EventEnable = FALSE和EnableCalculations = FALSE来避免该行为Excel仍然崩溃。 我删除了SelectionChange和Calculate中的macros,并进一步检查了这个问题,发现当macros从VBA界面运行时,Excel也崩溃了,但是它与引用macros的工作表中的ActiveXbutton一起工作。 我似乎无法find代码出了什么问题,为什么它通过button访问时运行完美,但从VBA界面运行时崩溃。

这里是代码,请帮我看看有什么问题,或者我可以尝试一下,以便从VBA运行,因为调用它或者从界面运行它将会使Excel崩溃。

Sub performCalculations() Dim revenue As Double Dim expenses As Double Dim i As Integer Dim j As Integer Dim count As Integer Dim aConst As Double Dim tempConst As Long Dim bla As Range Dim curve As Range Dim price As Range Dim finalOut As Range Dim a As Double Dim tempString As String Set bla = ActiveWorkbook.ActiveSheet.Range("D16:D75") Set curve = ActiveWorkbook.ActiveSheet.Range("G2:WH11") Set price = ActiveWorkbook.ActiveSheet.Range("G162:WH164") Set finalOut = ActiveWorkbook.ActiveSheet.Range("G83:WH141") tempString = ActiveWorkbook.ActiveSheet.Name tempString = Left(tempString, InStr(1, tempString, " ", vbTextCompare) - 1) a = ActiveWorkbook.Sheets(tempString).Cells(10, 8).Value aConst = a / 1000 For i = 1 To bla.Rows.count count = 1 For j = 1 To curve.Columns.count If j < i Then finalOut.Cells(i, j) = 0 Else If bla.Cells(i, 1) = 0 Then finalOut.Cells(i, j) = 0 Else tempConst = curve.Cells(2, count) * aConst * price.Cells(2, j) revenue = bla.Cells(i, 1) * (curve.Cells(1, count) * price.Cells(1, j) + curve.Cells(3, count) * price.Cells(3, j)) expenses = bla.Cells(i, 1) * curve.Cells(4, count) + bla.Cells(i, 1) * curve.Cells(5, count) + bla.Cells(i, 1) * _ curve.Cells(6, count) + bla.Cells(i, 1) * curve.Cells(7, count) + bla.Cells(i, 1) * curve.Cells(10, count) expenses = expenses + revenue * curve.Cells(9, count) + tempConst * curve.Cells(8, count) revenue = revenue + tempConst finalOut(i, j) = revenue - expenses count = count + 1 End If If i > 1 Then finalOut.Cells(i, j) = finalOut.Cells(i, j) + finalOut.Cells(i - 1, j) End If End If Next j Next i End Sub 

我正在运行Excel 2013和Windows 7专业版

我不确定这是否是您的问题的最终答案,但有一件事可能会影响到您的macros,使用活动对象,如ActiveWorkbook,ActiveSheet等。

我的build议是引用你必须使用的对象,这样如果你的excel文件没有被选中,或者你select了错误的工作表,代码仍然可以工作。 要做到这一点,请检查下面的例子:

 Dim workingSheet as Worksheet Dim auxWorksheet as Worksheet Set workingSheet = ThisWorkbook.Worksheets("The name of the worksheet here") Set auxWorksheet = ThisWorkbook.Worksheets(tempString) Set bla = workingSheet.Range("D16:D75") Set curve = workingSheet.Range("G2:WH11") Set price = workingSheet.Range("G162:WH164") Set finalOut = workingSheet.Range("G83:WH141") tempString = workingSheet.Name a = auxWorksheet.Cells(10, 8).Value 

请尝试一下,并给予一些反馈,如果它不工作,我可以继续试图帮助你。