Excel 填充列中的空白单元格,直到从重复列表中填充所有单元格

Excel 填充列中的空白单元格,直到从重复列表中填充所有单元格,excel,vba,Excel,Vba,我需要使用VBA代码来填充过滤后的空白单元格列表。我决定用一个小例子画一张图来解释它。D列应该填充A列中的名称,直到每个ID都有一个名称为止 我完全不知道如何循环它使其工作-这是令人难以置信的!我已经在网上搜索了几个小时,所以我现在请求帮助。请注意,C列和D列使用D列的标准空格进行过滤 下面是使用相同的3个名称交替填充筛选列表的空白单元格的工作代码 Sub Macro1() Dim last As Long Dim counter As Integer Dim nameRange As Ra

我需要使用VBA代码来填充过滤后的空白单元格列表。我决定用一个小例子画一张图来解释它。D列应该填充A列中的名称,直到每个ID都有一个名称为止

我完全不知道如何循环它使其工作-这是令人难以置信的!我已经在网上搜索了几个小时,所以我现在请求帮助。请注意,C列和D列使用D列的标准空格进行过滤

下面是使用相同的3个名称交替填充筛选列表的空白单元格的工作代码

Sub Macro1()

Dim last As Long
Dim counter As Integer
Dim nameRange As Range
Dim cell As Range

last = Range("A2").End(xlDown).Row
Set nameRange = Range("D2:D" & last).SpecialCells(xlCellTypeVisible)

counter = 1

For Each cell In nameRange
    If counter = 1 Then
        cell.Value = "Carrie"
        counter = counter + 1
    ElseIf counter = 2 Then
        cell.Value = "Lisa"
        counter = counter + 1
    Else
        cell.Value = "Bob"
        counter = 1
    End If

Next

End Sub

谢谢大家的意见-希望这能在将来帮助其他人。

我的例子并不完美,甚至不太好。。。太晚了:)

创建一个封装所有“名称”的命名范围(在我的示例中称为
namesRange
)。 在“指定”列中输入以下公式:

=索引(名称列表,行()-((INT(行()/行(名称列表))*行(名称列表))),1)

更新

想了想,并记住了如何更出色一点。。下面是我在第一个示例中尝试做的事情

=索引(名称列表,MOD(ROW()-1,ROWS(名称列表)-1)+1,1)

如果你不知道C列在哪里结束,这很容易计算出来。差不多

Range("D2:D4").Value = Range("A2:A4").Value
Range("D2:D4").AutoFill Destination:=Range(Range("D2"), _
    Range("C2").End(xlDown).Cells(1, 2))
如果您不知道A列中数据的扩展程度:

Dim last As Integer

last = Range("A2").End(xlDown).Row

Range("D2:D" & last).Value = Range("A2:A" & last).Value
Range("D2:D" & last).AutoFill Destination:=Range(Range("D2"), _
    Range("C2").End(xlDown).Cells(1, 2))

这样做无需过滤数据

Sub foo()
Dim ws As Worksheet
Dim lastrowa As Long
Dim lastrowd As Long
Dim counta As Long
Dim rng As Range

counta = 2 'First row of name list in column A

Set ws = Sheets("Sheet1")

With ws
    lastrowa = .Range("A" & .Rows.Count).End(xlUp).Row
    lastrowd = .Range("D" & .Rows.Count).End(xlUp).Row
    For Each rng In .Range(.Cells(2, 5), .Cells(lastrowd, 5))
        If rng.Value = "" Then
            rng.Value = .Cells(counta, 1).Value
            If counta = lastrowa Then
                counta = 2
            Else
                counta = counta + 1
            End If
        End If
    Next rng
End With


End Sub

这是一个编程问题吗?如果不是,超级用户网站将更合适。如果这是一个VBA问题,那么一般来说,读者会问你,看看你尝试了什么。你提到了一个循环,所以这将是一个好的开始!你能尝试一个
While()
循环,检查
C
列中的项目,直到它遇到一个空单元格吗?@halfer我需要插入vba代码和我的其余代码,这使我能够过滤仍然需要指定名称的ID。我认为,如果你打算发表评论,你至少可以提出一个建议。如果您不知道在循环中使用什么代码块,那么while循环就没有意义。我可以说每个范围的细胞,或者细胞是“很好”的,但是我在这个网站上,是为了找出如何从列表中填充空白细胞,直到它完成,我无法想出一个方法来完成。所以不,我没有这篇文章的代码。我想如果你想发表评论,你至少可以提供一个建议——我恐怕这里没有这样的建议。不过,公平地说,我确实提出了一个建议!@halfer所说的是,如果没有您当前的代码,除了猜测,我们应该怎么做。下面的答案都不适用于过滤后的数据。您应该显示您拥有的代码和更像您拥有的数据集的屏幕截图。
ROW()
非常随意,因此列表将根据公式放置在哪一行以不同的名称开始。要始终从顶部开始,请使其
行(1:1)
在向下拖动时将向上增加+1。@ScottCraner无论其放置在何处,它都从顶部开始?它计算所需的名称,假设OP希望它在列表中循环,当放入第2行时
row()-1
will=1当放入第3行时,它将等于2,它将在列表中进行精细迭代,但将从不同的位置开始,具体取决于公式从哪一行开始。但这都是学术性的,因为OP想要的东西能够处理排序后的数据,这将无法实现正确的迭代,这不是你的错,而是OP在开始时没有说明他们真正想要什么。谢谢你的帮助,但当我尝试时,它不起作用,因为列表被过滤了。我试图用你的答案来显示特殊的单元格,但它仍然不能正常工作。我更新了我的问题以指定已过滤的。
Sub foo()
Dim ws As Worksheet
Dim lastrowa As Long
Dim lastrowd As Long
Dim counta As Long
Dim rng As Range

counta = 2 'First row of name list in column A

Set ws = Sheets("Sheet1")

With ws
    lastrowa = .Range("A" & .Rows.Count).End(xlUp).Row
    lastrowd = .Range("D" & .Rows.Count).End(xlUp).Row
    For Each rng In .Range(.Cells(2, 5), .Cells(lastrowd, 5))
        If rng.Value = "" Then
            rng.Value = .Cells(counta, 1).Value
            If counta = lastrowa Then
                counta = 2
            Else
                counta = counta + 1
            End If
        End If
    Next rng
End With


End Sub