Excel说“不”;结束Sub";,只需移动光标即可崩溃

Excel说“不”;结束Sub";,只需移动光标即可崩溃,excel,crash,vba,Excel,Crash,Vba,我正在编写一个VBA代码,以遍历指定的一个或多个范围,查找用户在运行时提供的关键字,并从包含关键字的单元格中获取单元格偏移量中的值,该值也是用户提供的值。例如,如果您想在A1:B10中查找单词“Apple”,然后获取每个“Apple”实例右侧单元格中的值,它可以做到这一点。两件奇怪的事情一直发生在我身上。首先,也不是很奇怪,当我运行它并单击userform上的cancel按钮时,它只包含一行“Unload Me”,它抛出一个错误,表示它期望并结束子语句,但它有一个。我不知道它为什么这么做。奇怪的

我正在编写一个VBA代码,以遍历指定的一个或多个范围,查找用户在运行时提供的关键字,并从包含关键字的单元格中获取单元格偏移量中的值,该值也是用户提供的值。例如,如果您想在A1:B10中查找单词“Apple”,然后获取每个“Apple”实例右侧单元格中的值,它可以做到这一点。两件奇怪的事情一直发生在我身上。首先,也不是很奇怪,当我运行它并单击userform上的cancel按钮时,它只包含一行“Unload Me”,它抛出一个错误,表示它期望并结束子语句,但它有一个。我不知道它为什么这么做。奇怪的事情2。每当我单击并将光标移动到“取消单击”子菜单之后的文件末尾时,我的excel就会崩溃并关闭。每一个单身。时间奇怪的是,它只是从我点击的时候就这么做了。当我在Cancel_click()子菜单上单击或在该子菜单上单击enter时,有时也会发生这种情况。只是简单的点击。我不明白。有什么想法吗?userform中包含的代码如下所示。仅供参考,用户可以输入类似“A1:A10,E1:E10”的范围,用逗号分隔多个范围。我不认为这对这个问题很重要,但我想我应该补充一下,因为我不知道如何在这里添加userform,如果你可以的话

Private Sub Accept_Click()
'Searches for string input into the KeywordBox
'Grabs contents of the cell defined by the OffsetBox
'The range it searches through is defined by the RangeBox

Dim rawRange As String: rawRange = Me.RangeBox.Text
Dim rawOffset As String: rawOffset = Me.OffsetBox.Text
Dim Keyword As String: Keyword = Me.KeywordBox.Text
Dim numOfRanges As Integer: numOfRanges = 1
Dim Ranges() As Range
Dim commaLoc As Integer: commaLoc = -1
Dim tempRange As String: tempRange = rawRange
Dim offset As Integer
Dim values() As Double
Dim valCount As Integer: valCount = 0

'--------------------------------------------------------
'Set ranges

For i = 1 To Len(rawRange)
    If (Mid(rawRange, i, 1) = ",") Then
        numOfRanges = numOfRanges + 1
    End If
Next

ReDim Ranges(numOfRanges) As Range

If (Not numOfRanges = 1) Then
    For i = 1 To numOfRanges - 1
        commaLoc = InStr(1, tempRange, ",")
        Set Ranges(i) = Range(Left(tempRange, commaLoc - 1))
        tempRange = Right(tempRange, Len(tempRange) - commaLoc)
    Next
End If

Set Ranges(numOfRanges) = Range(tempRange)
'---------------------------------------------------------
'Set offset

If (IsNumeric(rawOffset)) Then
    offset = CInt(rawOffset)
Else:
    MsgBox ("Offset was not input as a number")
    Exit Sub
End If
'----------------------------------------------------------
'Searches for keyword

For i = 1 To numOfRanges
    For Each cell In Ranges(i)
        If (cell.Value = Keyword) Then
            valCount = valCount + 1
        End If
    Next
Next

ReDim values(valCount) As Double
valCount = 0

For i = 1 To numOfRanges
    For Each cell In Ranges(i)
        If (cell.Value = Keyword) Then
            valCount = valCount + 1
            values(valCount) = cell.offset(0, offset).Value
        End If
    Next
Next

For i = 1 To valCount
    Range("I" & i).Value = values(i)
Next

Unload Me

End Sub

我也有过类似的,奇怪的事情发生在我身上。可以尝试的一个好方法是强制重置VBA项目,然后保存、退出并重新启动Excel

要强制项目重置,请将枚举添加到某个代码模块的常规部分。枚举是什么并不重要…让它简单一些,比如

Enum stoplight
    Red
    Yellow
    Green
End Enum

当您这样做时,您将收到一条消息,说明它将重置您的项目。那很好;让那发生吧。然后保存Excel工作簿,完全退出Excel,重新启动它,重新加载工作簿,进入VBA编辑器,删除添加的枚举。然后重新编译,看看事情是否对您更有利。

您在设置的偏移量中放置了一个“Exit Sub”,这可能会导致您的问题。

我可以通过制作新工作簿并复制所有内容来解决此问题。它工作得很好。我认为原作不知怎么被破坏了。对于那些有同样问题的人,我认为Rich Holton的答案值得一试,以防你有更多的东西要复制。感谢大家为您提供的时间和投入

您有
Else:
但是您应该有
Else
-潜在的混乱…我在一个基本的sub中测试了它,它仍然可以正常工作。这似乎没有什么区别。不过,这是没有必要的。我被巨蟒洗脑了。谢谢。只有当用户表单中的输入不是一个数字时,“Exit Sub”才会被调用,我确保它不会被多次调用。如果被调用,MsgBox也会出现,但它没有出现。所以不应该是这样。不过检查一下肯定不错,谢谢。我也能以类似的方式修复它。我做了一个新的工作簿,只是复制了那里的所有东西,代码和所有的东西,它工作了。我想你的建议可能奏效了。我确实尝试过退出并重新打开excel,但这在以前不起作用。但从未添加过这样的枚举。谢谢你!我最近学会了枚举技巧。在此之前,我做了你做的事情:将所有内容复制到新工作簿中。