Vba 比较两个不同工作表中的值
所以我有两个不同的工作表,其中有一列是服务订单。基本上,如果工作表1中的SO-ID列中的数字与工作表2中的SO列匹配,那么我想将与该特定服务订单编号相关的对应列“订单”和“类型”从工作表2复制到工作表1。任何帮助都将不胜感激。我在下面展示了一个示例,但数据点远不止此:Vba 比较两个不同工作表中的值,vba,excel,Vba,Excel,所以我有两个不同的工作表,其中有一列是服务订单。基本上,如果工作表1中的SO-ID列中的数字与工作表2中的SO列匹配,那么我想将与该特定服务订单编号相关的对应列“订单”和“类型”从工作表2复制到工作表1。任何帮助都将不胜感激。我在下面展示了一个示例,但数据点远不止此: Worksheet1 named "In Progress": Region SO-ID Site ID C01 5818476 DNYF8766D E01 5975844 D
Worksheet1 named "In Progress":
Region SO-ID Site ID
C01 5818476 DNYF8766D
E01 5975844 DCD00139
E01 5446828 DEG02219
.
.
.
.
.
Worksheet B named "0205":
No. SO# Order Type
1 5446828 KMC07570 Re-Install
2 5975844 KSS10269A Install
3 5818476 KSS10349D Re-Install
.
.
.
.
Results:
In Worksheet1 named "In Progress":
Region SO-ID Site ID Order Type
C01 5818476 DNYF8766D KSS10349D Re-Install
E01 5975844 DCD00139 KSS10269A Install
E01 5446828 DEG02219 KMC07570 Re-Install
.
.
.
.
.
这是我写的代码,但不起作用
Sub DCompare()
Dim LR As Long
LR = Range("A" & Rows.Count).End(xlUp).Row
Dim i As Long
For i = LR To 2 Step -1
If ThisWorkbook.Sheets("Sheet1").Range("B" & i) = ThisWorkbook.Sheets("Sheet2").Range("B" & i) Then
Worksheets("Sheet2").Cells(i, 8).Value = Worksheets("Sheet2").Cells(i, 3).Value
Worksheets("Sheet2").Cells(i, 9).Value = Worksheets("Sheet2").Cells(i, 4).Value
End If
Next i
End Sub
似乎在你接受匹配之前,你所做的每一个比较都必须逐行匹配。最好在目标中搜索匹配项并记录用于传输数据的行
Sub DCompare()
Dim LR As Long, i As Long, t As Long, ws2 As Worksheet
With ThisWorkbook
Set ws2 = .Sheets("Sheet2")
With .Sheets("Sheet1")
LR = .Range("A" & Rows.Count).End(xlUp).Row
For i = LR To 2 Step -1
If CBool(Application.CountIf(ws2.Columns("B"), .Cells(i, "B").Value2)) Then
t = Application.Match(.Cells(i, "B").Value2, ws2.Columns("B"), 0)
ws2.Cells(t, 8).Resize(1, 2) = .Cells(i, 3).Resize(1, 2).Value
End If
Next i
End With
End With
Set ws2 = Nothing
End Sub
这将查找匹配项,如果找到匹配项,它将捕获目标匹配行并传输两个单元格的信息。我很好奇,为什么你认为有必要从底层开始,然后向上工作,但我认为可能存在未披露的信息层次结构。如果披露了向后工作的原因,可能更容易避免传输数据。第二个示例。使用简单的。在工作表B上查找。包含一些变量,以便您在每张工作表上定位数据、命名工作表等。这可能会给您一些定制的灵活性
Option Explicit
Sub subFindSOID()
Dim wsSO As Worksheet, wsOrd As Worksheet
Dim SORng As Range, OrdRng As Range, fndSO As Range, c As Range
Dim SOStRow As Long, SOEndRow As Long, SOCol As Long, SOff As Long
Dim OrdStRow As Long, OrdEndRow As Long, OrdCol As Long
'Assign worksheets
Set wsSO = Worksheets("In Progress")
Set wsOrd = Worksheets("0205")
'Assign data start position on each sheet
SOStRow = 3
SOCol = 2
OrdStRow = 3
OrdCol = 2
SOff = 1
'Get search range
With wsOrd
OrdEndRow = .Cells(Rows.Count, OrdCol).End(xlUp).Row
Set OrdRng = .Range(.Cells(OrdStRow, OrdCol), .Cells(OrdEndRow, OrdCol).Offset(0, SOff + 2))
End With
With wsSO
'Get range to iterate
SOEndRow = .Cells(Rows.Count, SOCol).End(xlUp).Row
Set SORng = .Range(.Cells(SOStRow, SOCol), .Cells(SOEndRow, SOCol))
'Iterate the range
For Each c In SORng.Offset(0, 1)
Set fndSO = OrdRng.Find(What:=c, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not fndSO Is Nothing Then
'Copy the data columns
c.Offset(0, 2).Value = fndSO.Offset(0, SOff).Value
c.Offset(0, 3).Value = fndSO.Offset(0, SOff + 1).Value
End If
Next c
End With
End Sub
我从来没有真正使用过VLOOKUP公式,但我没有尝试它的原因是因为我想要一个宏来帮助我在将来将其应用于其他工作表。工作表B中是否会出现多个SO-ID?@Barrylajo抱歉,我没有完全理解这个问题,但如果您询问是否有多个包含服务的列订单然后回答是否。工作表B中的服务订单位于标题为“SO#”的列下。工作表A中的服务订单位于标题为“SO-ID”的列下。工作表B中的所有服务订单都在工作表A中,但顺序不同。但并非工作表A中的所有服务订单都在工作表B中。提前感谢您的帮助!不,我的意思是,如果我们在工作簿B中搜索SO-ID 5818476,5818476是否会在工作表B SO#列中出现多次?VLOOKUP会比这里的宏好多了……太多了……非常感谢。我将对此进行测试并报告。也没有理由从底部开始。说到宏,我并不是那么聪明,所以我想我是从一些在线博客上得到这句话的。但是,如果你有其他的想法,它会更容易或更快,请随意建议。再次感谢你的帮助。