在列和选择中查找特定值

时间:2013-09-27 08:47:47

标签: excel-vba vba excel

我只想检查我的代码是否有问题。我的代码试图在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

2 个答案:

答案 0 :(得分:2)

请查看this answer。它解释了如何选择单元格及其偏移量。

将您从上述答案中学到的内容应用于评论为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变量中的所有单元格。在上面的示例中,范围设置为A1A100,因此循环内的cell变量将是第一次迭代的A1A2第二,依此类推,直到A100

StrComp()函数会将每个单元格的值与示例中searchTerm的{​​{1}}进行比较。

1234是我希望你从我提供上面链接的答案中应用逻辑的地方。


您的原始但经过修改的代码

match found do something

摆脱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 End If otherrow = otherrow + 1 Loop Until IsEmpty(vCell) End Sub ,则Exit Do会退出您的循环。因此,如果第一个单元格不等于1234,则退出循环,并且它不会移动到第二行。

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

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

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

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

迭代整个专栏的重点是什么,因为只选择最后一个1234 并选择相应的B?这对我来说毫无意义。试着更好地解释你想要实现的目标。

解决方案

根据最新评论,我编辑了符合条件的代码

B

您需要使用Range对象的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))来选择相应的单元格(右侧一个)

答案 1 :(得分: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