在范围+循环

时间:2017-05-24 12:01:03

标签: excel vba

我需要我的宏来查看我的范围内的单元格,在不同的WS中找到该值并将值粘贴到我正在寻找的值旁边(我的原始WS)。一次又一次地对范围内的值执行此操作。

现在一切正常但是由于某种原因,该值会停留在第一次搜索上,并且不会在原始范围内查找其他值。 这是我的代码,图片应该有所帮助。

Sub Macro1()

” '现在我要将“UDD”与“S / O”相匹配

Worksheets("Sheet1").Activate
Range("c17").Select

   Dim Searchkey As Range, cell As Range
   Set Searchkey = Range("c17:c160")

For Each cell In Searchkey
Sheets("data").Activate
Cells.Find(What:=Searchkey, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
ActiveCell.Offset(0, -1).Range("A1").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet1").Activate
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, -1).Range("A1").Select
Selection.Copy
Next cell

End Sub

为什么我的宏停留在“84225”而没有循环到另一个S / O?

谢谢enter image description here

2 个答案:

答案 0 :(得分:1)

Sub mac1()


Worksheets("Sheet1").Activate
Range("c17").Select


Dim srch As Range, cell As Variant
Set srch = Range("c17:c160")

For Each cell In srch
Sheets("data").Activate

    Cells.Find(What:=cell, LookIn:=xlValues, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate

ActiveCell.Offset(0, -1).Range("A1").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet1").Activate
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, -1).Range("A1").Select
Selection.Copy
Next cell

End Sub

这是有效的! 谢谢大家

答案 1 :(得分:0)

在每个循环中,您都在搜索SearchKey的整个范围,而不仅仅是Cell,因此我猜测它始终使用SearchKey中的第一个单元格作为你的搜索条件。

您还在搜索公式而不是值,并查找可能返回错误结果的零件匹配(20上的零件匹配将返回20,201,11120001中的查找等)。

不对您的工作表名称进行限定,使用Activate可能也没有多大帮助。

试试这段代码:

Public Sub Test()

    Dim SrcSht As Worksheet, TgtSht As Worksheet
    Dim SearchKey As Range, Cell As Range
    Dim FoundValue As Range

    With ThisWorkbook
        Set SrcSht = .Worksheets("Sheet1")
        Set TgtSht = .Worksheets("Data")
    End With

    Set SearchKey = SrcSht.Range("C17:C21")
    For Each Cell In SearchKey
        'Search column 3 (C) for your the value
        Set FoundValue = TgtSht.Columns(3).Find(What:=Cell, _
                                                After:=TgtSht.Columns(3).Cells(1, 1), _
                                                LookIn:=xlValues, _
                                                LookAt:=xlWhole, _
                                                SearchOrder:=xlByRows, _
                                                SearchDirection:=xlNext)

        'Only proceed if value found, otherwise an error will occur.
        If Not FoundValue Is Nothing Then
            Cell.Offset(, 1) = FoundValue.Offset(, 1)
        End If
    Next Cell

End Sub

修改
要测试代码,请将光标放在过程中,然后按F8依次处理每一行。 FoundValue每次执行时都应包含一个值。

要检查此项,请将光标悬停在变量上以查看其值:

enter image description here

以黄色突出显示的行是将要执行的下一行。如果FoundValue什么都不是,那么以下行就不会被处理,如果它不是什么都行,那么就行了。