如何删除excel中的空白但有条件

时间:2014-10-27 16:00:08

标签: excel vba

VBA有没有简单的方法可以删除空白但不是全部

我通常使用此代码删除空白:

Option Explicit 

Sub DeleteBlanks() 
    Dim intCol As Integer 

    For intCol = 1 To 14 'cols A to D
        Range(Cells(2, intCol), Cells(146521, intCol)). _ 
        SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp 
    Next intCol 
End Sub 

但我的情况有点特别,我无法使用此代码 我的表看起来像这个,但有更多列:

Item     code     Description   Cond1      Cond2   ....
A        ID1      Alpha         1 BOX      10 BOX
B        
         ID1      Bravo         1 BOX      50 BOX
C        ID1      Charlie       1 BOX
D        
         ID1      Delta         5 BOX
E        ID1      Echo          2 BOX      20 BOX
F        ID1      Foxtrot       1 BOX      40 BOX
G        ID1      Golf          1 BOX      20 BOX

我想这样:

 Item     code     Description   Cond1      Cond2   ....
A        ID1      Alpha         1 BOX      10 BOX
B        ID1      Bravo         1 BOX      50 BOX
C        ID1      Charlie       1 BOX
D        ID1      Delta         5 BOX
E        ID1      Echo          2 BOX      20 BOX
F        ID1      Foxtrot       1 BOX      40 BOX
G        ID1      Golf          1 BOX      20 BOX

目标不是删除COND2等列中的空格,而只是在ITEM和CODE不在同一行时将该行按顺序排列。 我希望我很清楚。 如果可以轻松改变列数或行数,那将是很好的。 同样的答案,但是从ITEM CODE和DESCRIPTION中重新排序。

如果我不够清楚,请向我询问更多信息。 提前致谢。 詹姆斯

2 个答案:

答案 0 :(得分:0)

如果排序,我想你可能只是添加一个列(比如A)和A2:

=IF(C1="",B1,B2)  

复制下来。选择ColumnA,Copy,Paste Special,值顶部,将B1移至A1,删除ColumnB并过滤以删除ColumnB中的空白。

答案 1 :(得分:0)

如果您填写第一列中的值,则可以使用某些代码删除空白。 以下代码将使用空白<​​/ p>上方的值填充选定范围

Sub Fill_in_blanks()
' this macro fills in blanks with the values above
' the empty cell
' it then does a copy paste special values to
' convert all the cells from a formula to a value
Dim myRng As Range

Set myRng = Selection


myRng.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=R[-1]C"
myRng.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

然后,您可以通过选择第2列并使用此代码删除具有空白列2的行来删除整行

Sub del_blank_zero()
Dim rng As Range
Dim mycell As Range
Set rng = Selection
For Each mycell In rng
    If mycell = 0 Or mycell = "" Then
        mycell.EntireRow.Delete
    End If
    'Debug.Print mycell.Address
Next mycell
End Sub

从下面的问题我修改了删除代码 仅选择第一列,然后运行代码,它处理您提供的示例 我没有使用10的偏移量,如果您的数据更宽或更窄,您只需更改该值

Sub del_blank_zero()
Dim rng As Range
Dim mycell As Range
Set rng = Selection
For Each mycell In rng
    If mycell.Offset(0, 1) = 0 Or mycell.Offset(0, 1) = "" Then
        Range(mycell.Offset(0, 1), mycell.Offset(0, 10)).Delete Shift:=xlUp
    End If
    If mycell = 0 Or mycell = "" Then
        mycell.Delete Shift:=xlUp
    End If
Next mycell
End Sub