【问题标题】:VBA Set Pasted Rows as RangeVBA 将粘贴的行设置为范围
【发布时间】:2021-10-02 05:29:27
【问题描述】:

下面是从工作表“模板”复制范围并粘贴到活动工作表上的第一个空白行的代码的一部分。第 1 行是标题行。

我想要做的是引用刚刚粘贴的行,以便然后 Group 行。

我的 VBA 很差,我不确定如何正确设置“PastedRange”。我怎样才能做到这一点?

    Dim copySheet As Worksheet
    Dim pasteSheet As Worksheet
    Dim LRow As Long
    Dim PastedRange As Range

    Set copySheet = ThisWorkbook.Worksheets("Template")
    Set pasteSheet = ThisWorkbook.ActiveSheet
    Set PastedRange = .Range("A" & .Rows.Count).End(xlUp).Row
    
    With pasteSheet
        '~~> Find the last cell to write to
        If Application.WorksheetFunction.CountA(.Cells) = 0 Then
            LRow = 2
        Else
            LRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
        End If

        copySheet.Range("2:" & copySheet.Cells(Rows.Count, _ 
        1).End(xlUp).Row).Copy
        .Rows(LRow).PasteSpecial Paste:=xlPasteAll
        PastedRange.Group
    End With

【问题讨论】:

  • 您从不使用PastedRange.Range("A" & .Rows.Count).End(xlUp).Row 必须包含在With somethingEnd With 中。此外,您仅将值分配给 LRow。你想粘贴什么?请提供您想要的样品和相应的结果
  • 对不起,我对你所说的可以做和不能做有点困惑。我已经编辑了问题以包括正在复制的内容。期望的结果是将复制的范围粘贴到活动工作表的第一个空白行中,然后将刚刚粘贴的行进行分组。
  • 没有理由感到困惑...Set PastedRange = .Range("A" & .Rows.Count).End(xlUp).Row,在它存在的地方,会引发错误。从两个角度来看,它不能返回使用该构造 (.Range(...) 的任何内容:该行返回一行而不是一个范围,并且 .Range(...` 仅在 With SomeSheet 内有意义,然后是您的代码和End With.
  • 我在 End With 之前添加了 PastedRange = .Range("A" & .Rows.Count).End(xlUp)PastedRange.Group。这是正确的方法吗?分组无效。
  • 在不返回错误方面是正确的,但是您的代码应该计算最后粘贴的行,而不是最后一行。请测试我粘贴的代码并发送一些反馈。

标签: excel vba range copy-paste


【解决方案1】:

请尝试下一个代码。它将所有粘贴的行分组,除了第一行:

Sub testGroupRows()
   Dim copySheet As Worksheet, pasteSheet As Worksheet, LRow As Long, csLastRow As Long

    Set copySheet = ThisWorkbook.Worksheets("Template")
    Set pasteSheet = ThisWorkbook.ActiveSheet
    
    With pasteSheet
        '~~> Find the last cell to write to
        If Application.WorksheetFunction.CountA(.cells) = 0 Then
            LRow = 2
        Else
            LRow = .Range("A" & .rows.count).End(xlUp).row + 1
        End If
        'if the summary row is not above, set it to be above:
        If .Outline.SummaryRow <> xlSummaryAbove Then .Outline.SummaryRow = xlSummaryAbove
        
        csLastRow = copySheet.cells(rows.count, 1).End(xlUp).row
        copySheet.Range("2:" & csLastRow).Copy
        .rows(LRow).PasteSpecial Paste:=xlPasteAll
        
        'group skipping the first copied row:
        .Range(.cells(.rows.count, 1).End(xlUp), .cells(.rows.count, 1).End _
                                       (xlUp).Offset(-(csLastRow - 3), 1)).EntireRow.Group
    End With
End Sub

【讨论】:

  • @aye cee 你没抽时间测试一下上面的代码吗?如果经过测试,它没有满足您的需求吗?
  • 谢谢,出了点问题,马上要测试了:)
  • 是的,我确实需要单独的组。第二个代码是创建单独的组,但是由于“-”符号位于隐藏的行中,因此无法折叠特定组。如果没有办法做到这一点并且仍然有“+/-”最好已经将源行分组,因为这样会起作用。
  • 很奇怪,以前(就在今天)我可以手动将一个组粘贴到另一个组下面,它会保持独立。现在它正在扩展该组。我想知道是否有一个设置可以切换这个!?
  • 这非常好用,我认为这可能是不可能的。非常感谢您的帮助!
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多