2009-12-28 40 views
1

我通過VSTO 3.0遇到Excel 2007問題。在我的項目中,我偶爾需要洗牌。通常情況下,這工作正常,但我最近發現,當數據被過濾並且適配數據不連續時會出現問題。使用過濾器完整重新排序Excel表列

例如,使用該數據集:

 
Ohio  Eastern 
Kentucky Eastern 
Illinois Central 
California Pacific 
Florida  Eastern 

如果列2名不包括任一或太平洋中央的濾波器,下面的代碼產生錯誤。

ListObject table = FindReportTable(); 
// Get data to shuffle around. 
ListColumn tempColumn = table.ListColumns.Add(missing); 
Range range1 = table.ListColumns[column1].Range; 
Range range2 = table.ListColumns[column2].Range; 
Range tempRange = tempColumn.Range; 
// Swap the rows. 
range1.Copy(tempRange); // This is where an error is thrown. 
range2.Copy(range1); 
tempRange.Copy(range2); 
tempColumn.Delete(); 

引發的誤差是System.Runtime.InteropServices.COMException與-2146827284和消息的錯誤代碼「那命令不能在多個選擇中使用」。

我已經嘗試了很多東西,沒有一個看起來完全工作。如果我使用table.AutoFilter.ShowAllData(),我可以繼續沒有任何問題,但我已經清除了用戶的過濾器,並且無法按照我的設想返回table.AutoFilter.ApplyFilter()

我無法可靠地存儲和重新創建過濾器,原因有兩個:其中一個,通過迭代table.AutoFilter.Filters並存儲過濾器的數據可能會導致問題,如果過濾器中的數據集太大。參考我的示例數據,如果篩選器要從​​列2中排除Central,則嘗試檢索篩選器的信息會導致互操作錯誤。其次,爲了重新創建過濾器,我需要知道過濾器最初是通過何種行進入table.Range.AutoFilter(object, object, XlFilterOperator, object, object)方法。

我一直對我的頭撞現在太久了,似乎無法在我自己的頭上或在廣闊的互聯網上找到解決方案。任何幫助將非常感激。

回答

1

我會考慮刪除並重新創建過濾器。如果你看到問題,那麼你應該解決這些問題。

看看ListObject.AutoFilter.Filters集合。

查看here瞭解更多信息。

+0

這就是我一直在嘗試做的,但不知道如何去做。我嘗試了幾種看起來像應該導致這種情況的方式,例如'AutoFilter.ShowAllData()'和'AutoFilter.ApplyFilter()',但它不起作用。 – 2009-12-28 18:24:17

+0

我也嘗試了我相信你暗示的:保存過濾條件,清除它們,按需要重新排序,然後重新創建每個過濾器。這將是一個理想的解決方案,但由於問題底部第二段的原因,這是行不通的。如果有一種方法可以獲得過濾器所在的列,並且如果數據集很大,也可以在沒有異常的情況下獲取標準,這樣可以很好地工作。 – 2009-12-28 18:39:05

+1

看看這個鏈接。它正是你想要完成的事情(使用VBA - 它不應該太難轉換) - http://msdn.microsoft.com/en-us/library/bb210085.aspx – 2009-12-28 19:24:00