我有一个包含两个数据列的表。我需要找到两条都很受欢迎的线。到目前为止,这是我的代码:
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。
任何建议都将受到赞赏。
答案 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
我的数据看起来像这样:
答案 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
声明。
扔掉那里的另一个想法。