与嵌套循环和设置范围混淆

时间:2014-02-12 17:23:42

标签: vba nested-loops

我正在努力创建嵌套循环,这是我第一次努力。

当匹配电子邮件列中的单元格值时,我需要将ID值分配给源列中的单元格。

,即从电子邮件列中,第一个单元格值为bobjohnson@email.com,其ID值为0我需要在Source列中找到bobjohnson@email.com的所有单元格,并将它们分配为0

我知道我这里有各种各样的东西,但经过几个小时的累人后我却求助了

谢谢

Sub Source()
Application.ScreenUpdating = False
Dim i As Integer
Dim lrow As Long
Dim Myfind As String
Dim Idvalue As String
Dim firstaddress As String
Dim c
lrow = Sheets("Sheet2").Range("C65336").End(xlUp).Row
With Worksheets(2)
    For i = 1 To lrow
        Myfind = Cells(i, 3).Text
        Idvalue = Cells(i, 2).Value
        Set c = Range("A:A").Find(Myfind, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstaddress = c.Address
            Do
                Range("MyFind").Select
                ActiveCell.FormulaR1C1 = Idvalue
                Set c = Range("A:A").FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstaddress
        End If
    Next i
End With

End Sub

原始文件

email                     ID   Source
bobjohnson@email.com      0    pollypots@email.com
bobjohnson@email.com      0    juanalvarez@email.com
frankcarpet@email.com     1    bettysue@email.com
juanalvarez@email.com     2    bobjohnson@email.com
juanalvarez@email.com     2    bettysue@email.com
sallybersong@email.com    3    Juanalvarez@email.com
sallybersong@email.com    3    yaraflowers@email.com
pollypots@email.com       4    yaraflowers@email.com
yaraflowers@email.com     5    juanalvarez@email.com
yaraflowers@email.com     5    pollypots@email.com
yaraflowers@email.com     5    bobjohnson@email.com
yaraflowers@email.com     5    bettysue@email.com
bettysue@email.com        6    yaraflowers@email.com

结果文件

email                     ID   Source
bobjohnson@email.com      0    4
bobjohnson@email.com      0    2
frakkcarpet@email.com     1    6
juanalvarez@email.com     2    0
juanalvarez@email.com     2    6
sallybersong@email.com    3    2
sallybersong@email.com    3    5
pollypots@email.com       4    5
yaraflowers@email.com     5    2
yaraflowers@email.com     5    4
yaraflowers@email.com     5    0
yaraflowers@email.com     5    6
bettysue@email.com        6    5

2 个答案:

答案 0 :(得分:1)

我假设两个块的第一列中的电子邮件的数量和顺序是相同的。当然,您需要对此进行修改,因为我将所有数据放在一个工作表中的A到F列中。

Sub Source()
Dim lLastRow As Long
Dim i As Long

lLastRow = Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lLastRow
    Range("F" & i).Value = Range("D:D").Find(Range("A" & i).Offset(0, 2).Value).Offset(0, 1).Value
Next i
End Sub

顺便说一下,这里

Range("MyFind").Select

您指的是名为MyFind的命名范围。我怀疑这是你的意图。

答案 1 :(得分:1)

如果我理解正确,你想在这里实现的是根据A列和B列之间的关系找到id,然后用C列中的id替换电子邮件。通过阅读你的代码,我怀疑你是使用错误的列查找电子邮件地址。我在代码的顶部修改了几行,这里的答案可以达到如上所示的结果。

Sub Source()
Application.ScreenUpdating = False
Dim i As Integer
Dim lrow As Integer
Dim Myfind As Variant
Dim Idvalue As Variant
Dim firstaddress As String
Dim c As Range
lrow = Worksheets("Sheet2").Range("C65336").End(xlUp).Row

With Worksheets("Sheet2")

For i = 2 To lrow
    Myfind = Cells(i, 1).Value
    Idvalue = Cells(i, 2).Value
    Set c = Range("C:c").Find(Myfind, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            c.Value = Idvalue
            Set c = Range("c:c").FindNext(c)
        Loop While Not c Is Nothing


    End If
Next i

End With


End Sub