复制后在原始图纸上选择了目标粘贴范围

时间:2020-09-02 08:26:51

标签: excel vba

嗨,我有一个宏,可以将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

3 个答案:

答案 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

实际操作

enter image description here

答案 2 :(得分:0)

如果在工作表之间切换,则所选区域消失。

尝试添加:

wsDest.Activate
wsCopy.Activate

作为Sub中的最后两行-清除选择。