Vba 使用循环将值从一个工作表替换为另一个工作表

Vba 使用循环将值从一个工作表替换为另一个工作表,vba,excel,Vba,Excel,我需要一种方法将主工作表(main)中的值替换为辅助工作表(update)中的值 我的主要工作表有以下列名:EmpName、EmpID、Emp主管、Emp主管 和我的第二个工作表:EmpName、EmpID、newsup、NewDir、Status 如果第二张工作表中的条目状态列为“不匹配”,它将自动传递带有相应EmpID的“新sup”和/或“新dir”数据,并覆盖主工作表中的“empsupervisor”和/或“empdirector” 类似这样的东西,我就是不能用vba能够理解的正确语法来表

我需要一种方法将主工作表(main)中的值替换为辅助工作表(update)中的值

我的主要工作表有以下列名:EmpName、EmpID、Emp主管、Emp主管

和我的第二个工作表:EmpName、EmpID、newsup、NewDir、Status

如果第二张工作表中的条目状态列为“不匹配”,它将自动传递带有相应EmpID的“新sup”和/或“新dir”数据,并覆盖主工作表中的“empsupervisor”和/或“empdirector”

类似这样的东西,我就是不能用vba能够理解的正确语法来表达

 for each STATUS = Mismatch in worksheet2

 update worksheet1.column("Empsupervisor") with worksheet2.column("New Sup").value

 where worksheet1.column("EmpID") = worksheet2.column("EmpID")

 next

此方法在所有行中循环,检查不匹配,查找员工ID行,然后将新主管和新主管移至第一页:

Sub TestIt()

Dim LastRow As Long, CurRow As Long, DestRow As Long, DestLast As Long
Dim ws1 As Worksheet, ws2 As Worksheet

Set ws1 = Sheets("Name of main worksheet")
Set ws2 = Sheets("Name of secondary worksheet")

LastRow = ws2.Range("B" & Rows.Count).End(xlUp).Row
DestLast = ws1.Range("B" & Rows.Count).End(xlUp).Row

For CurRow = 2 To LastRow 'Assumes first row has headers
    If ws2.Range("E" & CurRow) = "mismatch" Then 'Assumes mismatch is in column E
        If Not ws1.Range("B2:B" & DestLast).Find(ws2.Range("B" & CurRow).Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
            DestRow = ws1.Range("B2:B" & DestLast).Find(ws2.Range("B" & CurRow).Value, LookIn:=xlValues, LookAt:=xlWhole).Row
        End If
        ws1.Range("C" & DestRow).Value = ws2.Range("C" & CurRow).Value 'assumes supervisor is in column C in both sheets
        ws1.Range("D" & DestRow).Value = ws2.Range("D" & CurRow).Value 'assumes director is in column D in both sheets
    End If
Next CurRow

End Sub
最后一行的说明:

Range(“B”和Rows.Count)
转到工作表上的最后一行,即Excel“07”、“10”和“13”中的第1048576行。想象一下
范围(“B1048576”)
。然后它执行
End(xlUp)
,根据MSDN,“相当于按End+UP箭头”。这将转到B列中B1048576上方非空白的第一个单元格。最后一个命令
.Row
返回单元格的行号

DestRow
说明:

我们正在使用
Range.Find()
方法来确定employeeID是否存在于第一个工作表中以及它存在于哪一行
Range.Find()
返回一个范围,这就是为什么我使用
Range.Find().Row
的原因,因为当找到时,我们想知道要查找的行。但是,如果
Find()
没有找到任何内容,它将返回
Nothing
Nothing。行
将出错。因此,我快速执行
If Not Find()Nothing
以确保找到值


嗨,克里斯,你能解释一下lastrow和destlast做什么吗?我觉得它的工作原理有点混乱。谢谢你的快速更新,嗯,还有一个问题,如果没有声明,嗯,你能把它也分解一下吗?谢谢,我花了一个小时试着把它进一步分解,如果没有的话。那么你能进一步解释它的作用吗?我可以看到它在两张纸上比较B列,但为什么它在最后计数?(.排)?