【问题标题】:VBA: skip blank cells from processing (with formulas in them)VBA:跳过处理中的空白单元格(其中包含公式)
【发布时间】:2016-12-28 19:39:16
【问题描述】:


我有一个 vba 代码,它可以多次复制一个文件,并在“Linkuire”表中的 D 列中的名称列表之后重命名输出。
D 列充满了将数据带入单元格的连接公式,直到 D1000。
当连接公式返回“”(什么都没有)时,我希望代码忽略该单元格。

 ' the range of cells that contain the rename list
With ActiveWorkbook.Sheets("Linkuire")  
 Set rRenameList = .Range("D2", .Cells(.Rows.Count, "D").End(xlUp))
End With 

现在它只考虑所有 D2 到 D1000 单元格,即使有些是 = ""

如何使代码忽略连接返回为 "" 的所有单元格?(我在将某个工作表转换为 pdf 的 vba 代码中遇到了同样的问题 - 获得了数据来自连接公式。即使连接返回“”并且为空白,它也会转换所有单元格)

谢谢你..

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    编辑自 SpecialCells() 方法不起作用

    您可以使用以下两种方法并避免循环:

    • AutoFilter()SpecialCells() 方法:

      With ActiveWorkbook.Sheets("Linkuire")
          With .Range("D1", .Cells(.Rows.count, "D").End(xlUp))
              .AutoFilter Field:=1, Criteria1:="<>" '<--| filter out blanks
              If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set rRenameList = .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
          End With
          .AutoFilterMode = False
      End With
      

    • 公式和SpecialCells() 方法

      With ActiveWorkbook.Sheets("Linkuire")
          With .Range("D2", .Cells(.Rows.count, "D").End(xlUp))
              .Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""", 1,"""")"
              Set rRenameList = .Offset(, 1).SpecialCells(xlCellTypeFormulas, xlNumbers).Offset(, -1)
              .Offset(, 1).ClearContents
          End With
      End With
      

      在这种方法中,您在“帮助”列中编写公式,我选择作为右侧的相邻列。它可以调整为任何其他偏移量

    【讨论】:

    • 这对你有用吗?我尝试了类似的方法,但它仍然只是使用公式抓取所有单元格......因此抓取了所有单元格,因为 OP 在所有单元格中都有“=Concat(A1,B1)”。
    • User3598756s 解决方案不起作用。无论公式是否导致某些内容或“”,仍然会得到所有单元格。布鲁斯,你的代码非常完美:) 我把它作为答案推销,谢谢
    • 你们俩都是对的!我用两种不同的(有效的!)方法编辑了我的答案
    • @MisterA,您是否尝试过这两个(替代)代码?它们又短又快
    • 谢谢。抱歉回复晚了。在我解决了这个问题后,我直接跳到了我的项目的下一个问题,但我也保存了你的替代方案以备将来使用 :)
    【解决方案2】:

    这应该可行。它将遍历您的范围,并且仅在长度大于或等于 1 时将单元格地址添加到您的rRenameList

    Sub Test()
    ' Adapted from http://stackoverflow.com/a/8320884/4650297
    
      Dim rng1 As Range, rRenameList As Range, cel As Range
      With ActiveWorkbook.Sheets("Linkuire")
        Set rng1 = .Range("D2", .Cells(.Rows.Count, "D").End(xlUp))
      End With
    
      For Each cel In rng1
        If Len(cel) >= 1 Then
            If Not rRenameList Is Nothing Then
                Set rRenameList = Union(rRenameList, cel)
            Else
            ' the first valid cell becomes rng2
                Set rRenameList = cel
            End If
        End If
      Next cel
    
    Debug.Print rRenameList.Address
    End Sub
    

    【讨论】:

    • 谢谢,这很好。解决了我的问题。非常感谢,我是 VBA 新手 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多