VBA检查范围内的值

时间:2014-09-09 19:27:40

标签: excel vba excel-vba if-statement

我正在尝试遍历一个列,如果cell ="我正在寻找"然后做点什么。 到目前为止我有这个,我关闭的是在if语句中我检查"名称":

Option Explicit

Sub test()

Dim wksDest             As Worksheet
Dim wksSource           As Worksheet

Dim rngSource           As Range

Dim name                 As String

Dim LastRow             As Long
Dim LastCol             As Long
Dim c                   As Long

Application.ScreenUpdating = False

Set wksSource = Worksheets("Sheet1")

With wksSource
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For c = 16 To 20
LastRow = .Cells(.Rows.Count, c).End(xlUp).Row
Set rngSource = .Range(.Cells(5, 16), .Cells(LastRow, 16))
name = rngSource.Value

If name = "mark"
do something 
End If

Next c
End With

Application.ScreenUpdating = True

'MsgBox "Done!", vbExclamation

End Sub

5 个答案:

答案 0 :(得分:4)

好的克里斯 也许需要一些简化,但也有一些假设。 看起来LastCol似乎没有用于任何事情 - 所以让我们假设这是你想要循环的列。 你的循环有固定的起始值和结束值,但你正在确定LastRow - 所以让我们假设你想从第5行开始(在你的代码中)并循环到LastCol中的LastRow。 为了确定LastCol,你必须在你用来执行此操作的行中包含数据 - 所以让我们假设在你要循环的所有列中的第1行中都有值16(在你的代码中) 。 如果您想在这种情况下(IF)测试单个(字符串)值,那么您必须安排您的rngSource为单个单元格值。除非您需要再次使用它,否则您也不需要将其分配给变量。 最后,如果要检查其他值,可能需要考虑使用SELECT CASE结构代替IF THEN结构。 看看以下内容并改变我的假设以满足您的要求 - 祝您好运。

Sub test()

Dim wksDest             As Worksheet
Dim wksSource           As Worksheet

Dim rngSource           As Range

Dim name                 As String

Dim LastRow             As Long
Dim LastCol             As Long
Dim c                   As Long

Application.ScreenUpdating = False

Set wksSource = Worksheets("Sheet1")

    With wksSource
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        LastRow = .Cells(Rows.Count, LastCol).End(xlUp).Row

        FirstRow = 5
            For c = FirstRow To LastRow
                If .Range(.Cells(c, LastCol), .Cells(c, LastCol)).Value = "Mark" Then
                    MsgBox ("do something")
                End If
            Next c
    End With

End Sub

答案 1 :(得分:0)

我猜你真正想要做的是循环你的范围rngSource。所以试试

Set rngSource = .Range(.Cells(5, 16), .Cells(LastRow, 16))
for myCell in rngSource
  if myCell.Value = "mark" then
    do something
  end if
next myCell

答案 2 :(得分:0)

将值传递给find,以及需要检查值的列。如果找到的else返回0,它将返回行号。

Function checkForValue(FindString As String,ColumnToCheck as String) As Long
        SheetLastRow = Sheets("Sheet1").Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).row
         With Sheets("Sheet1").Range("$" & ColumnToCheck & "$1:$" & ColumnToCheck & "$" & CStr(SheetLastRow) ) 
                Set rng = .Find(What:=FindString, _
                                After:=.Cells(.Cells.Count), _
                                LookIn:=xlValues, _
                                lookat:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False)
                If Not rng Is Nothing Then
                    checkForValue = rng.row 'return row its found
                    'write code you want.                   
                Else
                    checkForValue = 0
                End If
            End With
End Function

答案 3 :(得分:0)

您只需一行即可完成操作。

If Not IsError(Application.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
'The value found in the given range
End If

示例: 在名为“国家/地区”的工作表的C列中搜索“加拿大”

If Not IsError(Application.Match("Canada", Sheets("Country").Range("C:C"), 0)) Then
   'The value found in the given range
End If

答案 4 :(得分:0)

我尝试了Hari的建议,但是Application.Match在范围名称上工作很奇怪(无法识别它们...)

更改为:WorksheetFunction.Match(... 它有效,但是当不存在值时,在评估IsError(...)之前会跳过运行时错误。 所以我不得不写一个简单的-no looping-解决方案:

dim Index as Long

Index = -1
On Error Resume Next
  Index = WorksheetFunction.Match(Target,Range("Edificios"), 0) 'look for Target value in range named: Edificios
On Error GoTo 0
If Index > 0 Then
    ' code for existing value found in Range @ Index row
End If

Excel Excel函数的第一个索引= 1(不基于零)

希望这会有所帮助。