我正在尝试将信息粘贴到工作表的第一个空白单元格中?我怎么能这样做?
这就是我所做的,但它将信息粘贴1000次。我需要改变什么?
提前致谢。
Range("B2:E2").Select 'Selet info to copy
Selection.Copy 'Copy
Sheets(Range("A2").Value).Select 'Goto Sheet Listed in cell A2
Dim i 'define i
For i = 3 To 1000 'Set up loop size
If Range("A" & CStr(i)).Value = "" Then 'If Cell Ai is blank
Range("A" & i).Select
ActiveSheet.Paste 'Paste info
End If
Next i
End If
答案 0 :(得分:1)
虽然使用Exit For
修改循环可行,但有一种更好的方法 - 可以使用
Set lastCell = Range("A1").End(xlDown)
set freeCell = lastCell.Offset(1,0)
这假设至少有一个小区A1
以下。如果您知道(如您的示例中)将永远不会超过1000行占用,您可以在另一个方向执行此操作:
Function freeCell(r As Range) As Range
' returns first free cell below r
Dim lc As Range ' last used cell on sheet
Set lc = r.Offset(1000, 0).End(xlUp).Offset(1, 0)
Set freeCell = lc
End Function
Sub testIt()
Dim p As Range
Set p = freeCell(Range("A3"))
MsgBox "the address of p is " & p.Address
End Sub
函数freeCell
返回您所追求的单元格;子testIt
表明它有效(以及如何调用)。在您的情况下,您可以大大简化您的代码
Sub doIt()
Dim sh As Worksheet, tCell As Range
Sheets("Sheet1").Range("B2:E2").Copy
Set sh = Sheets(Range("A2").Value)
Set tCell = freeCell(sh.Range("A3"))
sh.Paste tCell
End Sub
注意 - 当你录制一个宏时,你会得到很多Activate
,Select
等命令。这些通常可以避免 - 并且在网上有很多优秀的文章(在这个网站上) )解释你为什么要避免它们。上面的剪辑显示了如何从一张纸复制到另一张纸而没有任何这些。
如果您不确定目标表上是否有任何内容(例如,第2行中没有标题行),您可以修改代码,使目标单元格永远不会超过第3行:
If tCell.Row < 3 Then Set tCell = tCell.Offset(3 - tCell.Row)
答案 1 :(得分:0)
您的FOR LOOP
将从小区A3
运行到A1000
,并且对于每个空单元格,它将粘贴该值。您希望在条件匹配后立即退出循环。您想添加Exit For
条件。
If Range("A" & CStr(i)).Value = "" Then
Range("A" & i).Select
ActiveSheet.Paste
Exit For
End If