【问题标题】:Copy Row Data from one to another sheet base on Yes condition根据是条件将行数据从一个工作表复制到另一个工作表
【发布时间】:2019-04-11 03:24:49
【问题描述】:

我想根据 I 列中的“是”条件将数据从一张表复制到另一张表。我可以在新工作表中添加数据,但在同一行中一次又一次地复制。我希望我的第 3 行有填充,而不是它们在 5 行比 6 行复制数据等。此代码仅在我从下拉列表中选择是选项时运行。

MS Excel 2013

文件:https://www.dropbox.com/s/hfpjrmm1fgc6my3/EXCEL%20FORMULA.xlsm?dl=0

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastrow As Long
    Dim Response
    Dim rng As Range, rngToDel As Range
    Dim fAddr As String

    If Intersect(Target, Range("I:I")) Is Nothing Then Exit Sub

    Application.EnableEvents = False
    On Error GoTo ErrHandler
    MsgBox (lastrow)
    With ThisWorkbook.Worksheets("Sheet2")
        Worksheets("Sheet2").Activate
        lastrow = ActiveSheet.Cells(.Rows.Count, "A").End(xlUp).Row + 1
        MsgBox (lastrow)
        If UCase(Target.Value) = "YES" Then
            Response = vbYes
            If Response = vbYes Then

                .Range("A" & lastrow).Resize(, 50).Value = _
                Range("A" & Target.Row).Resize(, 50).Value
                MsgBox "Record added"
            End If
        End If
    End With


ExitHere:
    Application.EnableEvents = True
    Exit Sub
ErrHandler:
    Resume ExitHere
End Sub

我面临的问题:lastrow 只给我第二行 Sheet2 一次又一次,并用新行覆盖数据。

【问题讨论】:

  • 每次更改都需要复制数据吗?每当您需要并复制工作表上的所有内容时,这可能是 1 次刷新。对吗?
  • 为什么在完全限定的With 工作表语句中使用ActiveSheet?另外:Range("A" & Target.Row).Resize(, 50).Value 之前缺少的. 可能会导致问题。
  • 附注:您的确切代码对我有用;在Sheet2 的现有数据下复制了 50 列。
  • @Nacorid ,以上代码完美复制数据。问题是当我在 sheet1 中分配 Yes 选项 4-5 行时,在 sheet2 中,所有数据都被最后一个覆盖。
  • @Nacorid 如果我在 sheet1 中选择 5 是,在 sheet2 中我们必须得到 5 行。但它只显示了 lats 一个。上面和下面的代码只会用新的记录覆盖。

标签: excel vba excel-formula


【解决方案1】:

这应该可以工作

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim LastRow As Long
    Dim WsSource As Worksheet, WsDest As Worksheet

    Set WsSource = ThisWorkbook.Sheets("Sheet1")
    Set WsDest = ThisWorkbook.Sheets("Sheet2")

    If Intersect(Target, WsSource.Range("I:I")) Is Nothing Then
        Exit Sub
    End If

    Application.EnableEvents = False
    On Error GoTo ErrHandler
    Debug.Print LastRow
    With WsDest
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
        Debug.Print LastRow
        If UCase(Target.Text) = "YES" Then
            .Range("A" & LastRow).Resize(, 50).Value = _ 
                WsSource.Range("A" & Target.Row).Resize(, 50).Value
            Debug.Print "Record added"
        End If
    End With

ExitHere:
    Application.EnableEvents = True
    Exit Sub
ErrHandler:
    Resume ExitHere
End Sub

【讨论】:

  • 同样的问题,当我用 yes 更新多行时,在 Sheet2 中我只得到最后一行。它覆盖了数据
  • 源表的“A”列中是否有任何数据?它对我有用,所以“A”列和其中的数据可能有问题。
  • A 列为空,其中没有数据。当我选择是时,我仔细检查了一次,每次只在工作表中更新 2 行。
  • LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 这会检查“A”列中目标工作表上的数据。您在第一行有一个标题,所以.row 返回 1,然后 +1 =2。因此它将始终粘贴在第 2 行。您需要将 "A" 更改为始终包含一些数据的其他列,并且它将起作用。
【解决方案2】:

一种简单的复制方法:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LastRow As Long

    If Not Intersect(Target, Range("I:I")) Is Nothing Then '<- If target change is in columnI

        LastRow = Sheet2.Cells(Sheet2.Rows.Count, "A").End(xlUp).Row + 1 '<- Find last row of sheet 2 column A

        If UCase(Target.Value) = "YES" Then '<- If target value is "YES"

            Sheet1.Range("A" & Target.Row & ":O" & Target.Row).Copy Sheet2.Range("A" & LastRow) '<- Copy from sheet 1 range A:O target.row to sheet 2 last row

        End If

    End If

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多