Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 比较两个不同工作表中的值_Vba_Excel - Fatal编程技术网

Vba 比较两个不同工作表中的值

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

所以我有两个不同的工作表,其中有一列是服务订单。基本上,如果工作表1中的SO-ID列中的数字与工作表2中的SO列匹配,那么我想将与该特定服务订单编号相关的对应列“订单”和“类型”从工作表2复制到工作表1。任何帮助都将不胜感激。我在下面展示了一个示例,但数据点远不止此:

   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会比这里的宏好多了……太多了……非常感谢。我将对此进行测试并报告。也没有理由从底部开始。说到宏,我并不是那么聪明,所以我想我是从一些在线博客上得到这句话的。但是,如果你有其他的想法,它会更容易或更快,请随意建议。再次感谢你的帮助。