2012-04-20 63 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