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

时间:2015-01-23 14:02:43

标签: excel vba excel-vba

我需要一种方法来替换主要工作表(主要)中的值和我的辅助工作表(更新)中的值。

我的主要工作表有以下列名:EmpName,EmpID,EmpSupervisor,Emp Director。

和我的辅助工作表:EmpName,EmpID,New Sup,NewDir,Status。

如果第二个工作表中的条目将STATUS列为"不匹配",它将自动传递"新的"和/或"新目录"数据与相应的EmpID和覆盖" 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

1 个答案:

答案 0 :(得分:-1)

此方法遍历所有行,检查不匹配,找到员工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

LastRow的解释:

  

Range("B" & Rows.Count)转到表格的最后一行,即Excel' 07,' 10和' 13中的行1,048,576。想象一下Range("B1048576")。然后它执行End(xlUp) "相当于根据MSDN按END +向上箭头" 。这将转到B列中的第一个单元格,它在B1048576之上是非空白的。最后一个命令.Row返回该单元格的行号。

DestRow的解释:

  

我们使用Range.Find()方法来识别employeeID是否存在于第一个工作表中以及它存在于哪一行。 Range.Find()返回一个范围,这就是我使用Range.Find().Row的原因,因为一旦找到,我们就想知道我们要去的那一行。但是,如果Find()找不到任何内容,则会返回Nothing,而Nothing.Row会出错。因此,我会快速If Not Find() Nothing以确保找到该值。