匹配两个不同的表和偏移量

时间:2014-05-02 22:06:42

标签: vba excel-vba for-loop match excel

我正在编写以下代码,从一个工作表(Sheet2)中找到匹配项并将值粘贴到(sheet2)中。

到目前为止,代码将那些已“接受”的名称作为偏移值。它循环寻找匹配并显示它。但是,如果可能的话,我还想选择偏移值并将它们粘贴到sheet1中。这是我感到困惑的地方请帮忙,从哪里拿我的代码?

Sheet1

列a,b

5 Jim Accepted

6 Bob Rejected

7 Tim Accepted

第2页

专栏

  Jim      40              0.4
  Bob      78              58
  Tim      36              45  


Sub check()
Dim i As Long, lastrow As Long, myval As Long
Dim agentname As String
Dim sh2 As Worksheet
Dim val As String
Dim findstr As String
Dim rng As Range

Set sh2 = Sheets(2)

lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastrow
agentname = Cells(i, 1).Offset(, 1).Value
If Cells(i, 1) = "Accepted" And Not IsEmpty(Cells(i, 1)) Then
    'For i = 1 To sh2.Range("b2:b9")

myval = Application.WorksheetFunction.Match(agentname, sh2.Range("b1:b9"), 0)
findstr = agentname

MsgBox agentname

End If
Next i

End Sub

2 个答案:

答案 0 :(得分:2)

几个问题 -

agentname = Cells(i, 1).Offset(, 1).Value

这似乎是在错误的列中查找。它正在回归"接受"或"被拒绝"而不是名字。因此删除偏移量 - 您可以直接指定所需的列,无需偏移。把事情简单化。 (你甚至不需要.Value,它是假设的)

agentname = Cells(i,1)

现在这令人困惑 -

If Cells(i, 1) = "Accepted" And Not IsEmpty(Cells(i, 1)) Then

再次提到错误的列,我们在这里需要第2列。除此之外,如果它 被接受了,那它怎么也可能是真的呢?所以我们想:

If Cells(i, 2) = "Accepted" then

好的,接下来 -

myval = Application.WorksheetFunction.Match(agentname, sh2.Range("b1:b9"), 0)

什么是myval?这不是一个描述性的名称,当您回到代码时可​​能会让您感到困惑。您正在尝试匹配您保存的代理商名称,并指定范围和工作表已启用,这很棒。这些名字真的在B栏吗?如果不知道确切的布局我会假设他们在第2页A栏上,这对我来说更容易。现在,当它找到一个名字时它正在工作,但是Worksheetfunction的一个奇怪的功能意味着如果它找不到任何东西它就会中断。所以我们将它包装在一些错误处理中。

On Error Resume Next
myval = Application.WorksheetFunction.Match(agentname, sh2.Range("A1:A9"), 0)
If Err = 0 Then
findstr = agentname
MsgBox agentname
End If
On Error GoTo 0

我的时间有点短,所以还有一些评论 -

1。)您为工作表2命名,这太棒了。你也应该为workheet1做这件事。实际上,进一步指定工作簿。它会省去很多头痛。

2。)你需要正确地缩进,也许它只是在你发布这里时搞砸了但是那些For循环和If语句需要缩进或者下次你试图找出什么时你会头疼你在做什么

3。)使用描述性名称,特别是如果您正在编写一个更长的脚本来完成很多这样的事情。

4。)这是一个意见,但我认为您应该等到申请变量,直到您要使用它们为止。再次增加了可读性。 (并查看驼峰案例来命名你的变量,它的化妆品,但......无论如何我觉得它看起来更好)

我正在使用的设置 - Sheet1:

A     B
Tim   Accepted
Tom   Rejected

Sheet 2中:

A    B    C
Tim  40   30.1
Tom  21   15.5
Jeff 18   31.3

代码:

Sub check()

Dim sh1 As Worksheet: Dim sh2 As Worksheet
Set sh1 = Sheets(1)
Set sh2 = Sheets(2)

Dim val As String
Dim findstr As String

Dim lastrow As Long
lastrow = sh1.Cells(Rows.Count, "A").End(xlUp).Row

Dim i As Long
For i = 1 To lastrow

    Dim agentname As String
    agentname = sh1.Cells(i, 1)

    If sh1.Cells(i, 2) = "Accepted" Then
        On Error Resume Next

        Dim myval As String
        myval = Application.WorksheetFunction.Match(agentname, sh2.Range("A1:A9"), 0)

        If Err = 0 Then
            findstr = agentname
            MsgBox agentname
        End If

        On Error GoTo 0

    End If
Next i

End Sub

答案 1 :(得分:1)

而不是匹配我已经使用了vlookup函数,这返回了sheet2中与sheet1上的名称匹配的值。这提供了我试图实现的基础知识。 Acantud提供的代码奠定了基础

  Sub check()

Dim sh1 As Worksheet: Dim sh2 As Worksheet
Set sh1 = Sheets(1)
Set sh2 = Sheets(2)

Dim val As String
Dim findstr As String

Dim lastrow As Long
lastrow = sh1.Cells(Rows.Count, "A").End(xlUp).Row


Dim i As Long
For i = 1 To lastrow

    Dim agentname As String
    agentname = sh1.Cells(i, 1)

    If sh1.Cells(i, 2) = "Accepted" Then
        On Error Resume Next

        Dim myval As String
        Dim myval1 As String

        myval = Application.WorksheetFunction.VLookup(agentname, sh2.Range("A1:E13"), 3, False)
        myval1 = Application.WorksheetFunction.VLookup(agentname, sh2.Range("A1:E13"), 5, False)
        'Application.WorksheetFunction.Match(agentname, sh2.Range("A1:A9"), 0)

        sh1.Cells(i, 3) = myval
       ' sh1.Cells(i, 4) = myval1

        If Err = 0 Then
            findstr = myval
        End If

        On Error GoTo 0

    End If
Next i

End Sub