如果单元格不是四个确定值中的一个,则复制整行

时间:2014-01-31 21:21:24

标签: excel vba excel-vba

被修改
  这是回答问题的代码

Dim i As Integer   

For i = 1 To Sheet1.UsedRange.Rows.Count        
    If Cells(i, "C") <> "Q" Then            
    Sheet1.Rows(i).EntireRow.Copy Sheets("Sheet2").Cells(i, 1)       
    End If
Next  

EDIT2
  我现在面临一些小问题,弄清楚它们有什么问题会很棒   1-这段代码是复制单元格,但问题是在另一张纸上粘贴它们后,整个地方都有空隙(它们是非复制单元格的位置)

Dim i As Integer

For i = 1 To Sheet1.UsedRange.Rows.Count

    If Cells(i, "P") <> "Q"  Then

    Sheet1.Rows(i).EntireRow.Copy Sheets("Sheet2").Cells(i, 1)

    End If
Next    

此问题的解决方法是添加
   .End(xlUp).Offset(1, 0)
  执行复制和粘贴的行之后。我之前尝试过,但是我使用了Offset(1)而且没有用

2 - 此代码导致Excel挂起,我必须强制它关闭,但是当我重新打开它时,复制的单元格出现在新工作表中(我知道问题,我认为这是因为Excel将检查所有单元格因为它们是= 0但我尝试使用与前一代码相同的for循环,但我不断收到错误)

Dim ro As Long
For Each cell In Sheets("Sheet1").range("U:U")
If (Len(cell.Value) = 0) Then
            ro = (ro + 1)
            Sheets("Sheet1").Rows(cell.Row).Copy Sheets("Sheet3").Rows(ro)
End If

Next  

#2的修复是添加行计数的for循环并包含它,我知道这会修复它但我的语法有问题。代码需要更改此行:

For Each cell In Sheets("Sheet1").range("U" & i)  

“i”是for循环,就像代码#1中的那个

2 个答案:

答案 0 :(得分:2)

此代码将迭代A列中的所有行,并检查文本是Q,W还是E.如果不是,它将复制该行。

Sub Test()
    Dim i As Integer
    'Loop to move through the rows
    For i = 1 To ActiveSheet.UsedRange.Rows.Count
        'Checks if it contains Q, W or E
        If Cells(i, 1) <> "Q" And Cells(i, 1) <> "W" And Cells(i, 1) <> "E" Then
            'Copy that row
            Rows(i).Copy
            'You said you know how to do the copy part so I won't include the rest...
        Else
            'Do something else
        End If
    Next
End Sub

下次在寻求帮助之前实际尝试此问题。如果不是那么简单,人们可能不会帮助太多。这也是一个快速google或SO搜索的东西。

答案 1 :(得分:0)

AutoFilter通过避免循环来快速完成此操作,并避免行副本上的间隙

如果您确实有小写qw数据,那么第二张表格中的输出将需要使用EXACT的高级过滤器。见Debra's example here

Sub Clean()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim rng1 As Range

Set ws1 = Sheets(1)
Set ws2 = Sheets(2)

Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp))
With rng1
   .AutoFilter Field:=1, Field:=1, Criteria1:="<>Q", Operator:=xlAnd, Criteria2:="<>W"
   If rng1.Cells.Count > 1 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Copy ws2.[a1]
End With
ws1.AutoFilterMode = False

End Sub