【问题标题】:How to copy a range of cells to another column in VBA?如何将一系列单元格复制到VBA中的另一列?
【发布时间】:2017-05-15 01:03:55
【问题描述】:

工作环境:Excel 2013

目标:将 C1:C9 复制到 B11:B19。 D1:D9 到 B21:B29。 E1:E9 到 B31:B39 .....

将所有范围复制到B列后,将A1:A9复制到A11:A19(A21:A29....)

我的想法是: 1. 使用类似

的方式选择范围
     range.end()

因为在我的一些工作表中,只有 4 个测试步骤。所以我需要一种可以自我检查列中使用的单元格的语法。

  1. 将范围复制到 B 列。
  2. 在考虑页面布局之间留出 1 行。

我的一段代码是:

Worksheets("Master").Columns(3).UsedRange.Copy
Worksheets("Master").Range("B11").PasteSpecial

但似乎 Columns(i).UsedRange.Copy 不起作用。 pastespecial 作品。

我的问题是:

如何在列中选择使用的范围?列数不固定,这意味着有些工作表有 40 列,但有些可能有 30 列。

谢谢!

我附上了一张表格的截图供你参考。

【问题讨论】:

  • 使用范围始终包括从左上角到右下角的区域。顶部和底部可能会有空白单元格,而UsedRange.Columns(1) 不是 A 列。处理可能存在的空白单元格的最简单方法是将它们包含在粘贴的范围内。跨度>
  • 因此您想将 C 列向前复制到 B 列。如果您要复制的列没有任何其他数据,您可以使用 Range("C1:C" & Range("C" & Rows.Count).End(xlUp).Row) 获取 C 列中的所有数据

标签: vba excel


【解决方案1】:

假设您在要复制的列中没有更多数据,这应该可以工作

Sub copyToOneColumn()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Master")

    Dim startCol As Integer
    startCol = 3

    Dim endCol As Integer
    endCol = 10

    Dim startRange As Range
    Dim ra As Range


    For i = startCol To endCol
        Set startRange = ws.Range("A1").Offset(0, i - 1)
        Set ra = ws.Range(startRange, ws.Cells(Rows.Count, startRange.Column).End(xlUp))
        ra.Copy Destination:=ws.Range("B" & Rows.Count).End(xlUp).Offset(2, 0)
    Next i

End Sub

【讨论】:

    【解决方案2】:

    您可以像这样直接复制(技术上不是复制,因为它不使用剪贴板):

    Range("B1").Resize(Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count,1) = Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Value
    

    实际上,您正在查看 B1,然后将其大小调整为 A 列中与此一起使用的列数:Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count

    然后,您将 B 列中的这个新范围设置为 A 列中相同范围的值。

    注意,如果您总是从第 1 行开始,这可以缩短,但如果您从不同的行开始,我给您的代码就足够了。

    【讨论】:

      【解决方案3】:

      你可以试试这样的……

      Sub CopyData()
      Dim wsMaster As Worksheet
      Dim lr As Long, lc As Long, r As Long, c As Long
      Application.ScreenUpdating = False
      Set wsMaster = Sheets("Master")
      lr = wsMaster.Cells(Rows.Count, 1).End(xlUp).Row
      lc = wsMaster.Cells(1, Columns.Count).End(xlToLeft).Column
      r = lr + 2
      If lr <= 9 Then
          For c = 3 To lc
              wsMaster.Range(wsMaster.Cells(1, c), wsMaster.Cells(lr, c)).Copy wsMaster.Range("B" & r)
              wsMaster.Range("A1:A" & lr).Copy wsMaster.Range("A" & r)
              r = wsMaster.Cells(Rows.Count, 2).End(xlUp).Row + 2
          Next c
      End If
      Application.ScreenUpdating = True
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多