【问题标题】:Copy Paste Values only( xlPasteValues )仅复制粘贴值 (xlPasteValues)
【发布时间】:2014-07-19 04:34:04
【问题描述】:

我正在尝试将工作表 A 中的整个列复制到工作表 B。工作表 A 列具有使用公式形成的值。我只使用 xlPasteValues 复制 SheetA 列值。但它不会将值粘贴到另一个 sheetB。 sheetB 中的列是空的。 我的 VBA 代码

    Public Sub CopyrangeA()

    Dim firstrowDB As Long, lastrow As Long
    Dim arr1, arr2, i As Integer

    firstrowDB = 1
    arr1 = Array("BJ", "BK")
    arr2 = Array("A", "B")

         For i = LBound(arr1) To UBound(arr1)
        With Sheets("SheetA")
           lastrow = Application.Max(3, .Cells(.Rows.Count, arr1(i)).End(xlUp).Row)
           .Range(.Cells(1, arr1(i)), .Cells(lastrow, arr1(i))).Copy
           Sheets("SheetB").Range(arr2(i) & firstrowDB).PasteSpecial xlPasteValues
        End With
    Next
    Application.CutCopyMode = False

End Sub

【问题讨论】:

  • 对我来说似乎工作正常。你有任何错误吗?
  • 没有错误。 SheetB 列为空
  • 您是否尝试过在主窗口旁边单步执行代码?分解代码也可能有助于发现您的错误。也许添加一些.Select's,同时逐步尝试并查明发生了什么,但似乎没有任何东西阻止代码工作,据我自己运行后所见,我能做的不多建议。
  • Using The Transfer Method 在常规复制粘贴中获得 #N/A 值时帮助了我

标签: excel vba copy-paste


【解决方案1】:

如果您只想复制整个列,您可以通过执行以下操作大大简化代码:

Sub CopyCol()

    Sheets("Sheet1").Columns(1).Copy

    Sheets("Sheet2").Columns(2).PasteSpecial xlPasteValues

End Sub

或者

Sub CopyCol()

    Sheets("Sheet1").Columns("A").Copy

    Sheets("Sheet2").Columns("B").PasteSpecial xlPasteValues

End Sub

或者如果你想保持循环

Public Sub CopyrangeA()

    Dim firstrowDB As Long, lastrow As Long
    Dim arr1, arr2, i As Integer

    firstrowDB = 1
    arr1 = Array("BJ", "BK")
    arr2 = Array("A", "B")

    For i = LBound(arr1) To UBound(arr1)

        Sheets("Sheet1").Columns(arr1(i)).Copy

        Sheets("Sheet2").Columns(arr2(i)).PasteSpecial xlPasteValues

    Next
    Application.CutCopyMode = False

End Sub

【讨论】:

  • 我会尽可能避免使用剪贴板进行自动化。如果用户或其他应用程序同时使用剪​​贴板,则数据可能会出现在意想不到的地方。这可能会导致数据丢失甚至机密信息泄露。
【解决方案2】:

就我个人而言,如果您只需要列,我也会将其缩短一点:

For i = LBound(arr1) To UBound(arr1)
    Sheets("SheetA").Columns(arr1(i)).Copy
    Sheets("SheetB").Columns(arr2(i)).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
Next

从这段代码 sn-p 来看,lastrowfirstrowDB 没有什么意义

【讨论】:

    【解决方案3】:

    由于您只想复制值,因此您可以将 arr1 的值直接传递给 arr2 并避免复制/粘贴。

    For 循环内的代码,With 块内,lastrow 计算后:

    Sheets("SheetB").Range(arr2(i) & firstrowDB).Resize(lastrow).Value = .Range(arr1(i) & 1).Resize(lastrow).Value
    

    【讨论】:

    • 这应该是答案。
    【解决方案4】:

    你可以使用这个:

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    

    【讨论】:

      【解决方案5】:

      你也可以用这个

      Sub CopyPaste()
      Sheet1.Range("A:A").Copy
      
      Sheet2.Activate
      col = 1
      Do Until Sheet2.Cells(1, col) = ""
          col = col + 1
      Loop
      
      Sheet2.Cells(1, col).PasteSpecial xlPasteValues
      End Sub
      

      【讨论】:

        【解决方案6】:

        selection=selection.values

        这样做的速度非常快。

        【讨论】:

        • 请澄清这是如何回答原始问题的?
        • 这是一种有趣的方式,可以仅使用值覆盖选择中的数据,但并不能真正解决所提出的问题。
        【解决方案7】:

        我以前也遇到过这个问题,我想我找到了答案。

        如果您使用按钮来运行宏,它可能链接到不同的宏,可能是您当前正在使用的另存为版本,您甚至可能没有意识到这一点。尝试直接从 VBA (F5) 运行宏,而不是使用按钮运行它。我的猜测是这会奏效。您只需将按钮上的宏重新分配给您实际要运行的宏即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-24
          • 1970-01-01
          • 2017-03-28
          • 1970-01-01
          相关资源
          最近更新 更多