1

我只想检查我的代码是否有问题。我的代码正在尝试在 A 列中查找此值 1234,一旦找到它,如果满足条件,它将选择除此之外的值。如果没有 1234,那么它什么也不做。不幸的是,即使 1234 在 A 列中,它也无济于事。当我删除 Else 语句时,它能够正常运行。我可以知道它有什么问题吗?

Sub testr1()

Dim vCell As Range
Dim otherrow As Long

otherrow = 1

    Do

        Set vCell = Sheets(Sheet1").Cells(otherrow, 1)

        If vCell = 1234 Then
            If Range("B5") = "B" Then
                Cells(otherrow, 2).Select
            End If
        Else
        'Do nothing if 1234 is N.A.
        Exit Do
        End If
        otherrow = otherrow + 1
   Loop

End Sub
4

2 回答 2

2

请看一下这个答案。它解释了如何选择单元格及其偏移量。

将您从上述答案中学到的知识应用到注释中的 for each 循环中match found do something。您可以删除该注释,或者只是在其下方添加您的代码IfEnd If这表明存在匹配项。

Sub testr1()

    Dim myRange As Range
    
    ' change this to any range you like to check
    Set myRange = Range("A1:A100")
    
    
    Dim searchTerm As String
    ' specify your search term
    searchTerm = "1234"
    
    Dim cell As Range
    ' cell will be each cell in your range
    For Each cell In myRange
        ' checks whether the cell matches the searchTerm
        If StrComp(cell, searchTerm, vbTextCompare) = 0 Then
            ' match found do something
            
        End If
    Next
End Sub

此代码遍历myRange变量中的所有单元格。在上面的示例中,范围设置为A1to,A100因此cell循环内的变量将是A1第一次迭代的变量,A2第二次迭代的变量,依此类推,直到A100

StrComp()函数将每个单元格的值与示例中searchTerm的值进行比较。1234

match found do something是我希望您将应用我提供的链接到上面的答案中的逻辑的地方。


您的原始但修改后的代码

Sub testr1()

Dim vCell As Range
Dim otherrow As Long

otherrow = 1

    Do

        Set vCell = Sheets("Sheet1").Cells(otherrow, 1)

        If vCell = 1234 Then
            If Range("B5") = "B" Then
                Cells(otherrow, 2).Select
            End If
        End If
        otherrow = otherrow + 1
   Loop Until IsEmpty(vCell)

End Sub

摆脱 else 语句。如果未找到,Exit Do则退出您的循环。1234因此,如果第一个单元格不等于1234您退出循环,并且它不会移动到第二行。

此外,您需要添加一个布尔语句来执行循环以防止无限循环。我添加Loop Until isEmpty(vCell)了让循环知道一旦有一个空单元格终止循环。还有其他更好的方法,但是如果您不想过多地修改原始代码,那么这应该足以避免无限循环。

你的代码实际上在做什么?

我一直在问自己你想用你的代码实现什么,我似乎无法给出一个很好的理由。您修改后的代码(上述代码)将遍历 A 列中的所有单元格,直到找到一个空单元格。它将寻找与您的匹配1234项(它应该真正用作字符串而不是独立数字 - 考虑将其用双引号括起来)。一旦找到匹配项,它将检查B相应行上的列是否具有值B。如果是,那么它将选择该单元格。

逻辑失败的地方......

因为只有最后一个 1234和它的对应B将被选中,所以遍历整个列有什么意义?这对我来说毫无意义。尝试更好地解释您要实现的目标。

解决方案

根据最新评论,我编辑了代码以满足标准

Sub testr1()

Dim vCell As Range
Dim otherrow As Long

otherrow = 1

    Do

        Set vCell = Sheets("Sheet1").Cells(otherrow, 1)

        If StrComp(vCell, "1234", vbTextCompare) = 0 Then
            If StrComp(vCell.Offset(0, 1), "B", vbTextCompare) = 0 Then
                vCell.Offset(0, 1).Select
                ' if all criterias are met then the cell will be highlighted in red
                vCell.Offset(0,1).Interior.Color = RGB(255, 0, 0)
            End If
        End If
        otherrow = otherrow + 1
   Loop Until IsEmpty(vCell)

End Sub

您需要使用.Offset(0,1)Range 对象 ( vCell) 的属性来选择相应的单元格(右侧一个)

于 2013-09-27T09:19:44.287 回答
0

特别感谢 @mehow 给了我一个让我的代码工作的想法

Sub testr1()
Dim vCell As Range
Dim otherrow As Long

otherrow = 1

    Do While otherrow <= Rows.Count

        Set vCell = Sheets("Sheet1").Cells(otherrow, 1)

         If vCell = 1234 Then
            If Range("B5") = "B" Then
                Cells(otherrow, 2).Select
            End If
        Exit Do
        End If
        otherrow = otherrow + 1

        Loop

End Sub
于 2013-09-27T10:20:12.173 回答