Excel:将值向下复制一列,直到另一列中的第一个空白单元格?

Excel:将值向下复制一列,直到另一列中的第一个空白单元格?,excel,vba,Excel,Vba,我希望找到一种方法,将B列中的单元格值复制到E列中的第一个空白单元格。我得到的基本上是: 但我希望自动发生的是: 是否有一种方法可以使产品名称在E列添加新成分时自动复制到B列,然后在空白行后添加新产品时以新产品名称重新开始。如果要手动向E列添加成分,可以使用C中的公式 在单元格C3中放入此公式,并根据需要向下拖动: =IF(AND(E2<>"",E3<>""),"Product "&COUNTBLANK($E2:$E$3)+1,IF(AND($E2="",ISBL

我希望找到一种方法,将B列中的单元格值复制到E列中的第一个空白单元格。我得到的基本上是:

但我希望自动发生的是:


是否有一种方法可以使产品名称在E列添加新成分时自动复制到B列,然后在空白行后添加新产品时以新产品名称重新开始。

如果要手动向E列添加成分,可以使用C中的公式

在单元格C3中放入此公式,并根据需要向下拖动:

=IF(AND(E2<>"",E3<>""),"Product "&COUNTBLANK($E2:$E$3)+1,IF(AND($E2="",ISBLANK($E2),$E3<>""),"Product "&COUNTBLANK($E$2:$E2),""))

这并不是天生自动的,但每次运行时,它都会填入您的产品名称

Sub Test()
    Dim oPrevName As String
    oPrevName = ""

    For icounter = 1 To Sheet1.Cells(Rows.Count, 5).End(xlUp).Row
        If Sheet1.Cells(icounter, 5).Value <> "" Then
            If Sheet1.Cells(icounter, 2).Value <> oPrevName And Sheet1.Cells(icounter, 2).Value <> "" Then
                oPrevName = Sheet1.Cells(icounter, 2).Value
            End If
            Sheet1.Cells(icounter, 2).Value = oPrevName
        End If

    Next
End Sub

我们存储产品第2列中以前的非空名称。如果在第5列的同一行中列出了一种成分,我们将添加存储的产品名称。

您应该能够使用工作表。更改事件可执行此操作。此代码位于“图纸”模块中。它可能需要调整,但基本上会执行以下操作:

当工作表中的单元格发生变化时,检查该单元格是否在E列中。我假设您一次只输入一种成分,因此每个rng的。。。可能有点过分了。 检查单元格是否不是新产品列表中的第一个成分。我想到的最简单的方法是检查上面的单元格是否为空,以及上面一行和左边三列(即填充产品名称的单元格)是否也为空。 如果满足前两个条件,则将产品名称向下复制一行。 因此,必须手动输入每个新产品名称,跳过前一个产品后的一行,然后在第二个配料打开时进行填充

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range

    On Error GoTo ErrHandler
    Application.EnableEvents = False

    For Each rng In Target
        If Not Intersect(rng, Columns(5)) Is Nothing Then
            If rng.Row > 1 And Not IsEmpty(rng.Offset(-1)) And Not IsEmpty(rng.Offset(-1, -3)) Then
                rng.Offset(, -3).Value = rng.Offset(-1, -3).Value
            End If
        End If
    Next rng

ErrHandler:
    Application.EnableEvents = True

End Sub

谢谢,这很有帮助,但不幸的是,我的产品名称实际上不是产品1、产品2、产品3等。。我或其他用户仍将在该列中手动输入唯一的名称。我希望公式每次都能复制新的唯一值。这可能吗?@DanC-你能在你的OP中澄清一下吗-那么数据是如何输入的?您的用户是在C列还是E列输入信息?如果他们输入产品1的名称,成分应该是什么?你能不能用一些真实的数据来更新你的OP,而不是一个相对简单的例子?不一定是你拥有的数据,只是编一些东西。我只是用更真实的数据更新了这篇文章。用户将在多个列中输入数据,不仅仅是B列,我只希望它根据E列中的新条目复制这些值Ingredits此数据有一个非常明显的模式,但根据您下面的评论,它并不代表真实数据。你能不能改为使用一些更符合你将要使用的模拟数据?此外,用户是否仅向列E添加数据?还是B栏?或者两者都有?更新:成分列为5E,而不是4D。再次感谢您的帮助,也许您可以建议修改我添加到原始帖子中的代码?如果它工作正常但速度较慢,最好作为问题提问。快速浏览一下,您肯定不需要重复错误GoTo ErrHandler和Application.EnableEvents=False,您只需在目标中的每个rng循环一次。代码运行良好,我只需使用命名范围和较少的易失性公式更新工作簿,现在它运行平稳。再次感谢您的帮助,我将删除我的编辑。