0

我是 VBA 世界的新手,需要你的帮助。

我想从 Sheet2 和 Sheet3 中的 A、B 和 C 列复制数据,并将其粘贴到 Sheet1 的 A、B 和 C 列中,但要堆叠。也就是说,Sheet2 中的数据应该粘贴到“A1:A4”中,Sheet3 中的数据应该粘贴到“A5:A9”中。

我正在使用以下代码并收到错误消息:

j = 1
For i = 1 to 2
    For k = 1 to 3  

    Sheets(i+1).range(cells(1,k),cells(4,k).copy
    Sheet(1).range(cells(j,k),cells(j+3,k).PasteSpecial xlPasteValues
    
    Next k
j = j + 4

next i

如果有更好的方法来做到这一点,那也会有所帮助。请帮忙!

4

1 回答 1

-1

您的代码与下面提交的代码之间的区别在于准备工作的扩展。准备导致对缺乏准备导致混乱的问题的认识,并最终导致这个问题。我的意思是,如果你知道做好充分的准备,我认为你不需要问。

Private Sub Snippet()
    ' 218

    Dim Ws(1 To 2)  As Worksheet    ' "Source 1" and "Source 2"
    Dim i           As Integer      ' loop counter: Ws index
    Dim Rs          As Long         ' loop counter: rows (source)
    Dim WsOut       As Worksheet    ' "Output"
    Dim Rt          As Long         ' target row

    With ThisWorkbook
        Set WsOut = .Worksheets("Output")
        Set Ws(1) = .Worksheets("Source 1")
        Set Ws(2) = .Worksheets("Source 2")
    End With
    
    With WsOut                      ' = last used row in WsOut
        Rt = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With

    Application.ScreenUpdating = False
    For i = 1 To 2                  ' loop through Ws(1 to 2)
        With Ws(i)                  ' find last used row in Ws(1)
            ' start copying from row 2 because row 1 probably holds captions
            ' end with last used row in column A
            For Rs = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
                Rt = Rt + 1
                .Range(.Cells(Rs, 1), .Cells(Rs, 3)).Copy
                WsOut.Cells(Rt, 1).PasteSpecial xlPasteValues
            Next Rs
        End With
    Next i
    
    With Application
        .CutCopyMode = False
        .ScreenUpdating = True
    End With
End Sub

该过程从命名所有变量开始。第一个结果是即使在这个早期阶段也替换了诸如“Sheet(1)”之类的引用,因为“Sheet(1)”是选项卡栏中从左侧算起的第一个工作表。如果您无意中添加了工作表,您的代码将不再有效,或者相反,它会破坏您的工作簿。您的变量“k”和“j”被替换为“Rs”和“Rt”,将它们标记为行号(源和目标)。

接下来,代码确保将工作表正确定义为在ThisWorkbook中。他们还与他们的真实姓名正确关联,执行一开始做出的决定。实际上,在开发其余代码时,变量声明被多次修改。它一开始并不是一成不变的,但一切都建立在它之上。

然后设置目标行,并设计了一个维护系统。系统将首先找到最后使用的行,然后在每次写入新行之前递增该数字。

ScreenUpdating决定在代码运行时关闭。这样运行速度会更快,但您必须做好准备以在最后重新打开该功能。那部分代码就是此时写的。

直到现在我才到达你开始的地方。我的代码与你的非常相似。请注意,Copy/PasteSpecial允许您选择要粘贴的内容,在本例中为“值”。您可以使用Copywith Destination代替,它还包括格式。或者您可以指定复制公式而不是值。要复制值,您可以简单地在一个小循环中使用 WsOut.Cells(Rt, 1).Value = .Cells(Rs, 1).Value` 之类的语法。由于构建此代码的坚实基础,使用已建立的组件修改这两行非常容易。

代码通过 restore 设置Application.CutCopyMode = False并在显示器中显示操作的结果ScreenUpdating

于 2021-04-11T07:03:10.033 回答