当前位置: 首页 > 知识库问答 >
问题:

Excel vba是否使用条件复制并粘贴整个范围?

师曦
2023-03-14

谢谢你阅读我的问题。

我有一个表[ws1(A4:Q500)]包含数据,而Q列后面有公式。因此,我无法复制整行,只能复制文本中的特定范围。

Q列是定义数据是否属于周期的公式,即11月16日至11月30日的数据。标志如下:

0

1 = 16/11 - 30/11

2.

这里的目标是将带有标志“1”的ws1数据复制到[ws2(A2:P200)],然后删除带有标志“1”和“2”的ws1数据

相信复制和删除的规则相当相似,我尝试先做复制部分

Sub PlotGraph()
Dim i As Integer
Dim j As Integer
Dim lastrow As Integer
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Data")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Analysis")   

j = 2

lastrow = ws1.Cells(Rows.Count, 1).End(xlUp).Row
    
For i = 4 To lastrow

    If ws1.Cells(i, 17) = 1 Then
        ws1.Range(Cells(i, 1), Cells(i, 16)).Copy
        ws2.Range(Cells(j, 1), Cells(j, 16)).PasteSpecial Paste:=xlPasteValues, _
                            Operation:=xlNone, _
                            SkipBlanks:=True, _
                            Transpose:=False
     j = j + 1
End If
Next i

End Sub

调试函数说它是错误的

ws1.Range(Cells(i, 1), Cells(i, 16)).Copy

我努力做修改,但它仍然不起作用,请帮我一点:(非常感谢。

共有1个答案

东门清夷
2023-03-14

ws2. Range(Cells(j,1), Cells(j,16))。PasteSpecial没有充分引用属于ws2的范围。范围内的Cells(...)可以属于任何工作表;它们必须专门属于ws2ws1也是如此。

ws1.Range(ws1.Cells(i, 1), ws1.Cells(i, 16)).Copy
ws2.Range(ws2.Cells(j, 1), ws2.Cells(j, 16)).PasteSpecial Paste:=xlPasteValues, _
                        Operation:=xlNone, _
                        SkipBlanks:=True, _
                        Transpose:=False

自动过滤方法可以为批量值传输节省一些时间。

Sub PlotGraph()
    Dim i As Long, j As Long, lr As Long
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    Set ws1 = ThisWorkbook.Sheets("Data")
    Set ws2 = ThisWorkbook.Sheets("Analysis")

    j = 2

    With ws1
        lr = .Cells(Rows.Count, 1).End(xlUp).Row

        With .Range(.Cells(3, 1), .Cells(lr, 17)) 'Range(A3:Q & lr) need header row for autofilter
            .AutoFilter field:=17, Criteria1:=1
            With .Resize(.Rows.Count - 1, 16).Offset(1, 0)
                If CBool(Application.Subtotal(103, .Cells)) Then
                    .Cells.Copy _
                      Destination:=ws2.Cells(j, 1)
                    'optional Copy/PasteSpecial xlPasteValues method
                    '.Cells.Copy
                    'ws2.Cells(j, 1).PasteSpecial Paste:=xlPasteValues
                    '▲ might want to locate row j properly instead of just calling it 2
                End If
            End With
        End With

    End With
End Sub

我注意到你正在使用一个范围。粘贴使用xlPasteValues的特殊方法。如果您需要仅值传输,那么这是可以接受的。

 类似资料:
  • 这应该真的很简单,但我一直在拖网论坛和答案数小时来寻找答案,但没有运气,所以我(不情愿地)创造了一个我自己的问题。 我要做的只是简单地创建一个新工作簿,并将另一个工作簿的范围粘贴到该工作簿中。听起来很简单..? 我原来的工作簿,让我们叫Book1。我试图创建一个新的工作簿,Book2,我将把单元格A1:B10的值复制到其中。 以下是我代码的一个版本(从第一册打开开始): 这会给出一个“Range类

  • 在一个编码的UI测试中,我试图使用range.copy从excel复制一个动态范围,并通过ctrl+V将其粘贴到wpf网格中。

  • 我是VSCode编辑器的新手。 以前使用atom时,将光标放在行尾并按Ctrl C键将复制该行。将光标放在另一行的末尾,然后按Ctrl V键将其粘贴到该行的下面。 似乎在VSCode中,我可以以相同的方式复制一行,但当我以相同的方式粘贴时,它会将该行放在所选行上方。当我的光标位于行尾时,这似乎非常违反直觉。 有什么地方可以改变这个的设置吗? 编辑:我没有试图复制一行。我想复制一行并粘贴到另一个文件

  • 问题内容: 我的.emacs中有(cua-mode t),因此Cc是复制的,而Cv是粘贴的,就像桌面上的其他大多数程序(Ubuntu,Gnome,Linux)一样。但是,Emacs似乎并未与其他程序共享剪贴板/复制缓冲区。 例如,如果我在Firefox中使用Cc,则可以将SCv粘贴到终端中,或者将Cv粘贴到gedit中。但是,如果我在emacs中使用Cv(或Cy),则无法获得从Firefox复制的

  • 我可以使用'yy'和'p'复制并粘贴到我的Vim文件中,但是当我从外部复制一些Python代码并尝试在我的Vim文件中执行'p'时,它只会将最后复制的内容粘贴到我的Vim中。 有没有反正我可以同步我的vim和系统剪贴板??