【问题标题】:Fill Down until Last Empty Row or Next Filled Cell向下填充直到最后一个空行或下一个填充单元格
【发布时间】:2015-09-05 21:32:33
【问题描述】:

我知道如何编写代码以填写一列,但我有一些条件我不知道如何实现。

我想填写直到最后一行(包含任何值)或包含信息的列中的下一个单元格。

数据是这样的

a        1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
b        1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
c        1  2  3  4  5  6  7  8  9  10
d        1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
e        1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10
         1  2  3  4  5  6  7  8  9  10

如您所见,代码需要识别在向下复制列时如何在 b 处停止(而不是复制它)。此外,当向下拖动 e 时,代码需要停在最后一行的值。

我一直在努力解决,但无济于事,请帮助!!!

之前的代码:

Yes I do have some code, but it is slow and I would like to figure out something more efficient.
'Sub CopyDown()
    Sheets("RAW").Range("A1").Select
    For i = 1 To 100
        ActiveCell.Copy
        ActiveCell.Offset(1, 0).Select
        If ActiveCell.Value = vbNullString Then
            ActiveCell.Paste
        End If
    Next i
End Sub'

【问题讨论】:

  • 你有没有你写的代码不起作用的例子?
  • 是的,我将代码链接到问题中

标签: vba excel copy autofill


【解决方案1】:

没有代码很难说,但假设你正在做一个循环,那么你需要做的就是检查单元格

Sub filldown()

Dim X, Y As Long
Dim MaxX, MaxY As Long

MaxX = ActiveSheet.UsedRange.Rows.Count
MaxY = ActiveSheet.UsedRange.Columns.Count

For X = 1 To MaxX
    For Y = 1 To MaxY
        If IsEmpty(ActiveSheet.Cells(X, Y)) = True Then
            ''Do something
        End If
    Next
Next

End Sub

【讨论】:

  • 是的,我相信这没问题,但我不明白这将如何理解它已到达最后一列。一个大问题是,我们正在执行此操作的第 1 列右侧的每一列都有可能在某一时刻成为空单元格或空单元格,因此,如果我在下降时简单地检查一个单元格是否有值,它可能不会击中任何东西(如果有意义的话)
  • @CodingNovice 哦,我的印象是它只是针对 A 列...所以你希望它在整个 UsedRange 上运行吗?
  • 不完全是。它只是 A 列,但问题是代码在通过第 50 行或第 100 行时需要停止复制。无论哪一行是最后使用的行!上面的 tbur 给出了一个很好的代码,但它现在超出了我的范围
【解决方案2】:

如果使用您的示例数据集,这很简单(将现有值填写到 A 列中的空白处。)

    Sub MacroFillAreas()

    For Each area In Columns("A:A").SpecialCells(xlCellTypeBlanks)
        If area.Cells.Row <= ActiveSheet.UsedRange.Rows.Count Then
            area.Cells = Range(area.Address).Offset(-1, 0).Value
        End If
    Next area

(代码修改)

   End Sub

【讨论】:

  • 现在检查这个。这对我来说是新的!
  • 所以唯一的问题是找到一种方法在包含值的最后一行停止它。否则我喜欢它是如何工作的。它非常快。它仍然复制到最后一行
  • 在我通过复制上面的示例数据创建的数据集上运行时,它不会超出最后一行。无论如何,我想我可以修改代码,使其不会超出最后一行。需要几分钟...
  • 奇怪的是它适用于我的样本数据而不是实际数据......除了这里的“1-10”在实际数据集上不那么干净之外,几乎没有区别。在我的集合中散落着空单元
  • 刚刚测试过,效果很好。在这一点上,这对我来说有点先进,但它做了它应该做的事情。我得好好研究一下:)谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多