将数据从一个工作簿传输到另一个具有特定条件的工作簿

时间:2015-09-03 06:56:48

标签: excel vba excel-vba

我有两个工作簿。一个名为Target工作簿,另一个名为源工作簿。

目标工作簿具有所有项目ID,并且某些项目ID将出现多次。在源工作簿中它是空的,因为还没有输入数据。

我需要一个代码,它允许我遍历目标工作簿中项目ID的所有行,我希望将这些行传输到源工作簿。

例如,我会投影ID" 10000327"在目标工作簿中不止一次出现,我需要传输所有包含" 10000327"关于项目ID。

现在,我只能找到匹配的项目ID一次,并且不允许我查看所有行,直到找到空行并且代码将停止搜索。因此,它不允许我捕获多个包含" 10000327"的项目ID。在目标工作簿中。这只能在工作簿具有项目ID时运行,但我想要一个代码,它只关注目标工作簿项目ID并将其传输到源工作簿,而不是在目标和源工作簿之间进行匹配。

这是我到目前为止的代码:

Sub AAB()
    Dim sWS As Worksheet, tWS As Worksheet
    Dim pidCol As Long, pidRow As Long, pidStr As String, rw As Long

    Set tWS = Workbooks("Target.xlsm").Sheets("Sheet1")
    Set sWS = Workbooks("Source.xlsm").Sheets("Sheet2")

    With tWS
        With .Cells(2, 1).CurrentRegion
            pidCol = 1
            pidStr = "10000327"  '.Cells(rw, pidCol).Value
            If CBool(Application.CountIf(.Columns(1), pidStr)) Then
                rw = Application.Match(pidStr, .Columns(1), 0)
                With .Cells(rw, 2).Resize(1, .Columns.Count - 1)
                    If CBool(Application.CountIf(sWS.Columns(1), pidStr)) Then
                        pidRow = Application.Match(pidStr, sWS.Columns(1), 0)
                        .Copy Destination:=tWS.Cells(pidRow, 2)
                    End If
                End With
            End If
        End With
    End With

    Set sWS = Nothing
    Set tWS = Nothing
End Sub

我希望有人可以帮助我,因为我已经坚持了将近两周。 谢谢。

1 个答案:

答案 0 :(得分:0)

你的方式有点过于复杂。也许我误解了一些东西,但如果你想找到一个项目ID并将该行复制到不同的工作簿,你可以遍历这些行并复制具有正确项目ID的行:

For LineNo = 2 To Range("A1").End(xlDown).Row
    If Range("A" & LineNo).Value = pidStr Then
        sWS.Rows(LineNo & ":" & LineNo).Copy Destination:=tWS.Rows(tWS.Range("A1").End(xlDown).Row + 1 & ":" & tWS.Range("A1").End(xlDown).Row + 1)
    End If
Next LineNo

或者您可以过滤数据表并仅复制剩余的行:

ActiveSheet.Range("$A$1:$C$" & Range("A1").End(xlDown).Row).AutoFilter Field:=1, Criteria1:=pidStr
Rows("2:" & Range("A1").End(xlDown).Row).SpecialCells(xlCellTypeVisible).Copy Destination:=tWS.Rows(tWS.Range("A1").End(xlDown).Row + 1 & ":" & tWS.Range("A1").End(xlDown).Row + 1)