循环到插入行,复制数据

时间:2012-09-18 07:41:21

标签: excel excel-vba vba

我放弃了。我花了四个小时试图弄清楚为什么这个宏不起作用。 我希望它获取给定的源Range,使用For循环遍历它并将Value复制到另一列。

我希望它从给定的目标单元格开始,

  • 输入值
  • 使用Insert创建一个新行(整行,不只是插入该列。我想在现有的行集中拟合数据)
  • 不覆盖指定目标列结束点的标记。下面有数据需要保存。

我无法弄明白为什么

  • 在一个过程实例中,它输入值,但随后在插入下一行时清除数据。
  • 在第二个实例中,它会跳过一行并删除列标记
  • 的结尾

请注意,我并不是在寻找解决这个问题的聪明,优雅的解决方案,努力教会自己范例,我想保持基本的东西。随着我对基础知识的理解越来越好,我会尝试一些高级技巧。

TIA

Sub Macro1()
Dim firstRow As Range, lastRow As Range
Dim source As Range, destination As Range
Dim readCell As Range

Set firstRow = Range("F2")
Set lastRow = Range("F20")
Set destination = Range("A21")


Set source = Range(firstRow.Address(False, False) & ":" & lastRow.Address(False, False))

For Each readCell In source
    destination.Select
    destination.Value = readCell.Value

    If (readCell.Address(False, False) = lastRow.Offset(1, 0)) Then
        Exit For
    Else
       'destination.Select
    End If

    'MsgBox (destination.Value)
    destination.EntireRow.Insert Shift:=xlUp
    Set destination = destination.Offset(1, 0)
Next
End Sub

2 个答案:

答案 0 :(得分:1)

以下是一些提示:

鉴于firstRowlastRow是单个单元格,不需要Address内容。使用

Set source = Range(firstRow,  lastRow)

destination.EntireRow.Insert Shift:=xlUp中,由于您将Insert应用于整行,Shift没有任何区别。使用

destination.EntireRow.Insert

位于destination上方的插入行和destination向下移动。所以for循环的第一次迭代就是这个

  1. destination设为A21
  2. 插入行,将destination移至A22
  3. desination向下设置一行,即A23
  4. 然后,下一次迭代将覆盖最初位于A22的数据,现在位于A23

    我想你想要

    Sub Macro1()
        Dim firstRow As Range, lastRow As Range
        Dim destination As Range
        Dim readCell As Range
    
        Set firstRow = Range("F2")
        Set lastRow = Range("F20")
        Set destination = Range("A21")
    
        For Each readCell In Range(firstRow, lastRow)
            destination.Value = readCell.Value
            destination.EntireRow.Offset(1, 0).Insert
            Set destination = destination.Offset(1, 0)
        Next
    End Sub
    

答案 1 :(得分:1)

非常值得称赞,你想要理解和解决

使用行计数器比使用固定目标的增量更容易。这个小调整

  • 避免Select
  • 使用计数器lngRow来控制新行和新值

    <强> code

    Sub Macro1()
    Dim readCell As Range
    Dim lngRow As Long
    For Each readCell In Range("F2:F20")
        [a21].Offset(lngRow, 0).EntireRow.Insert Shift:=xlUp
        [a21].Offset(lngRow, 0).Value = readCell.Value
        lngRow = lngRow + 1
    Next
    End Sub