我放弃了。我花了四个小时试图弄清楚为什么这个宏不起作用。
我希望它获取给定的源Range,使用For
循环遍历它并将Value复制到另一列。
我希望它从给定的目标单元格开始,
我无法弄明白为什么
请注意,我并不是在寻找解决这个问题的聪明,优雅的解决方案,努力教会自己vba范例,我想保持基本的东西。随着我对基础知识的理解越来越好,我会尝试一些高级技巧。
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
答案 0 :(得分:1)
以下是一些提示:
鉴于firstRow
和lastRow
是单个单元格,不需要Address
内容。使用
Set source = Range(firstRow, lastRow)
在destination.EntireRow.Insert Shift:=xlUp
中,由于您将Insert
应用于整行,Shift
没有任何区别。使用
destination.EntireRow.Insert
位于destination
上方的插入行和destination
向下移动。所以for循环的第一次迭代就是这个
destination
设为A21
destination
移至A22
desination
向下设置一行,即A23
然后,下一次迭代将覆盖最初位于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