2013-07-17 59 views
1

我試圖使用使用RemoveDuplicates函數,但我堅持如何將它傳遞給列數組。我已經知道我不能將它作爲一個簡單的int[]數組傳遞,因爲它在運行時會發出異常,並且我可以傳遞一個整數並且它可以工作,但我希望能夠選擇在運行時使用哪些列。RemoveDuplicates函數 - 如何設置多列?

我目前在C#代碼如下所示:

using Excel = Microsoft.Office.Interop.Excel; 

private void removeDuplicates(Excel.Application excelApp, Excel.Range range, int[] columns) 
{ 
    range.RemoveDuplicates(excelApp.Evaluate(columns), 
     Excel.XlYesNoGuess.xlNo); 
} 

而且,如果只使用一列工作正常,但如果columns陣列有一個以上的值,只有第一個被使用。

在VBA,等效功能是:

Sub RemoveBadExample() 
    Dim colsToUse 
    colsToUse = Array(1, 2) 
    Selection.RemoveDuplicates Columns:=Evaluate(colsToUse), Header:=xlYes 
End Sub 

這也不能同時使用的列。但是,如果我將其更改爲:

Selection.RemoveDuplicates Columns:=(colsToUse), Header:=xlYes 

它工作得很好。我想我的問題是什麼在C#中的等價物?

+0

如果刪除使用Evaluate,只是將列作爲第一個參數會發生什麼? –

+0

如果我使用int數組並傳遞它,我得到以下異常:'System.Runtime.InteropServices.COMException:遠程過程調用失敗。 (從HRESULT異常:0x800706BE)' – Mario

回答

4

這個測試運行使用4.5等單元測試運行。它沒有拋出任何異常。

 Application app = new Application(); 
     Workbook wb = app.Workbooks.Open("C:\\Data\\ABC.xlsx", 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing); 
     Worksheet ws = wb.Sheets[1]; 
     Range rng = ws.Range["A1:C5", Type.Missing]; 
     object cols = new object[]{1, 2}; 
     rng.RemoveDuplicates(cols, XlYesNoGuess.xlYes); 

請注意,定義範圍的excel單元格索引是基於1的,而不是零。所以如果你傳入一個不好的範圍,它會拋出這種異常。

Object temp = range.Cells[1][1].Value; 
+0

我看到一些文章,像這樣做︰Columns:= New Object(){1,2,3,4} – Ted

+0

謝謝!使用'object'數組而不是'int'數組。 – Mario