【问题标题】:Excel VBA macro to group rows based on conditionExcel VBA宏根据条件对行进行分组
【发布时间】:2016-05-16 11:29:37
【问题描述】:

我正在尝试创建一个宏,该宏根据 A 列中是否有值对行进行分组。一些没有值的单元格可能仍然有一个空文本字符串,所以最好使用长度之类的东西大于 2 作为分组的条件,而不仅仅是空白。应用宏的范围是从第 3 行到数据集的最后一行(或者如果需要定义范围,到第 3000 行就足够了)。例如,如果 A4 有一个值,A10 有一个值,那么第 5 行到第 9 行应该成为一个组。我发现一些代码只是谷歌搜索,但我无法正确应用它,所以我宁愿从头开始。提前致谢!

【问题讨论】:

  • 当您说“组”时,您的意思是合并?但是,什么表示您不想再为该“组”合并单元格的范围结束?
  • 你真的需要将它们“分组”吗?仅仅隐藏它们或删除行还不够吗?
  • 未合并,应将行分组(选择多行,转到“数据”功能区,然后选择右侧的“分组”选项作为示例)。范围的结束是出现 LEN>2 的下一个值时。如果 A4 值为 Bobby,A5-A9 为空白,A10 值为 George,则应将第 5-9 行分组,此过程应继续到第 3000 行
  • 是的,分组很重要,因为它允许单击展开/折叠,还允许手动创建子组(其他列中仍然会有值,所以我们不想删除行
  • Ashton 的解决方案做到了,感谢您的所有帮助 ib11 您一直是王牌

标签: vba excel


【解决方案1】:

试试这个 如果空单元格为空白,则适用于我

sub ashGrp()

Dim rng As Range
Dim blankRange As Range
Dim grp As Range
Set rng = Range("a3", Cells(Rows.Count, 1).End(xlUp))
Set blankRange = rng.SpecialCells(xlCellTypeBlanks)

For Each grp In blankRange
    grp.Rows.Group
Next

end sub

如果您需要对文本或空白进行分组,那么这个联合代码就可以解决问题

Sub ashGrp()

    Dim rng As Range
    Dim blankRange As Range
    Dim grp As Range
    Dim txtRange As Range
    Dim unionRange As Range

    Set rng = Range("a3", Cells(Rows.Count, 1).End(xlUp))
    Set blankRange = rng.SpecialCells(xlCellTypeBlanks)
    Set txtRange = rng.SpecialCells(xlCellTypeConstants, xlTextValues)
    Set unionRange = Union(blankRange, txtRange)

    For Each grp In unionRange
    grp.Rows.Group
    Next


End Sub

【讨论】:

    【解决方案2】:

    你可以试试这个。这是这篇文章中缩小的宏:https://stackoverflow.com/a/14967281/6201755

    Public Sub GroupCells()
        Dim myRange As Range
        Dim rowCount As Integer, currentRow As Integer
        Dim firstBlankRow As Integer, lastBlankRow As Integer
        Dim currentRowValue As String
    
        'select range based on given named range
        Set myRange = Range("A3:A3000")
        rowCount = Cells(Rows.Count, myRange.Column).End(xlUp).Row
    
        firstBlankRow = 0
        lastBlankRow = 0
        'for every row in the range
        For currentRow = 1 To rowCount
            currentRowValue = Cells(currentRow, myRange.Column).Value
    
            If (IsEmpty(currentRowValue) Or currentRowValue = "") Then
                'if cell is blank and firstBlankRow hasn't been assigned yet
                If firstBlankRow = 0 Then
                    firstBlankRow = currentRow
                End If
            ElseIf Not (IsEmpty(currentRowValue) Or currentRowValue = "") Then
                If firstBlankRow <> 0 Then
                    'if firstBlankRow is assigned and this row has a value
                    'then the cell one row above this one is to be considered
                    'the lastBlankRow to include in the grouping
                    lastBlankRow = currentRow - 1
                End If
            End If
    
            'if first AND last blank rows have been assigned, then create a group
            'then reset the first/lastBlankRow values to 0 and begin searching for next
            'grouping
            If firstBlankRow <> 0 And lastBlankRow <> 0 Then
                Range(Cells(firstBlankRow, myRange.Column), Cells(lastBlankRow, myRange.Column)).EntireRow.Select
                Selection.Group
                firstBlankRow = 0
                lastBlankRow = 0
            End If
        Next
    End Sub
    

    【讨论】:

    • 酷。我在原帖中做了链接,因为这也值得一票。评论也很好,大家可以借鉴一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多