【问题标题】:Automatically copy rows to sheet based on cell根据单元格自动将行复制到工作表
【发布时间】:2017-01-11 02:37:11
【问题描述】:

我有一个标题为 Task List 的主工作表,其中包含行列表,我需要根据 Column I 中单元格的内容将每一行复制到特定工作表中强>。还有其他四个工作表(标题为 AdminEngineLabRD)需要提供这些值复制到,具体取决于 Column I 中的值。此外,还有一个名为 Completed 的单独工作表,其中行应移动到(而不是复制)其中在标题为 的工作表的 Column E 中包含单词“Complete”任务列表

以下是我目前从我找到的帖子中获取的代码。当我运行它时,它当前没有复制任何东西。任何人都可以建议新代码或对此进行修改吗?

Sub copyRows()

Set a = Sheets("Task List")
Set b = Sheets("Admin")
Set c = Sheets("Engine")
Set d = Sheets("Lab")
Set e = Sheets("RD")
Set f = Sheets("Completed")
Dim t
Dim u
Dim v
Dim w
Dim y As Long
Dim z

t = 2
u = 2
v = 2
w = 2
z = 3

Do Until IsEmpty(a.Range("I" & z))
    If a.Range("I" & z) = "Admin" Then
        t = t + 1
        b.Rows(t).Value = a.Rows(z).Value
    End If

    If a.Range("I" & z) = "Engine" Then
        u = u + 1
        c.Rows(u).Value = a.Rows(z).Value
    End If

    If a.Range("I" & z) = "Lab" Then
        v = v + 1
        d.Rows(v).Value = a.Rows(z).Value
    End If

    If a.Range("I" & z) = "RD" Then
        w = w + 1
        e.Rows(w).Value = a.Rows(z).Value
    End If

    If a.Range("E" & z) = "COMPLETE" Then
        y = f.Range("a" & Rows.Count).End(xlUp).Row + 1
        f.Rows(y).Value = a.Rows(z).Value
        a.Rows(z).Delete
        z = z - 1
    End If

    z = z + 1
Loop

End Sub

【问题讨论】:

    标签: vba excel excel-2010


    【解决方案1】:

    我认为循环无法正常工作。试试这个代码:

    Sub copyRows()
    
    Set a = Sheets("Task List")
    Set b = Sheets("Admin")
    Set c = Sheets("Engine")
    Set d = Sheets("Lab")
    Set e = Sheets("RD")
    Set f = Sheets("Completed")
    Dim t, u, v, w, y, CountLng As Long
    
    CountLng = ActiveSheet.UsedRange.Rows.Count
    
    t = 2
    u = 2
    v = 2
    w = 2
    z = 3
    
    For z = CountLng to 3 step -1
    
    
        If a.Range("I" & z) = "Admin" Then
        t = t + 1
        b.Rows(t).Value = a.Rows(z).Value
    
        ElseIf a.Range("I" & z) = "Engine" Then
        u = u + 1
        c.Rows(u).Value = a.Rows(z).Value
    
        ElseIf a.Range("I" & z) = "Lab" Then
        v = v + 1
        d.Rows(v).Value = a.Rows(z).Value
    
        ElseIf a.Range("I" & z) = "RD" Then
        w = w + 1
        e.Rows(w).Value = a.Rows(z).Value
        End If
    
        If a.Range("E" & z) = "COMPLETE" Then
        y = f.Range("a" & Rows.Count).End(xlUp).Row + 1
        f.Rows(y).Value = a.Rows(z).Value
        a.Rows(z).Delete
    
        End If
    
    Next z
    
    End Sub
    

    【讨论】:

    • @ShaiRado:在 If/Elseif 循环中使用 Select Case 有什么优势?
    • 嗯,似乎仍然无法正常工作。我将代码放在代码查看器的“ThisWorkbook”选项卡下。每张工作表中的数据直到第 3 行及以下才开始有关系吗?
    • @VBAPete 更简洁和更短的代码(而不是多个ElseIf),但每个都有他最喜欢的
    • @ShaiRado,你们有没有推荐不同的代码来完成这个?我根本不是 VBA 高手!
    • @user7400656:您需要在模块部分插入一个新模块并将其粘贴到那里。
    【解决方案2】:

    尝试AutoFilter 方法,您会发现它在处理大型数据集时更短、更快。

    注意:将Set FilterRng = a.Range(a.Range("I3"), a.Range("I3").End(xlDown))修改为您的数据所在的列。

    Option Explicit
    
    Sub copyRows()
    
    Dim a As Worksheet
    Dim SheetNames As Variant, ShtInd As Variant, FilterRng As Range
    Dim CopyRng As Range
    
    Set a = Sheets("Task List")
    
    SheetNames = Array("Admin", "Engine", "Lab", "RD", "Completed")
    
    a.Range("I3").AutoFilter ' <-- expand the range where your data lies
    
    Set FilterRng = a.Range(a.Range("I3"), a.Range("I3").End(xlDown))
    
    ' loop through all sheet names in array, except "Task List"
    For Each ShtInd In SheetNames
    
        ' check if there is a match before setting the AutoFilter (not to get an error)
        If Not IsError(Application.Match(ShtInd, a.Range(a.Range("I3"), a.Range("I3").End(xlDown)), 0)) Then
            FilterRng.AutoFilter Field:=1, Criteria1:=ShtInd ' <-- sut autofilter according to sheet name
    
            Set CopyRng = FilterRng.SpecialCells(xlCellTypeVisible) ' <-- set range to only visible rows
            CopyRng.EntireRow.Copy Sheets(ShtInd).Range("A" & Sheets(ShtInd).Cells(Sheets(ShtInd).Rows.Count, "I").End(xlUp).Row + 1) ' <-- Copy >> paste the entire range to all sheets to first empty row
    
            If ShtInd Like "Completed" Then
                CopyRng.EntireRow.Delete xlShiftUp   ' <-- delete the entire range related to sheet "Completed"
            End If
        End If
    
        FilterRng.AutoFilter Field:=1 ' <-- reset filter
    Next ShtInd
    
    End Sub
    

    【讨论】:

    • AutoFilter 方法似乎可以工作,但代码只需将行复制到名称匹配 Column I 的工作表中。它还会自动将该行复制到 Range A3,但它需要继续下一个空行。那可能吗?代码是否可以在每次满足条件时自动运行,而不必单击运行F5
    • @user7400656 你试过了吗?
    • 它正在工作,但由于某种原因它正在将第一行(Row 3)复制到所有工作表。 Row 3 下面的所有其他行似乎都在正确复制。 AutoFilter 似乎也覆盖了 Task List 表中的现有过滤器。可以改正吗?
    • 这是确保 4 个工作表根据 Task List 工作表的更新自动更新的最佳方法吗?我希望它成为一个动态文档,以便不断更新这 4 张纸,而无需我重新运行代码...
    • 什么是最好的?这是另一种方法,在处理大量数据时会很快工作,而且您不会遍历工作表中的所有单元格。你能告诉我任务列表表中的数据是什么样的吗?您在哪些列中有要复制到其他工作表的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多