【问题标题】:Excel VBA code to select non empty cellsExcel VBA代码选择非空单元格
【发布时间】:2021-02-17 20:27:23
【问题描述】:

在 Excel 中,让我们在 B2 到 B7 和 C2 到 C7 中有数据。在 VBA 中,我可以编写一个宏来选择它:

Sub Macro1()
Range("B2:C7").Select
End Sub

如何重写代码以使其自动选择非空单元格? 如果我删除单元格 B7 和 C7 中的数据,那么我希望宏只选择 Range(B2:C6) 如果我向单元格 B8 和 C8 添加数据,那么我希望宏选择 Range(B2:C8)。

我的数据将始终以 B2、C2 开头,并且数据之间没有任何可用空间。

【问题讨论】:

  • @k.dkhk 如果从Range(B2:C7) 中的单元格B4C4 将被清除,那么您将需要选择Range(B2:C3) 或者您仍然需要选择@987654327 @?

标签: vba excel spreadsheet


【解决方案1】:

您的数据总是从 B2、C2 开始,并且中间没有空单元格?如果是这样,您可以将变量设置为“最后填充的行”

lastRow = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
Range("B2:C" & lastRow).Select

并定义从B2到C“最后一行”的范围

【讨论】:

  • "...定义从 B2 到 C“最后一行”的范围。究竟如何,?我不确定你到底是什么意思
  • 如果中间有一些空单元格怎么办?
【解决方案2】:

使用循环:

Sub qwerty()
    Dim rng As Range, r As Range, rSel As Range

    Set rng = Range("B2:C7")
    Set rSel = Nothing

    For Each r In rng
        If r.Value <> "" Then
            If rSel Is Nothing Then
                Set rSel = r
            Else
                Set rSel = Union(rSel, r)
            End If
        End If
    Next r
    If Not rSel Is Nothing Then rSel.Select
End Sub

如果要扩大被测区域,请使用:

Range("B2:C7").CurrentRegion

【讨论】:

    【解决方案3】:

    使用Selection对象的'SpecialCells'函数

    Sub Macro1()
        Range("B2:C7").Select
        For Each self in Selection.SpecialCells(xlCellTypeConstants)
            Debug.Print(self)
        Next
    End Sub
    

    【讨论】:

    • 很好的提示:SpecialCells 选择。正是我需要的。注意:xlCellTypeConstants 将只选择具有恒定值的单元格(显然),而不是那些值由公式驱动的单元格。 OP 的问题有点难以理解,但确实说明了“非空单元格”,我将其解读为具有非空结果的常量 公式。这仍然可以使用您的方法通过合并xlCellTypeConstantsxlCellTypeFormulas 结果来紧凑地完成。 IE。 Union(Selection.SpecialCells(xlCellTypeConstants), Selection.SpecialCells(xlCellTypeFormulas))
    • 跟进我之前的评论:如果联合的两个范围中的任何一个为空,则联合方法将失败。 IE。如果范围不包含任何公式驱动的值。所以你需要检查每个范围的长度。
    【解决方案4】:

    为了获得所有非空白单元格,您还必须收集包含公式的单元格:

    Function getNonBlankCells(myRange As Range) As Range
        Dim tmpRange As Range, resultRange As Range
        
        Set resultRange = Nothing
        Set tmpRange = myRange.Cells.SpceialCells(xlCellTypeConstants)
        If Not tmpRange Is Nothing Then Set resultRange = tmpRange
        
        Set tmpRange = myRange.Cells.SpceialCells(xlCellTypeFormulas)
        If Not tmpRange Is Nothing Then
            If resultRange Is Nothing Then
                Set resultRange = tmpRange
            Else
                Set resultRange = Union(resultRange, tmpRange)
            End If
        End If
    
        Set getNonBlankCells = resultRange
    End Function
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多