嗨,我有一个宏,可以将Sheet1中的H列复制到Sheet2中的F列,它按预期工作,可以复制和粘贴所有值,但是在运行宏并在Sheet1中选择F列的范围后,我不知道为什么或如何补救。下面是我的宏,请问有什么建议?
Sub Button1_Click()
Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Long
Dim lDestLastRow As Long
Set wsCopy = Worksheets("Sheet1")
Set wsDest = Worksheets("Sheet2")
lCopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "H").End(xlUp).Row
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "F").End(xlUp).Offset(1).Row
wsDest.Range("F2:F" & lDestLastRow).ClearContents
wsCopy.Range("H7:H" & lCopyLastRow).Copy wsDest.Range("F2")
End Sub
答案 0 :(得分:2)
如果不希望选择列F,则可以选择另一个单元格,例如A1。
这样可以解决选择(突出显示)列的问题。
但是,有一种更干净,更快捷的“复制粘贴”方法,该方法也不会在粘贴后选择范围。
仅参考您的范围并使用range1.Value = range2.Value
更改其值,这将仅复制粘贴值。如果您要复制格式,字体大小等,想法也是相同的。只需使用要复制/粘贴的任何属性更改.Value。
就您而言,这将使:
Sub Button1_Click()
Dim wsCopy As Worksheet, wsDest As Worksheet
Dim lDestLastRow As Long, nbvalues As Long
Set wsCopy = Worksheets("Sheet1")
Set wsDest = Worksheets("Sheet2")
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "F").End(xlUp).Offset(1).Row
nbvalues = wsCopy.Range(wsCopy.Range("H7"), wsCopy.Cells(wsCopy.Rows.Count, "H").End(xlUp)).Rows.Count
wsDest.Range("F2:F" & lDestLastRow).ClearContents
wsDest.Range("F2:F" & 2 + nbvalues).Value = wsCopy.Range("H7:H" & 7 + nbvalues).Value
End Sub
请注意,对于VBA进行复制/粘贴的最后一行,两个范围必须保持相同的长度,这就是为什么我在源范围和目标范围中都使用lCopyLastRow
的原因。
编辑:为了使用.Value=.Value
,两个范围都必须具有相同的大小。 nbvalues
是一个Long,代表要粘贴在其他范围内的单元格数,因此"F2:F" & 2+ nbvalues
是“ Cell F2 to Cell F(2 +粘贴的单元格数)”
答案 1 :(得分:2)
.Value=.Value
不会跨格式复制。它将仅跨值复制。因此,如果您也想跨其他内容进行复制,那么这将无济于事。如果您只想复制值,请尝试.Value=.Value
。
现在您的问题
我不知道为什么或如何补救。
为什么:这些没有记录的原因。如果要在工作表中进行复印,则不会出现此问题。仅在跨工作表复印时才会发生这种情况。实际上,这个Selection
甚至不是有效的选择。如果您在复制之前和复制代码之后输入Debug.Print Selection.Address
,您会发现它没有为您提供新选择范围的地址。
Option Explicit
Sub Sample()
Debug.Print Selection.Address
Sheet1.Range("E6:E15").Copy Destination:=Sheet2.Range("M6:M15")
Debug.Print Selection.Address
End Sub
操作:您可以通过关闭ScreenUpdating摆脱它。
这是一个例子
Sub Sample()
Application.ScreenUpdating = False
'~~> Sample Copy code
Sheet1.Range("E6:E15").Copy Destination:=Sheet2.Range("M6:M15")
Application.ScreenUpdating = True
End Sub
或者是编写与以下代码相同的代码的更好方法
Option Explicit
Sub Sample()
Dim currentScreenUpdating As Boolean
On Error GoTo Whoa
'~~> Store Users current ScreenUpdating state
currentScreenUpdating = Application.ScreenUpdating
'~~> Turn off screen updating
Application.ScreenUpdating = False
'~~> Sample Copy code
Sheet1.Range("E6:E15").Copy Destination:=Sheet2.Range("M6:M15")
LetsContinue:
'~~> Restore Users ScreenUpdating state
Application.ScreenUpdating = currentScreenUpdating
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
实际操作
答案 2 :(得分:0)
如果在工作表之间切换,则所选区域消失。
尝试添加:
wsDest.Activate
wsCopy.Activate
作为Sub
中的最后两行-清除选择。