2

如何使用 Excel 互操作对列进行分组?

如果我录制宏(通常是开始的好方法),我会得到以下代码:

Columns("I:M").Select
Selection.Columns.Group

不幸的是,由于几个问题,这不起作用,至少在 C++ 中是这样。首先,Application.Selection返回一个 normal Range,然后Range.Columns是另一个RangeRange.Group是这种方法:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.group%28v=office.11​​%29.aspx

此方法仅适用于数据透视表。

那么如何使用 Excel 互操作创建列组?

即使我设法创建了一个组,我该如何缩小/扩大它?我的意思是单击 + 以显示组的内容,或者相反,“单击”减号以隐藏组。如果我在录制宏时这样做,它根本不会反映在宏中。

4

2 回答 2

2

尽管Range.Group()文档似乎与数据透视表有关,但如果您使用 提取列Range.Columns,然后将该.Group()方法应用于该范围,它将产生预期的效果。在 C# 中:

Range range = sheet.get_Range("c1","e1");
range.Columns.Group();

编辑:完整的示例,再次在 C# 中(抱歉,这是我方便的示例):

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
app.Workbooks.Add();
Worksheet sheet = app.Workbooks[1].Sheets[1];
Range range = sheet.get_Range("c1","e1");
range.Columns.Group();
于 2012-04-20T14:12:44.937 回答
1

宏记录器掩盖的一件事是需要使用 Range.EntireColumn 属性。这是一些分组、展开和折叠的代码。我通过谷歌搜索和鬼混得到了这个,但我认为它的概念是正确的。希望它很容易翻译成 C++:

Sub test()
Dim ws As Excel.Worksheet

Set ws = ActiveSheet
With ws
    If .Columns.OutlineLevel > 1 Then
        'clear any existing hidden grouped columns and grouping
        .Outline.ShowLevels columnlevels:=.Columns.OutlineLevel
        .Range("1:1").EntireColumn.Ungroup
    End If
    'group
    .Range("A:C").EntireColumn.Group
    'collapse
    ws.Outline.ShowLevels columnlevels:=1
    'expand
    ws.Outline.ShowLevels columnlevels:=.Columns.OutlineLevel
End With
End Sub
于 2012-04-20T14:06:37.227 回答