我通過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)
方法。
我一直對我的頭撞現在太久了,似乎無法在我自己的頭上或在廣闊的互聯網上找到解決方案。任何幫助將非常感激。
這就是我一直在嘗試做的,但不知道如何去做。我嘗試了幾種看起來像應該導致這種情況的方式,例如'AutoFilter.ShowAllData()'和'AutoFilter.ApplyFilter()',但它不起作用。 – 2009-12-28 18:24:17
我也嘗試了我相信你暗示的:保存過濾條件,清除它們,按需要重新排序,然後重新創建每個過濾器。這將是一個理想的解決方案,但由於問題底部第二段的原因,這是行不通的。如果有一種方法可以獲得過濾器所在的列,並且如果數據集很大,也可以在沒有異常的情況下獲取標準,這樣可以很好地工作。 – 2009-12-28 18:39:05
看看這個鏈接。它正是你想要完成的事情(使用VBA - 它不應該太難轉換) - http://msdn.microsoft.com/en-us/library/bb210085.aspx – 2009-12-28 19:24:00