2013-07-17 4 views
1

Excel.Interop을 사용하여 RemoveDuplicates 함수를 사용하려하지만 열 배열을 전달하는 방법에 대해 고민하고 있습니다. 나는 이미 런타임에서 예외를 제공하고, 하나의 정수를 전달할 수 있고 작동하지만, 런타임에 사용할 열을 선택할 수 있기를 원한다면 단순한 int[] 배열로 전달할 수 없다는 것을 이미 알고있다.중복 제거 기능 - 여러 열을 어떻게 설정합니까?

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 배열 값을 두 개 이상있는 경우 첫 번째 명령 만이 사용됩니다

C#에서 나의 현재 코드는 다음과 같습니다.

은 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

평가판 사용을 제거하면 어떻게됩니까? 단지 첫 번째 인수로만 열을 사용합니까? –

+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 셀 인덱스는 0이 아니라 1을 기준으로합니다. 그래서 당신이 나쁜 범위를 통과한다면, 그것은 예외를 던질 것입니다.

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

나는 그것을 좋아하는 몇 가지 게시물을 참조하십시오 : 열 : = 새로운 개체() {1, 2, 3, 4} – Ted

+0

고마워! 'int' 배열 대신'object' 배열을 사용하면 효과가있었습니다. – Mario