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

问题描述:

我需要使用VBA代码来填充已过滤空白单元格的列表。我决定用一个小例子来制作一张照片,以更容易地解释它。列D应填充col A的名称,直到每个ID都有一个名称。在列中填充空白单元格,直到从重复列表中填充所有空白单元格

我完全不知道如何循环使其工作 - 这是令人难以置信的!我一直在网上搜索几个小时,所以我现在正在寻求帮助。请注意,列C和d与标准的空白过滤列D.

example

这里是工作的代码来填充过滤列表的空白单元格同为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 

感谢大家的意见 - 希望这将有助于未来的其他人。

+0

这是一个编程问题吗?如果没有,_Super User_网站会更合适。如果这是一个VBA问题,那么一般来说,读者会询问你试过的东西。你提到一个循环,所以这将是一个好的开始!你可以尝试一个'While()'循环来检查'C'列中的项目,直到它遇到一个空单元格吗? – halfer

+0

@halfer我需要vba代码插入我的代码的其余部分,让我到过滤仍然需要分配名称的ID的这一点。我想如果你要评论你至少可以提供一个建议。 while循环没有意义,如果你不知道在循环中使用什么代码块。我可以对范围中的每个单元格说,或者单元格是“>”“很好,但是我在网站上查找如何从名称列表中按顺序填充空白单元格,直到它完成为止,找出一个办法来做到这一点。所以不,我没有这个特定的代码。 –

+2

_我想如果你要发表评论,你至少可以提供一个建议_ - 恐怕它不会像这样工作。虽然,公平地说,我确实提供了一个建议! – halfer

这将做到这一点,而无需过滤的数据。

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 

我的例子并不完美,甚至还有...它的后期:)

创建封装(在我的例子称为namesRange)所有的“名”命名的范围。 在你的“分配”栏中把下面的公式:

=INDEX(namesList,ROW()-((INT(ROW()/ROWS(namesList))*ROWS(namesList))),1)

更新...

想过这个问题,念着如何练成多一点。以下是我试图在我的第一个例子中做。

=INDEX(namesList,MOD(ROW()-1,ROWS(namesList)-1)+1,1)

+0

'ROW()'是非常随意的,因此列表将以不同的名称开始,具体取决于公式放置在哪一行。要始终从顶部开始,使其成为“ROW(1:1)”,当它被拖拽时会增加+1。 –

+0

@ScottCraner它确实从顶部开始,而不管它放在哪里?它计算所需的名字,因为当OP放置在第2行时,它希望它循环通过列表 – NickSlash

+0

当放置在第3行时,它将等于2,它将遍历列表,但会根据公式开始的哪一行而从不同的位置开始。但是,这一切都是学术性的,因为OP想要的东西可以与分类数据一起工作,并且这不会实现正确的迭代,这不是你的错,而是OP没有说明他们在开始时真正想要的东西。 –

Range("D2:D4").Value = Range("A2:A4").Value 
Range("D2:D4").AutoFill Destination:=Range("D2:D11") 

如果你不知道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)) 
+0

感谢您的帮助,但是当我尝试它不工作,由于列表被过滤。我正在尝试使用特殊单元格可见的答案,但它仍然无法正常工作。我更新了我的问题以指定过滤。 –