2012-10-24 48 views
3

我有兩種情況。初步代碼:F#Excel Range.Sort失敗或重新安排列

open Microsoft.Office.Interop.Excel 

let xl = ApplicationClass() 
xl.Workbooks.OpenText(fileName...) 
let wb = xl.Workbooks.Item(1) 
let ws = wb.ActiveSheet :?> Worksheet 

let rows = string ws.UsedRange.Rows.Count 

首先,我嘗試以下方法進行排序:

ws.Sort.SortFields.Clear() 
ws.Sort.SortFields.Add(xl.Range("A8:A" + rows), XlSortOn.xlSortOnValues, XlSortOrder.xlAscending, XlSortDataOption.xlSortNormal) |> ignore 
ws.Sort.SortFields.Add(xl.Range("H8:H" + rows), XlSortOn.xlSortOnValues, XlSortOrder.xlAscending, XlSortDataOption.xlSortNormal) |> ignore 
ws.Sort.SetRange(xl.Range("A7:I" + rows)) 
ws.Sort.Header <- XlYesNoGuess.xlYes 
ws.Sort.MatchCase <- false 
ws.Sort.Orientation <- XlSortOrientation.xlSortRows 
ws.Sort.SortMethod <- XlSortMethod.xlPinYin 
ws.Sort.Apply() 

這將導致「排序引用無效確保它是你要排序的數據中,並且第一個「排序方式」框不相同或空白。「

然後我嘗試以下方法進行排序:

ws.Range("A7:I" + rows).Sort(xl.Range("A8:A" + rows), XlSortOrder.xlAscending, 
          xl.Range("H8:H" + rows), "", XlSortOrder.xlAscending, 
          "", XlSortOrder.xlAscending, XlYesNoGuess.xlYes, 
          XlSortOrientation.xlSortRows) |> ignore 

這導致我的專欄被重新排列,雖然我沒有看到任何邏輯的重排。行不排序。

請告訴我我做錯了什麼。

回答

3

我還沒有想出爲什麼第一次排序嘗試不起作用。但我在第二次排序檢查了the documentation。使用命名參數和刪除所有,但必要的參數,我想出了以下內容:

ws.Range("A8:H" + rows).Sort(Key1=xl.Range("A8:A" + rows), Key2=xl.Range("H8:H" + rows), 
          Orientation=XlSortOrientation.xlSortColumns) |> ignore 

默認方向爲xlSortRows。我將其解釋爲排序行,這是Excel在手動排序時執行的正常,默認,直觀排序。不好了。如果您想要在Excel手動排序時執行正常,默認,直觀的排序,請指定xlSortColumns。

1

第一個排序不工作,因爲你可能想排序表由位於一個^h列(按屬性一套判斷到XlYesNoGuess.xlYes)。在這種情況下,您只能使用「排序從上到下排列」(xlSortColumns)進行排序。

您還可以通過在Excel中第一個嘗試這種說服自己,看看有什麼選擇:
1)選擇範圍要應用排序(例如,你的情況「A7:我」 +行)
2 )點擊「數據」菜單 - >「排序&篩選器」任務窗格 - >排序
3)使用「添加級別」/「刪除級別」按鈕添加/刪除列/行
4)然後,您可以選擇任何級別,然後單擊「選項...」按鈕,您將看到可用的「排序選項」。
你會發現,在一個表的情況下,你將有「方向」,這是「排序自上而下」

xlSortColumns只有一個可行的選擇 - 基於這些排序排序的列(意行列)

xlSortRows - 按行(列意味着基於這些行排序)