为什么循环不执行?

时间:2013-07-31 21:00:57

标签: vba excel-vba excel

这个非循环代码执行没有问题:

If InStr(1, Sheets(1).Range("A1"), "blah") > 0 Then
    Sheets(2).Range("A1") = Sheets(1).Range("B1")
End If

但我需要迭代几行;因此,一个循环:

Dim i As Integer
For i = 1 To 10
    If InStr(1, Sheets(1).Cells(i, 1), "blah") > 0 Then
        Sheets(2).Cells(i, 1) = Sheets(1).Cells(i, 2)
    Else Sheets(2).Cells(i, 1) = ""
    End If
Next

循环编译并且不会崩溃,但无法返回任何输出。为什么呢?

3 个答案:

答案 0 :(得分:2)

在instr公式中添加1和0

Instr(1, Sheets(1).Cells(i,1), "blah") > 0

另外,您确定Sheets(2)的值是要更改的值吗?

答案 1 :(得分:2)

这应该有效。还注意到您正在引用单元格而不是单元格中保存的值

***注意这是调试的垃圾方式但是...... msgbox提示符是什么意思?应该说0或1,第二个msgbox应该告诉你将在第二张表中放入什么。再来一次这是一个完全废话的方式来调试

Sub Test()
Dim iVal As Integer
    For i = 1 To 10
        iVal = InStr(1, Sheets(1).Cells(i, 2), "blah")
        MsgBox CStr(iVal)
        If iVal > 0 Then
        'go to second sheet column 1 and enter in the value thats in the 2nd column on sheet 1
        MsgBox "Adding to Sheet 2: " & Sheets(1).Cells(i, 2).Value
            Sheets(2).Cells(i, 1).Value = Sheets(1).Cells(i, 2).Value
        End If
    Next
End Sub

答案 2 :(得分:1)

如果你教男人钓鱼......这不是答案,但你如何能够自己解决问题:

将光标放在下面一行,然后按F9。

,在代码中添加一个断点

Sheets(2).Cells(i, 1) = Sheets(1).Cells(i, 2)

如果你做得对,那么你会在VBE中看到它:

enter image description here

按F5键运行代码。

当它/如果击中线时,VBE将突出显示该线为黄色。这基本上会暂停代码执行,因此您可以检查&追踪正在发生的事情。以下是您可以输入Debug.Print语句(或MsgBox根据我的示例和上面的SOrceri示例)或者您可以使用 Immediates 窗口或本地窗口检查变量&他们的价值观(这是更先进的)。

如果“没有”发生(即,线条从未突出显示为黄色),我只能想到两件事。

  1. Sheets(1).Cells(i,2)为空,或
  2. 永远不会满足布尔表达式中的条件。
  3. 断点将允许您调试并找出哪些(或者我没有想到的潜在其他条件)可能导致明显的“错误”。

    更新不幸的是,我认为问题确实是你的逻辑。我将尝试提供一个尽可能明确的示例。

    Sub Test()
    Dim i As Integer
    Dim sht1Cell As Range
    Dim sht2Cell As Range
    For i = 1 To 10
        Set sht1Cell = Sheets(1).Cells(i, 1)
        Set sht2Cell = Sheets(2).Cells(i, 1)
    
        'Now, test whether "blah" is found in sht1Cell:
        If InStr(1, sht1Cell.Value, "blah") > 0 Then
            'If it contains "blah", then put this value in sheet 2.
            'Note: you were previously putting values from Column B.
            '      but this is taking the exact cell value from 
            '      column A, so I KNOW this value cannot be a blank value.
            sht2Cell.Value = sht1Cell.Value
        Else:
            'Does not contain "blah", so make sheet 2 have a blank
            'This blanks out any value that might have previously been
            'present in sh2Cell.
            sht2Cell.Value = ""
        End If
    Next
    End Sub
    

    如果这没有达到预期的效果,我100%肯定你的逻辑中存在问题,而这个问题并没有充分描述你希望实现的条件和结果。除非你能更全面地描述你想要做的事情,否则它有所不同,是否有人猜测。