2016-05-15 194 views
-2

我需要使用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

回答

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 
0

我的例子並不完美,甚至還有...它的後期:)

創建封裝(在我的例子稱爲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沒有說明他們在開始時真正想要的東西。 –

2
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

感謝您的幫助,但是當我嘗試它不工作,由於列表被過濾。我正在嘗試使用特殊單元格可見的答案,但它仍然無法正常工作。我更新了我的問題以指定過濾。 –

相關問題