如何在值粘贴之前删除具有公式的行?

时间:2015-02-23 23:51:15

标签: excel vba excel-vba

我有一张包含公式的电子表格,我写了一个vb代码来评估粘贴。

根据输入文件填充的行数变化,我需要删除具有公式的行,现在为空。 (这是用作连接器,否则它是如何选择这些额外的行是不必要的)

Sheet2.Range("G2:G298").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

以上代码没有做任何事......

2 个答案:

答案 0 :(得分:0)

如果空白是如下公式的结果:

=""

输入一个单元格,然后复制并粘贴为值,这些不是真正的空白单元格 相反,这些是看起来空白但包含zero length字符串的单元格 SpecialCells(xlCellTypeBlanks)甚至Excel公式ISBLANK也无效。{ 一种方法是遍历范围并检查包含""的所有内容并将其删除。

Dim c As Range, rngtodelete As Range
For Each c In Sheet2.Range("G2:G298")
    If Len(c.Value) = 0 Then
        If rngtodelete Is Nothing Then Set rngtodelete = c _
        Else Set rngtodelete = Union(rngtodelete, c)
    End If
Next
If Not rngtodelete Is Nothing Then rngtodelete.EntireRow.Delete xlUp

另一种方法是使用AutoFilter这样:

Sheet2.Range("G2:G298").AutoFilter 1, "="
Sheet2.Range("G2:G298").SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp

我假设G2不包含您的标题,而是数据的开头 如果它恰好是您的标题,则删除时需要使用偏移量。

Sheet2.Range("G2:G298").Offset(1, 0) _
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete xlUp
Sheet2.AutoFilterMode = False

答案 1 :(得分:0)

我不完全确定你的意思"这是用作连接器" ,但我认为它与导出/导入过程有关应用

如上所述,零长度字符串与真正的空白单元格不同。但是,您可以轻松地删除它们的工作表。我所知道的最快的方法是快速循环遍历所有列,应用文本到列►固定宽度►完成每个。

完成后,零长度字符串将恢复为真正空白的单元格,但工作表的使用范围仍将与数据集底部的空单元格重叠。这意味着对外部程序的任何导出都将尝试导出这些单元格。只需运行.UsedRange即可让Excel重新评估实际使用的范围。

首先,点击 Ctrl + 结束,查看Excel 认为是工作表中最后使用的单元格。接下来,运行以下宏。

Sub prep_for_export()
    Dim c As Long
    Debug.Print Sheets("Sheet1").UsedRange.Address(0, 0)
    With Sheets("Sheet1")
        For c = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
            .Columns(c).TextToColumns Destination:=.Cells(1, c), _
              DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
        Next c
    End With
    Sheets("Sheet1").UsedRange
    Debug.Print Sheets("Sheet1").UsedRange.Address(0, 0)
End Sub

如果必须在运行之前在所有四个地方编辑 Sheet1

这有点同质但我认为它应该适用于您的目的。运行宏后,再次点击工作表中的 Ctrl + 结束,查看Excel认为工作表中最后使用的单元格。之前和之后的范围地址也被记录到VBE的立即窗口。