2015-11-03 78 views
1

我試圖複製和粘貼列B中出現的列A到新的工作表(例如,複製和粘貼列A中包含1,2和7的所有行到新工作表)。我知道一個不太聰明的方式使用宏。我相信使用嵌套循環會使生活更輕鬆(當列B是一個長列表),但是,我沒有工作。請參閱下面的LessSmartWay代碼和FailedSmartWay代碼。如何從列中選擇符合多個條件的行?

表看起來是這樣的:

A B C D 
1 1 a 1/1/2015 
1 2 b 1/2/2015 
1 7 c 1/3/2015 
2 - a 1/4/2015 
3 - b 1/5/2015 
3 - c 1/6/2015 
3 - a 1/7/2015 
3 - b 1/8/2015 
4 - c 1/9/2015 
4 - a 1/10/2015 
5 - b 1/11/2015 
5 - c 1/12/2015 
6 - a 1/13/2015 
6 - b 1/14/2015 
6 - c 1/15/2015 
7 - a 1/16/2015 
7 - b 1/17/2015 
7 - c 1/18/2015 

Sub LessSmartWay()  
    Set t = Sheets("test") 
    Set r = Sheets("select") 
    Dim d As Integer 
    Dim j As Integer 
    d = 1 
    j = 2 
    Do Until IsEmpty(t.Range("A" & j)) 
    If t.Range("A" & j) = t.Range("B2") Or t.Range("A" & j) = t.Range("B3") Or t.Range("A" & j) = t.Range("B4") Then 
    d = d + 1 
    r.Rows(d).Value = t.Rows(j).Value 
    End If 
    j = j + 1 
    Loop 
End Sub 

Sub FailedSmartWay() 
    Set t = Sheets("test") 
    Set r = Sheets("select") 
    Dim d As Integer 
    Dim j As Integer 
    Dim i As Integer 
    d = 1 
    j = 2 
    i = 2 
    Do Until IsEmpty(t.Range("B" & i)) 
     Do Until IsEmpty(t.Range("A" & j)) 
     If t.Range("A" & j) = t.Range("B" & i) Then 
     d = d + 1  
     r.Rows(d).Value = t.Rows(j).Value 
     End If 
     j = j + 1 
     Loop 
     i = i + 1 
    Loop 
End Sub 
+0

同樣可以通過在A列 –

+0

使用過濾器如果B列有100個,我不希望在A列中使用過濾器這就是爲什麼我想使用宏來點擊100次來完成。謝謝。 –

+0

輸出結果是什麼?通過你的代碼,它將有7行所有行1,2或7欄A列。這是正確的嗎? –

回答

1

每次通過外環

Do Until IsEmpty(t.Range("B" & i)) 
    ' Insert this line here 
    j = 2 

    Do Until IsEmpty(t.Range("A" & j)) 
    If t.Range("A" & j) = t.Range("B" & i) Then 
    d = d + 1  
    r.Rows(d).Value = t.Rows(j).Value 
    End If 
    j = j + 1 
    Loop 
    i = i + 1 
Loop 
+0

這工作完美!謝謝! –

0

一對夫婦爲/每個循環遍歷一個迭代範圍,重置第j值。它似乎有點乾淨。

Dim LastRowA As Long 
Dim LastRowB As Long 

Dim WB As Workbook 
Set WB = ActiveWorkbook 

Dim wks As Worksheet 
Dim wks2 As Worksheet 
Set wks = WB.Sheets("test") 
Set wks2 = WB.Sheets("select") 

LastRowA = wks.Cells(wks.Rows.Count, "A").End(xlUp).ROW 
LastRowB = wks.Cells(wks.Rows.Count, "B").End(xlUp).ROW 

Dim rowRangeA As Range 
Dim rowRangeB As Range 
Set rowRangeA = wks.Range("A1:A" & LastRowA) 
Set rowRangeB = wks.Range("B1:B" & LastRowB) 

' keep track of our current line on second worksheet 
Dim currentEndingRow As Integer 
currentEndingRow = 1 

For Each mCellA In rowRangeA 
    'Our nested loop, will cycle through each row in B once for every row in A. 
    For Each mCellB In rowRangeB 
     If mCellA.Value = mCellB.Value Then 
      'wks2.Cells(currentEndingRow, 1).Value = mCellA.Value 
      wks2.Rows(currentEndingRow).Value = wks.Rows(mCellB.Row).Value 
      currentEndingRow = currentEndingRow + 1 
     End If 
    Next mCellB 
' Move on to the next Row A after it finishes the last row in B. 
Next mCellA 
+0

你能解釋一下mCellA(或mCellB)是如何工作的嗎?我沒有看到你定義它?如果我想將整行復制到「select」,我想我們需要稍微調整這一行「wks2.Cells(currentEndingRow,1).Value = mCellA.Value」。如何改變這一點?謝謝。 –

+0

mCellA是在For Each循環中自動定義的,其定義只是簡單地創建For循環。在我看到你想將整行復制完之前,我評論了我的原始代碼。我現在所擁有的將會複製整行,而不僅僅是一個單元格。 –

+0

非常感謝。這非常有幫助! –

相關問題