簡體   English   中英

從VBA界面運行宏時,Excel崩潰,但使用按鈕時可以工作

[英]Excel crashes when macro is run from VBA interface, but works when using a button

我有一個采用不同范圍的宏,使用其中的值執行計算,然后將值復制到單元格中以供工作表中的公式使用。 我希望在修改某些范圍內的值時運行此宏。 我在不同的工作表中使用了相同的代碼,最初在其中放置了ActiveX按鈕。 問題是,當我將宏放入worksheet_calculate或Worksheet_SelectionChange時,Excel一起崩潰。 起初我以為我會引起無限次迭代,但是在使用EventEnable = FALSE和EnableCalculations = FALSE來避免該行為后,Excel仍然崩潰了。 我擦除了SelectionChange和Calculate中的宏,並進一步檢查了該問題,發現從VBA接口運行宏時,Excel也崩潰了,但它與工作表中引用該宏的ActiveX按鈕一起使用。 我似乎似乎找不到代碼的問題,以及為什么在通過按鈕訪問時代碼可以完美運行,而從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 Professional

我不確定這是否是您問題的最終答案,但可能會影響到您的宏,使用ActiveObject(例如ActiveWorkbook,ActiveSheet等)的一件事。

我的建議是引用必須使用的對象,這樣,如果未選擇excel文件或選擇了錯誤的工作表,該代碼仍然有效。 為此,請檢查以下示例:

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

請嘗試一下並提供一些反饋,以便如果它無法正常工作,我將繼續努力為您提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM