2012-12-05 80 views
2

我有一个由4列和未确定的行组成的列表。我正试图收集Col B和C,其中Col B有单词Jackpot,并将它们复制到一张新单中。我已经得到了列表进行排序,但使用UsedRange复制所有行。我如何只复制B和C?Vba:基于文本选择多行

Range("A1").Activate 
ActiveCell.EntireRow.Insert 
Rows("1:1").Select 
Selection.AutoFilter 
Selection.AutoFilter Field:=2, Criteria1:="Jackpot" 

ActiveSheet.UsedRange.Select 

Col A | Col B |  Col C | Col D 
1  Stuff   1  1 
1  MoreStuff  2  1 
1  Jackpot  3  1 
1  Jackpot  4  1 
1  SomeStuff  5  1 
1  Jackpot  6  1 
+0

转到宏记录器并将其打开。全选。添加过滤器。在过滤器过滤列B使用你的话。选择结果。将结果粘贴到新工作表。关闭宏录像机。看看vba宏。 – Andrew

回答

3

首次降息,虽然我也有一些问题:

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Results") 
ws.Rows(1).AutoFilter Field:=2, Criteria1:="Jackpot" 
ws.Range("B2:C2", Range("B2:C2").End(xlDown)).Copy 
ThisWorkbook.Worksheets("DestinationSheet").Range("A1").PasteSpecial 

1)这将是在同一张纸上每次(前Worksheets("Results"))发生?
2)你想包含标题行吗?如果是这样,请在两种情况下将.Copy行更改为B1:C1。目前的实现只是在没有标题的情况下过滤内容。

很明显,您需要更改工作表名称以符合您的实施。

3

在筛选它,可以选择的范围B:C,然后复制到你的目的地。我更新了您的代码以向您展示一个示例。此外,你并不总是需要用VBA“选择”任何东西(这样做很少见)。

希望这有助于

Option Explicit 

Sub doIt() 
    Dim sh As Worksheet 
    Set sh = ActiveSheet 

    sh.Range("A1:D1").AutoFilter Field:=2, Criteria1:="Jackpot" 

    ' make sure results were returned from the filter 
    If (sh.Cells(sh.Rows.Count, 1).End(xlUp).Address <> "$A$1") Then 

     Dim newSh As Worksheet 
     Set newSh = Sheets.Add 

     sh.Range("B:C").Copy newSh.Range("A1") 

    End If 
End Sub 
+1

+1打我吧... :-) –

+0

哈!这对我来说是第一次在stackoverflow :)是的!大声笑 –

1

下面是一个简单的方法,它不依赖于自动过滤器。不确定速度更快,但我想为您的问题提供另一种解决方案。

Sub CopyJackpot() 
Application.ScreenUpdating = False 
Dim lastRow As Long, i As Long, j As Long 

j = 1 
lastRow = Range("B" & Rows.Count).End(xlUp).Row 

For i = 1 To lastRow 
    If InStr(Range("B" & i).Value, "Jackpot") Then 
     Rows(i).Copy Destination:=Sheets(2).Rows(j) 
     j = j + 1 
    End If 
Next 

Application.ScreenUpdating = True 
MsgBox j - 1 & " row(s) copied to Sheet2." 

End Sub