2014-04-11 30 views
0

我需要将数据从一个工作表复制到另一个工作表。不过,我需要一个条件复制操作,它会根据条件跳过行。Excel表达式复制行但删除空白行

例如,如果我开始与...

Active Value 
yes  1 
no  2 
no  3 
yes  4 
no  5 
no  6 

我只想复制是活跃= YES行,所以我最终会...

Value 
1 
4 

灿有人告诉我这是如何完成1)一个宏和2)一个公式?

+0

宏将能够复制一整行,一个公式不会。 – Raystafarian

+0

@John,另请参阅我更新的答案与公式的方法 –

回答

4

公式的方法:

假设你的数据在Sheet1中,范围A2:B7

然后Sheet 2中细胞A2使用以下公式:

=IFERROR(INDEX(Sheet1!B:B,SMALL(IF(Sheet1!$A$2:$A$7="yes",ROW(Sheet1!$A$2:$A$7)),ROW()-ROW($A$2)+1)),"") 

与阵列条目(CTRL + SHIFT + ENTER),然后将其向下拖动。

enter image description here

VBA方法:

您可以使用AutoFilter

Sub test() 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim rng As Range, rngToCopy As Range 
    Dim lastrow As Long 
    'change Sheet1 and Sheet2 to suit 
    Set ws1 = ThisWorkbook.Worksheets("Sheet1") 
    Set ws2 = ThisWorkbook.Worksheets("Sheet2") 

    With ws1 
     'assumung that your data stored in column A:B, Sheet1 
     lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 
     Set rng = .Range("A1:B" & lastrow) 
     'clear all filters 
     .AutoFilterMode = False 
     With rng 
      'apply filter 
      .AutoFilter Field:=1, Criteria1:="yes" 
      On Error Resume Next 
      'get only visible rows 
      Set rngToCopy = .SpecialCells(xlCellTypeVisible) 
      On Error GoTo 0 
     End With 
     'copy range 
     If Not rngToCopy Is Nothing Then rngToCopy.Copy Destination:=ws2.Range("A1") 
     'clear all filters 
     .AutoFilterMode = False 
    End With 
    Application.CutCopyMode = False 
End Sub 

enter image description here

注意,如果你只想复制Value列中,更改

Set rngToCopy = .SpecialCells(xlCellTypeVisible) 

Set rngToCopy = .Offset(, 1).Resize(, .Columns.Count - 1).SpecialCells(xlCellTypeVisible) 
+1

好的工作!我不知道AutoFilter。这很酷。 – tmoore82

2

这是一个与宏很容易。假设你从第一张到第二张的复印,和上面的样品是在列A和B,你可以做到以下几点:

Public Sub ConditionalCopy() 

    Dim copyRng As Range 
    Set copyRng = Worksheets(1).Range("B2:B7") 

    Dim pasteRng As Range 
    Set pasteRng = Worksheets(2).Range("A2") 

    Dim i As Long 
    i = 0 

    For Each cell in copyRng.Cells 
     If cell.Offset(0, -1).Value2 = "yes" Then 
      pasteRng.Offset(i,0).Value2 = cell.Value2 
      i = i + 1 
     End If 
    Next cell 
End Sub 

用公式做它提出来讲是一个挑战不在第二张纸上留下任何空白行。这将是非常容易的,只需使用在第二片以下:

=If(A2 = "yes",b2,"") 

并复制下来,但你会与你必须回去自己删除空行结束了。如果你有能力使用这个宏,那么我会直接走这条路线,而不是花太多精力去设计一个公式。我越想到它,我越觉得它必须是避免双引用的程序化解决方案。

2

如果使用单独的计数器源和目标行,并使用单元格引用,而不是范围内的下列程序应该做的伎俩

Public Sub copyactivevalue() 

Dim i As Integer 
Dim j As Integer 
Dim acts As Excel.Worksheet 
Dim news As Excel.Worksheet 

Set acts = Excel.Worksheets("sheet1") 
Set news = Excel.Worksheets("sheet2") 


With acts 
    j = 2 
    For i = 2 To 7 
     If acts.Cells(i, 1).Value = "yes" Then 
      news.Cells(j, 1) = acts.Cells(i, 2).Value 
      j = j + 1 
     End If 

    Next 
End With 

Set acts = Nothing 
Set news = Nothing 
End Sub 

希望这有助于