根据特定列中的文本将特定行复制到其他工作表

Copy specific rows based on text in a specific column to a different sheet

提问人:Hajoroeters 提问时间:11/2/2023 最后编辑:Mayukh BhattacharyaHajoroeters 更新时间:11/4/2023 访问量:45

问:

我目前正在尝试将数据从一张纸1(精确输出)硬拷贝到另一张纸2(硬输出应计)。两张纸中的第 I 列提供了可以是“加价”或“应计”的描述。我的目标是将所有行从 sheet1 硬拷贝到 sheet2,其中 I 列表示应计。但是,当我尝试运行我的代码时,它不起作用(选择范围类的方法失败)。

有什么建议吗?

该代码基于以下教程:https://www.youtube.com/watch?v=qGZQIl9JJk4

亲切问候

哈条

代码如下:

Sub Coentunnel_Accruals()
' Coentunnel Macro

 If Worksheets("Checks").Range("C2").Value > 0.01 Then
        
        MsgBox "One or multiple checks is/are invalid"
        
        Exit Sub
    End If

    a = Worksheets("Output for Exact").Cells(Rows.Count, 9).End(xlUp).Row
    
        For i = 2 To a
    
            If Worksheets("Output for Exact").Cells(i, 9).Value = "Accruals" Then
                
                Worksheets("Output for Exact").Rows(i).Copy
                Worksheets("Hard Output Accruals").Activate
                b = Worksheets("Hard Output Accruals").Cells(Rows.Count, 1).End(xlUp).Row
                Worksheets("Hard Output Accruals").Cells(b + 1, 1).Select
                ActivateSheet.PasteSpecial Paste:=xlPasteValues
                Worksheets("Output for Exact").Activate
            
            End If
    Next
     
Application.CutCopyMode = False
ThisWorkbook.Worksheets("Output for Exact").Cells(1, 1).Select

End Sub 

我尝试更改不会激活任何工作表且不选择任何工作表的代码。我首先使用了以下简单代码:

If Worksheets("Output for Exact").Range("I2").Value = "Accrual" Then

Worksheets("Output for Exact").Range("A2:W39").Copy
Worksheets("Hard Ouput Accruals").Range("A2").PasteSpecial Paste:=xlPasteValues

但是,这仅考虑 I2 中的值,不会遍历所有行以查看它是否为应计项目,并且仅复制 I2 为应计项目的数据。

Excel VBA VBA6

评论

1赞 CHill60 11/2/2023
不要使用复制和粘贴,只需分配值,例如Worksheets("Hard Output Accruals").Range("A" & b & ":W" & b).Value = Worksheets("Output for Exact").Range("A" & i & ":W" & i).Value

答:

0赞 IvanSTV 11/2/2023 #1

你为什么不使用简单的方法呢?

Sub CopyLines()
Const iRow as Long
Sheets(1).Activate
Dim x as Long, y as Long, count as long
x=Sheets(1).Activesheet.UsedRange.Rows.count
y=Sheets(1).Activesheet.UsedRange.Columns.count
Dim Result (x,y) as Variant' result array
count=0
For i=1 to x
  If Cells(i,iRow)=<your condition> then 
    For j=1 to y
      count=count+1
      Result(count,j)=Cells(i,j)
    Next j
  End If
  Sheets(2).Activate
  For i=1 to count
    for j=1 to y
      Cells(i,j)=Result(i,j)
    Next j
  Next i
End sub 
0赞 Jeffrey Zanghi 11/4/2023 #2

这是您的代码的过度简化版本...但我认为您可以根据需要将两者结合起来/编辑。

基本上,在我的笨拙版本中,我在 Sheet3 的第 I 列中复制了所有带有“是”字样的行,然后将它们作为值粘贴到 Sheet4 上。在您的方案中,显然将“是”更改为“应计”,并将 Sheet3 和 Sheet4 更改为 Sheets 的名称

Sub CopyRows()
    Dim i As Long, j As Long, lastRow As Long
    lastRow = Sheets("Sheet3").Cells(Rows.Count, 9).End(xlUp).Row
    j = 1
    For i = 1 To lastRow
        If Sheets("Sheet3").Cells(i, 9).Value = "Yes" Then
            Sheets("Sheet3").Rows(i).Copy
            Sheets("Sheet4").Rows(j).PasteSpecial xlPasteValues
            j = j + 1
        End If
    Next i
End Sub