在Excel中搜索循环到无穷大,为什么?

时间:2018-02-05 16:06:42

标签: excel vba excel-vba

我有一个包含两个数据列的表。我需要找到两条都很受欢迎的线。到目前为止,这是我的代码:

Dim ws As Worksheet
Set ws = Worksheets(1)
Set rgfound = ws.Range("A:A").Find(MyInputOne.value), LookAt:=xlWhole)
If rgfound Is Nothing Then 
    MsgBox "No results"
    Exit Sub
Else
    If rgfound.Offset(0, 3).Value <> MyInputTwo.Value Then
        Do
            Set rgfound = ws.Range("A:A").FindNext(rgfound)
        Loop Until rgfound.Offset(0, 3).Value = MyInputTwo.Value
    End If
End If
rgfound.Offset(0, 5).Value = "Found!"

这会进入无限循环并崩溃,我必须在运行后强行退出excel。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

我不会在这种情况下使用循环。

如果你知道如何在VBA中操作它,内置的AutoFilter是超级快的,它将避免任何需要无限循环的循环/问题

以下是代码:

Option Explicit

Sub FindBoth()
    Dim sht As Worksheet
    Dim data As Range, result As Range

    Set sht = ThisWorkbook.Worksheets("Sheet1")
    Set data = sht.Range("A1:D101")

    sht.AutoFilterMode = False 'clear existing filter

    With data
        .AutoFilter field:=1, Criteria1:=8
        .AutoFilter field:=4, Criteria1:="A"
        Set result = .Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows(1)
        If Not Intersect(result, data) Is Nothing Then
            result.Offset(0, 5).Resize(1, 1).Value = "Found!"
        End If
    End With

    sht.AutoFilterMode = False
End Sub

我的数据看起来像这样:

enter image description here

答案 1 :(得分:0)

最有可能它循环到无穷大,因为代码永远不会满足这个条件:

Debug.Print rgfound.Offset(0, 3).Value 
Debug.Print MyInputTwo.Value

要了解发生了什么,请写:

Public Sub TestMe()

    Dim cnt As Long
    Do
        cnt = cnt + 1
        Debug.Assert cnt < 2000
        Debug.Print cnt
    Loop Until False

End Sub

在上述条件之前。检查发生了什么的另一个选择是引入一些计数器,这会强制代码在2000.迭代后停止。像这样:

Debug.Assert

由于template<typename Device, typename Dtype> class MyOp: public OpKernel { { public: explicit MyOp(OpKernelConstruction *context) : OpKernel(context) { // ... } void Compute(OpKernelContext *context) override { Tensor* tmp_var = nullptr; Tensor* output = nullptr; TensorShape some_shape, some_shape2; // temparily use this space OP_REQUIRES_OK(ctx, ctx->allocate_temp(DT_FLOAT, some_shape, &tmp_var)); // allocate memory for output tensor OP_REQUIRES_OK(ctx, ctx->allocate_output(0, some_shape2, &output)); 条件失败而停止后,您将能够手动调试并获取正在发生的事情。

答案 2 :(得分:0)

这里绝对是最简单的答案,但是如果你知道你的参数,它就不应该“循环”。在一定时间内,您可以尝试添加FOR I / NEXT I声明。

扔掉那里的另一个想法。