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