【问题标题】:Copy paste every 10 cells range *10 times to a column每10个单元格范围* 10次复制粘贴到一列
【发布时间】:2018-09-10 15:30:07
【问题描述】:

我想每 10 行复制 & 粘贴一次,从 A 列到 B 列 10 次,依此类推,直到 A 列的末尾。

这是我尝试过的宏示例:

Sub cpydble()
Dim j As Long
Dim i As Long
Dim lRow As Long


lRow = Cells(Rows.Count, 1).End(xlUp).row


For i = 1 To lRow Step 10
    For j = 1 To 100 Step 10
    Cells(i, 1).Resize(10).Copy Destination:=Cells(j, 2)

    Next j
Next i
End Sub

我是 VBA 的初学者,希望您能对此有所帮助 - 在此先感谢。

这是我目前的结果:

【问题讨论】:

    标签: excel vba loops copy paste


    【解决方案1】:

    你可以使用:

    For i = 1 To lRow Step 10
        Range("B" & i & ":B" & i + 9).Value = Range("A1:A10").Value
    Next i
    

    请注意,使用上面的代码,如果不是 10 的倍数,最后一次迭代将低于列 A 中的最后一行。

    【讨论】:

      【解决方案2】:

      每次都从 1 开始 j 可能是搞砸了。只需为每个循环找到下一个开放单元即可。

      Sub cpydbl()
      
          Dim i As Long, j As Long
          Dim lRow As Long
      
          lRow = Cells(Rows.Count, 1).End(xlUp).Row
      
          For i = 1 To lRow Step 10
              For j = 1 To 10
                  Cells(i, 1).Resize(10).Copy Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)
              Next j
          Next i
      
          Cells(1, 2).Delete xlShiftUp
      
      End Sub
      

      Offset 从第 2 行开始复制,因此我删除了末尾的第一个空单元格以向上移动所有内容。

      【讨论】:

      • - 将每个块复制到列 B +1 中当前结果下方的下一个空闲单元格的好主意)。 旁注:如果数据发生更改,我建议清除 B 列以允许重复执行代码。
      【解决方案3】:

      完全灵活的代码

      除了@DickKusleika 的精美代码之外,我还演示了一种使用数据数组的完全灵活的方法,您可以在其中通过常量定义替代块大小、重复次数和起始行。

      Option Explicit                                    ' declaration head of your code module
      
      Sub copyBlocks()
      Const SIZE& = 10, REPETITIONS& = 10, STARTROW& = 1 ' define block size, repetions and start row
      Dim ws As Worksheet, i&, j&, k&, n&, v             ' declare variables
      Set ws = ThisWorkbook.Worksheets("MySheet")        ' << change to your sheet name
      n = ws.Range("A" & ws.Rows.Count).End(xlUp).Row    ' find last row number in column A
      n = ((n + SIZE) \ SIZE) * SIZE                     ' round up to full block size of 10 rows
      ws.Range("B:B") = ""                               ' clear column B
      k = STARTROW                                       ' start row of 1st block series
      For i = STARTROW To n Step SIZE                    ' if STARTROW = 1 For i=1, 11, 21, 31 ... To n
          v = ws.Range("A" & i).Resize(SIZE)             ' get next data block (10 rows)
          For j = 1 To REPETITIONS                       ' write eg. 10 data blocks to column B
              ws.Range("B" & (k + (j - 1) * SIZE)).Resize(SIZE) = v
          Next j
          k = k + SIZE * REPETITIONS                     ' get start row of next block series
      Next i
      End Sub
      

      备注

      • 声明变量(及其类型)并通过在代码模块的声明头中声明Option Explicit 来强制自己这样做; & 符号 &amp; 是例如的缩写Dim i As Longvall 未明确声明的变量默认为 Variant
      • 始终使用完全限定的范围引用,否则值默认为活动工作表,这可能会导致错误值。
      • 变量n 查找A 列中的最后一个行号并将其向上舍入到10 行的完整块大小。
      • 您可以在一个代码行中轻松地将范围值分配给变体二维数组,例如通过v = ws.Range("A1:E1234")v = ws.Range("A1:A17").Value进一步提示 这个数组的每个成员都可以通过行和列索引来寻址。请注意,从工作表范围获取值的数据字段数组是基于 1 的,因此第一个值将被寻址为 v(1,1)

      【讨论】:

        猜你喜欢
        • 2018-09-06
        • 2021-03-18
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多