【问题标题】:Copy and Paste using Range.Copy Method使用 Range.Copy 方法复制和粘贴
【发布时间】:2023-03-27 21:40:02
【问题描述】:

我正在尝试将一堆表中的值粘贴到一个长列表中。我将表格分布在不同的工作表中,并且行数发生了变化,但列没有。然后我还尝试粘贴一个字符串值,该值告诉它来自哪个工作表,但是代码的活动单元格部分有问题。

当我第一次尝试它时,它没有编译,所以我来这里,找出它为什么没有编译。在下面与 urdearboy 来来回回,我能够在这里得到正确的代码。

我有以下几点:

sub copypaste()
  Dim ws1 as worksheet
  dim ws2 as worksheet
  dim mas as worksheet
  Set ws1 =ThisWorkbook.Sheets("Sheet1")
  Set ws2=ThisWorkbook.Sheets("Sheet2")
  Set mas=ThisWorkbook.Sheets("Master") 'where I create my list

     For Each ws In Worksheets
    If ws.Name <> mas.Name Then
        LRow = mas.Range("A" & mas.Rows.Count).End(xlUp).Offset(1, 0).Row
        wsLRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
        ws.Range("A2:A" & wsLRow - 1).Copy
        mas.Range("A" & LRow).PasteSpecial Paste:=xlPasteValues
        ws.Range("B2:B" & wsLRow - 1).Copy
        mas.Range("B" & LRow).PasteSpecial Paste:=xlPasteValues
        mas.Range(mas.Cells(LRow, 4), mas.Cells(wsLRow + LRow - 2, 4)) = ws.Name 'I need my sheet value in the fourth column, not the third, but simply change the col coordinate in the Cells equation above

    End If
Next ws

'In order to figure out the sheet name, I used the following:
Dim rng As Range
Set rng = mas.Range("D2", Range("D2").End(xlDown))
For Each Cell In rng
    If Cell.Value = "Sheet 1" Then
        Cell.Value = "S1"
    ElseIf Cell.Value = "Sheet 2" Then
        Cell.Value = "S2"
    End If
Next Cell

结束子

【问题讨论】:

  • 现在无法编译。语法错误
  • 因此我的复制和粘贴问题。它不应该编译。
  • 请参阅如何在您的问题中包含minimal reproducible example
  • @JackArmstrong 您在错误行上的范围存在语法问题。您可以在下面的解决方案中看到一种正确的方法。
  • 请不要在问题中添加答案;这打破了问题。

标签: excel vba for-loop copy copy-paste


【解决方案1】:

这将遍历所有工作表,Master 除外,并将 A 列上的值导入到 Master,并附上数据的来源(工作表名称)。

Option Explicit 很好的衡量标准。


Option Explicit

Sub copypaste()

Dim mas As Worksheet: Set mas = ThisWorkbook.Sheets("Master")
Dim ws As Worksheet, LRow As Long, wsLRow As Long

Application.ScreenUpdating = False
    For Each ws In Worksheets
        If ws.Name <> mas.Name Then
            LRow = mas.Range("A" & mas.Rows.Count).End(xlUp).Offset(1).Row
            wsLRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
            ws.Range("A2:A" & wsLRow).Copy mas.Range("A" & LRow)
            mas.Range(mas.Cells(LRow, 2), mas.Cells(wsLRow + LRow - 2, 2)) = ws.Name
        End If
    Next ws
Application.ScreenUpdating = True

End Sub

粘贴值更改

ws.Range("A2:A" & wsLRow).Copy mas.Range("A" & LRow)

到这里

ws.Range("A2:A" & wsLRow).Copy
mas.Range("A" & LRow).PasteSpecial xlPasteValues

【讨论】:

  • 无论如何要将工作表名称添加为字符串的变量?我有字符串名称,但确实需要一个短名称,即 Sheet1=S1,Sheet2=S2。对不起。
  • 这与您的原始问题不同。如果您无法弄清楚,请自己试一试并发布一个新问题!如果这确实解决了您最初的问题,请通过验证解决方案来清除未回答队列中的问题
  • 听起来您知道要使用的工作表名称引用。使用基本功能 CTRL + F 和 Find / replace all 录制宏
  • 这很公平。如果我只需要粘贴值怎么办?见上文编辑。
  • 我是如何改变问题的?因为我要求粘贴值而不是?这是对问题的更新,而不是改变它。没有必要为此创造一个全新的东西。我编辑了代码。我会把你列为贡献者。对此感到抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多