Excel 根据特定列中的值将行复制到单独的图纸
“我的表”中的“组”列包含值1或2。我想使用按钮将值为1的行复制到Sheet2,将值为2的行复制到sheet3。如果单元格留空或值既不是1也不是2,它也应该显示错误消息 卷无米宽组 112 150 130 1 因为我对编码是新手,所以我必须遵循这种方法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
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。