Excel 根据特定列中的值将行复制到单独的图纸

Excel 根据特定列中的值将行复制到单独的图纸,excel,vba,Excel,Vba,“我的表”中的“组”列包含值1或2。我想使用按钮将值为1的行复制到Sheet2,将值为2的行复制到sheet3。如果单元格留空或值既不是1也不是2,它也应该显示错误消息 卷无米宽组 112 150 130 1 因为我对编码是新手,所以我必须遵循这种方法 检查单元格是否为空并生成错误消息 检查单元格是否包含除1或2以外的值,并生成错误消息 最后,将值为1的行复制到Sheet2,并将其全部保留在sheet3中 我需要帮助,这是一个有效的方法。因为我必须把文件的大小控制小一些 enter code h

“我的表”中的“组”列包含值1或2。我想使用按钮将值为1的行复制到Sheet2,将值为2的行复制到sheet3。如果单元格留空或值既不是1也不是2,它也应该显示错误消息

卷无米宽组

112 150 130 1

因为我对编码是新手,所以我必须遵循这种方法

  • 检查单元格是否为空并生成错误消息

  • 检查单元格是否包含除1或2以外的值,并生成错误消息

  • 最后,将值为1的行复制到Sheet2,并将其全部保留在sheet3中
  • 我需要帮助,这是一个有效的方法。因为我必须把文件的大小控制小一些

    enter code here
    
    私有子命令按钮2_单击()

    Dim i作为整数
    p=Sheet1.范围(“l1”).值“范围内填充单元格的数量”
    Application.DisplayAlerts=False
    表1.激活
    ''检查范围是否为空
    对于i=29到p+29
    如果表1.范围(“l”&i).Value=”“,则
    MsgBox(“请为单元编号l和i输入收缩组”)
    范围(“L”和i)。激活
    终点
    如果结束
    接下来我
    “”正在检查该范围是否包含1或2以外的值
    对于i=29到p+29
    如果Sheet1.范围(“l”&i).值1和Sheet1.范围(“l”&i).值2,则
    MsgBox(“单元格编号l和i不存在阴影组”)
    范围(“L”和i)。激活
    终点
    如果结束
    接下来我
    '按组排序
    范围(“a29:L300”)。排序_
    键1:=范围(“l29”),标题:=xlYes
    '计算第1组中的卷数
    暗x,y等于长
    将a、b变为整数
    x=范围(“L”和行数.Count).End(xlUp).Row
    如果x<29,则x=29
    a=Application.WorksheetFunction.CountIf(范围(“L12:L”&x),1)+28
    范围(“M1”)。值=a
    '计算第2组中的卷数
    y=范围(“L”和Rows.Count).End(xlUp).Row
    如果y<29,则y=29
    b=Application.WorksheetFunction.CountIf(范围(“L12:L”&x),2)
    范围(“n1”)。值=b
    “”正在将groupwise复制到其他工作表
    表1.范围(“a29”、“l”和a)。副本
    表2.范围(“a5”).Paste特殊xlPasteAll
    表2.范围(“a5”).粘贴特殊XLPaste值和数字格式
    “”正在复制组2
    表1.范围(“a”和a+1,“l”和a+b)。副本
    表5.范围(“a5”).Paste特殊xlPasteAll
    表5.范围(“a5”).粘贴特殊XLPaste值和数字格式
    

    End Sub

    为源数据和要复制数据的行创建命名范围。在这个例子中,我使用了“source”、“range1”和“range2”。然后,以下代码将源数据复制到适当的位置:

    Sub copyData()
        Dim source As Range, range1 As Range, range2 As Range
        Dim r As Range
        Set source = Range("source")
        Set range1 = Range("range1")
        Set range2 = Range("range2")
        For Each r In source.Rows
            If r.Cells(1, 4).Value = 1 Then
                copyRow r, range1
            ElseIf r.Cells(1, 4).Value = 2 Then
                copyRow r, range2
            Else
                ' handle error here
            End If
        Next r
    End Sub
    
    Sub copyRow(data As Range, targetRange As Range)
        Set targetRange = targetRange.Resize(targetRange.Rows.Count + 1, targetRange.Columns.Count)
        For i = 1 To 3
            targetRange.Cells(targetRange.Rows.Count, i).Value = data.Cells(1, i).Value
        Next i
    End Sub
    
    可能有一种更优雅的方法,涉及数组公式,但这应该可以做到


    为了验证每个单元格仅包含“1”或“2”,您可以在我添加注释的地方包含其他代码,但最好将其作为数据验证处理。

    为源数据和要复制数据的行创建命名范围。在这个例子中,我使用了“source”、“range1”和“range2”。然后,以下代码将源数据复制到适当的位置:

    Sub copyData()
        Dim source As Range, range1 As Range, range2 As Range
        Dim r As Range
        Set source = Range("source")
        Set range1 = Range("range1")
        Set range2 = Range("range2")
        For Each r In source.Rows
            If r.Cells(1, 4).Value = 1 Then
                copyRow r, range1
            ElseIf r.Cells(1, 4).Value = 2 Then
                copyRow r, range2
            Else
                ' handle error here
            End If
        Next r
    End Sub
    
    Sub copyRow(data As Range, targetRange As Range)
        Set targetRange = targetRange.Resize(targetRange.Rows.Count + 1, targetRange.Columns.Count)
        For i = 1 To 3
            targetRange.Cells(targetRange.Rows.Count, i).Value = data.Cells(1, i).Value
        Next i
    End Sub
    
    可能有一种更优雅的方法,涉及数组公式,但这应该可以做到


    为了验证每个单元格仅包含“1”或“2”,您可以在我添加注释的地方包含其他代码,但最好将其作为数据验证处理。

    这听起来像是一个比VBA更适合数据验证和公式的问题,但您能向我们展示您迄今为止尝试过的代码吗?我已附加了代码。我希望它能让事情变得更清楚。这听起来像是一个比VBA更适合数据验证和公式的问题,但是你能给我们看看你迄今为止尝试过的代码吗?我已经附上了代码。我希望这会让事情变得更清楚。非常感谢。有一点疑问,你能解释一下“如果r.Cells(1,4).Value=1那么”这句话在做什么吗。如果我正在对其进行更改。错误:弹出“下标超出范围”。该行查看应该包含1或2的列,以便它可以使用适当的范围作为参数调用copyRow。非常感谢。有一点疑问,你能解释一下“如果r.Cells(1,4).Value=1那么”这句话在做什么吗。如果我正在对其进行更改。错误:弹出“下标超出范围”。该行查看应该包含1或2的列,以便它可以使用适当的范围作为参数调用copyRow。