以编程方式对行或列进行分组和取消分组

时间:2013-02-12 17:30:10

标签: excel vba excel-vba excel-2010

有没有办法在Excel 2010中以编程方式对列或行进行分组/取消组合?

注意:

  • “手动”命令位于数据>概要>分组/取消组合
  • 在excel 2003中,这曾经起作用:someSheet.columns(i).ShowDetail = True / False但它在2010年不再适用于组(仅适用于数据透视表和小计分组)
  • 录制宏不会产生任何我可以使用的代码

更确切地说,在Excel 2010中调用myRange.ShowDetail = True确实展开了折叠组,但如果该组已经展开,则会引发错误。无论组是否扩展,ShowDetail属性都返回True。

3 个答案:

答案 0 :(得分:3)

在Excel 2010中,ShowDetail属性始终对组返回true,无论是折叠还是展开。可以使用Hidden属性:

'to expand
If myRange.EntireColumn.Hidden Then
    myRange.EntireColumn.ShowDetail = True
End If

'to collapse
If Not myRange.EntireColumn.Hidden Then
    myRange.EntireColumn.ShowDetail = False
End If

答案 1 :(得分:3)

关于不在数据透视表中的行...我在Excel 2010中的经验并不是ShowDetail总是评估为True。我认为它确实如此,但我没有意识到我需要在摘要行上让这个属性按预期工作。其次,我没有意识到默认情况下摘要行是在分组行之下。一旦我将该设置更改为在分组行上方的摘要行(在功能区:数据>大纲,显示大纲框中),折叠/展开的测试变得更加清晰。

如果我选择的单元格位于摘要行上,则ShowDetail会在显示分组记录时评估为True,如果不显示则评估为False。我的关键是在摘要行上看到这种行为是这样的。默认情况下将孩子/分组行放在上面真的让我感到震惊。

这是我的宏,当我在摘要行上选择一个单元格时,它会动态扩展和折叠绑定到摘要行的分组记录。并且,如果扩展部分,它会使我的单元格在列A中变为粗体。如果我选择了多个单元格,则该宏不会运行。

请注意,工作表保护可防止展开和折叠单元格组。我的工作表受到保护,因此我取消保护工作表以展开/折叠,然后重新保护它们。 (可能的改进是我只是取消保护/保护当前的工作表而不是所有工作表。)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'TOGGLE SHOW/HIDE ROW
If Target.Cells.Count = 1 Then
    If (Target.EntireRow.OutlineLevel = 1) And (Target.Offset(1, 0).EntireRow.OutlineLevel = 2) And _
       (Target.Column < 15) Then
            Call Macros.ProtShts(False)
                Target.EntireRow.ShowDetail = Not Target.EntireRow.ShowDetail
                If Target.EntireRow.ShowDetail = True Then
                    Range(Cells(Target.Row, 1), Cells(Target.Row, 14)).Font.Bold = True
                Else
                    Range(Cells(Target.Row, 1), Cells(Target.Row, 14)).Font.Bold = False
                End If
            Call Macros.ProtShts(True)
    End If
End If
End Sub

请记住,我将摘要行设置为在分组记录之上。如果摘要行低于分组记录(默认值),则偏移行引用必须更改为-1,如下所示:

(Target.Offset(1, 0).EntireRow.OutlineLevel = 2)

答案 2 :(得分:0)

最好只是更改隐藏范围内单元格的列宽。这将自动取消组合选择。

dim wsA as worksheet
set wsA = Worksheets("Name of your Worksheet")
wsA.Columns("A:AJ").Columns.Group 
wsA.Range("A:A").ColumnWidth = 22.22 
' make the change to one of the cells in the group that you want to unhide.