在电子表格中选择非空行

时间:2013-01-09 03:51:52

标签: excel excel-vba range vba

我将尝试尽可能地保持这个并且仍然充分解释,这里是:)

我搜索了论坛,我的VBA文献,但找不到办法去做我正在尝试的事情。

我有一个包含rowTotal> = 60行的电子表格。这些行在每列的单元格中都有文本数据,或者行是空白的,并且设置了图案和颜色索引。

我需要一个宏来选择所有非空行。

我首先尝试循环遍历列A的单元格(如果列A中的单元格具有文本数据,则应选择其行),检查activecell.value<>空。

这是jist(伪代码和代码的混合):

Range("A1").Select
loop to end
  if activeCell.value <> empty then 
    stringVar = stringVar + cstr(activeCell.row) + ":" + cstr(activeCell.row) + ","
  end if 
end loop

stringVar = Left(stringVar, (Len(stringVar) - 1))
Range(stringVar).Select
  1. 如果我有10行,第2行和第8行有数据,stringVar会解析为:"2:2, 8:8"
    Range(stringVar).Select与撰写Range("2:2, 8:8").Select

  2. 的结果相同
  3. 如果范围内的行数是&lt; = 45,这没有问题。但是,只要包含数据的行数超过45,代码就会在Range(stringVar).Select上失败。

  4. 我尝试了宏录制器并使用Union方法解决了这个问题。所以我想,“自我,你可以用Union()来完成这个。万岁的MacroRecorder。”但是,唉,我的喜悦是疏忽 我以为我可以将一个大字符串拆分成一个或多个字符串;这些较小的弦中的每一个都将低于上述45限制。然后我可以使用Union()将所有范围(这些较小的字符串)组合到一个所需的范围内。

    然而,在我知道其中有多少 45&gt;之后,我必须在代码执行期间实时“构建”我的Union()代码。字符串我有。

    任何人都知道如何获取工作表并只选择包含数据的行;这相当于具有一系列非连续行,其中选择的行数超过45行。

3 个答案:

答案 0 :(得分:7)

无需循环 - 使用SpecialCells

对于A列,仅使用:

Set rng1 = Columns("A").SpecialCells(xlCellTypeConstants).EntireRow

代替。

Sub QuickSet()

  Dim rng1 As Range

  On Error Resume Next
  Set rng1 = Cells.SpecialCells(xlCellTypeConstants).EntireRow
  On Error GoTo 0

  If Not rng1 Is Nothing Then
    MsgBox "Your working range is " & rng1.Address(0, 0)
  Else
    MsgBox "No constants found"
  End If

End Sub

答案 1 :(得分:2)

我首先建议你尝试使用Autofilter。如果您使用的是Excel 2010(以及2007年的问题,但我无法检查),这就像选择数据,选择“数据”选项卡,然后单击“过滤”一样简单。使用第一列中的下拉框,取消选择“空白”。

Excel 2003中的“数据/过滤器”菜单选项下存在完全相同的功能。不过,我真的记不清楚了。你必须进行实验,或谷歌。

如果不起作用:

Sub it()

    Dim cell As Range
    Dim selectRange As Range

    For Each cell In ActiveSheet.Range("A:A")
        If (cell.Value <> "") Then
            If selectRange Is Nothing Then
                Set selectRange = cell
            Else
                Set selectRange = Union(cell, selectRange)
            End If
        End If
    Next cell

    selectRange.Select
    ' selectRange.EntireRow.Select 'If you want to select entire rows

End Sub

答案 2 :(得分:1)

刚刚使用了这段代码并且它起了作用 - 一直在跟踪所有其他excel论坛,但找不到任何简化的内容。

我还补充说,所选行被复制并粘贴到另一张表格中的下一个空行,如果有人发现这有用的话。

Sub copypaste1()

    'Find rows that contain any value in column A and copy them
    Dim cell As Range
    Dim selectRange As Range

    For Each cell In ActiveSheet.Range("A:A")
        If (cell.Value <> "") Then
            If selectRange Is Nothing Then
                Set selectRange = cell
            Else
                Set selectRange = Union(cell, selectRange)
            End If
        End If
    Next cell

    selectRange.EntireRow.Select
    selectRange.EntireRow.Copy

    'Paste copied selection to the worksheet 'mega' on the next blank row
    Sheets("mega").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _
         Paste:=xlPasteValues

End Sub