0

我正在尝试将信息粘贴到工作表 A 列中的第一个空白单元格?我怎样才能做到这一点?

这就是我所做的,但它粘贴了 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
4

2 回答 2

1

虽然用 an 修改循环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返回您所追求的单元格;subtestIt表明它可以工作(以及它是如何被调用的)。在您的情况下,您可以大大简化您的代码

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, Selectetc 命令潜入。这些通常可以避免 - 并且在线(和这个网站上)有很多优秀的文章解释你为什么要避免它们。上面的片段显示了如何在没有任何这些的情况下从一张纸复制到另一张纸。

如果您不确定目标工作表上是否有任何内容(例如,第 2 行中没有标题行),您可以修改代码,使目标单元格永远不会高于第 3 行:

If tCell.Row < 3 Then Set tCell = tCell.Offset(3 - tCell.Row)
于 2013-11-04T14:16:27.570 回答
0

FOR LOOP将从单元格运行,A3直到A1000每个空单元格都将粘贴该值。您希望在条件匹配后立即退出循环。您想添加一个Exit For条件。

If Range("A" & CStr(i)).Value = "" Then
    Range("A" & i).Select
    ActiveSheet.Paste
    Exit For
End If

资源

于 2013-11-04T13:45:43.100 回答