2012-04-20 58 views
2

如何使用Excel interop组合列?Excel Interop:分组列

如果我录制宏(通常是一个很好的入门方法)我得到这个代码:

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

不幸的是,这并不工作,由于一些问题,至少在C++。首先,Application.Selection返回正常Range,然后Range.Columns是另一个Range。而Range.Group是这样的方法:

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

此方法仅适用于使用数据透视表的连接。

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

即使我设法创建一个组,我如何缩小/扩展它?通过我的意思是点击+来显示组的内容,或者更确切地说,“点击”减号以隐藏组。如果我在录制宏的时候这样做,它并不反映在宏中。

回答

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(); 
+0

谢谢。你写的确实是对的。几个小时后,我发现我真的问题(并无法回答,因为我需要等待8小时)。在后面的代码中,我使用参数调用'Range.Subtotal'来替换现有的小计设置为true。此参数似乎不仅仅替换现有的小计,还会删除可能存在的任何组。即使'Range.Subtotal'方法对行进行操作,如果参数已设置,它将删除任何现有的列组......这就是为什么它看起来像列分组不起作用。 – Naryoril 2012-04-21 14:19:29

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 
+0

了'Sheet.Outline.ShowLevels'解决了关于扩大问题/因为我只有一个级别,我希望他们都崩溃了,所以对我来说这个团队崩溃了。谢谢。关于分组本身,请参阅我对Geoff的回答的评论。 – Naryoril 2012-04-21 14:23:00