我正在编写以下代码,从一个工作表(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
答案 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