【问题标题】:Destination paste range is selected on original sheet after copy复制后在原始工作表上选择了目标粘贴范围
【发布时间】:2020-09-02 08:26:51
【问题描述】:

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

【问题讨论】:

  • 第一个问题:您真的需要使用比Range.Value 传输更慢的复制/粘贴功能吗?
  • 嗨@JvdV,只要它实现目标就没有必要,我对VBA相当缺乏经验,上面的代码实际上是从谷歌研究和采摘的,发现除了上述问题外它运行良好.
  • 尽可能避免使用 Copy,因为它比告诉 VBA 将一个范围的值放在另一个范围内要慢得多。在下面查看我的答案

标签: excel vba


【解决方案1】:

如果您不希望选择 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 是“单元格 F2 到单元格 F(2 + 要粘贴的单元格数)”

【讨论】:

  • 嗨@romulax14 感谢您抽出宝贵时间,使用 .value 方法清除两张表中的整个列,我的意图是更新 Sheet1 中的数据,然后将最新更新的数据从 Sheet1 传输到 Sheet2,同时保持Sheet1 中的数据。
  • @Goodday .value 不会清除它从中获取内容的区域:range1.Value = range2.Value 保持 range2 不变。我只是颠倒了 wsCopy 和 wsDest。我编辑了我的帖子,再试一次它有效
  • @Goodday 我的代码告诉 excel 将 wsDest(已被清除)放入 wsCopy。我的错误,我改变了它,必须进入wsDest的是wsCopy。再次尝试我的代码
  • 嗨@romulax14 谢谢,您的代码解决了范围选择问题,但它在最后一行之后填充了 5 行 #N/A,其中包含目标 Sheet2 中的值,知道为什么会这样?
  • 我的工作簿或单元格中没有公式,尝试将您的代码粘贴到新的工作簿中,它返回相同的内容。
【解决方案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

行动中

【讨论】:

  • 嗨@Siddharth Rout 非常感谢您的分享,我尝试了关闭屏幕更新的方法,但它不起作用。
  • 我在发布之前对其进行了测试。在wsCopy.Range("H7:H" & lCopyLastRow).Copy wsDest.Range("F2") 之前键入Application.ScreenUpdating = False,然后键入Application.ScreenUpdating = True。同时让我看看我是否可以上传演示它的视频
  • 添加截图
  • @Siddarth Rout 谢谢你的截图。我试过了,使用完全相同的代码,但它不起作用,真的很奇怪。
【解决方案3】:

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

尝试添加:

wsDest.Activate
wsCopy.Activate

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

【讨论】:

  • 我已经在 cmets 中提出了这个建议,但是因为我想避免选择和取消选择而将其删除。如果您尝试选择的工作表被隐藏,这也会出错:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多