2017-01-14 4 views
2

행과 열 개수를 얻기 위해 Excel.Worksheet 개체의 UsedRange 속성을 사용했습니다. 열이나 행을 삭제하려고하면 UsedRange 수가 줄여야합니다. 그러나, 많은 디버깅 후 특정 순서대로 열의 속성 및 열 너비를 변경하십시오. 카운트는 이에 따라 변경되지 않으므로 셀에 앵커가 설정되어 있어야합니다. 설명해 주시면 (제 코드에 많은 영향을 미칩니다).C# UsedRange count incorrect

시험 코드 :

Worksheet worksheet = Globals.ThisAddIn.Application.ActiveSheet; 
Debug.WriteLine("Used Range Column Count 1: " + worksheet.UsedRange.Columns.Count); 

worksheet.Range["A1"].Formula = "1"; 
worksheet.Range["B1"].Formula = "1"; 
worksheet.Range["C1"].Formula = "1"; 
worksheet.Range["D1"].Formula = "1"; 
Debug.WriteLine("Used Range Column Count 2: " + worksheet.UsedRange.Columns.Count); 

Range column = worksheet.Columns[4]; 
column.Delete(); 
Debug.WriteLine("Used Range Column Count 3: " + worksheet.UsedRange.Columns.Count); 

worksheet.Range["D1"].Formula = "1"; 
column = worksheet.Columns[4]; 
column.ColumnWidth = 20.0; 
column.Hidden = true; 
column.Hidden = false; 
column.Delete(); 
Debug.WriteLine("Used Range Column Count 4: " + worksheet.UsedRange.Columns.Count); 

worksheet.Range["D1"].Formula = "1"; 
column = worksheet.Columns[4]; 
column.Hidden = true; 
column.Hidden = false; 
column.ColumnWidth = 20.0; 
column.Delete(); 
Debug.WriteLine("Used Range Column Count 5: " + worksheet.UsedRange.Columns.Count); 

결과 :

사용 범위 열 카운트 1 : 1 (예상)
사용 범위 열이 개수 : 4 (예상)
사용 범위 열 카운트 3 : 3 (예상)
사용 범위 열 개수 4 : 4 (예상하지 않음)
사용 범위 열 개수 5 : 3 (예상)

올바른 사용 범위 카운트 필요성에 16,

또한 설명 : I는 엑셀 인터페이스를 개선 할 수있는 응용 프로그램에 일하고

. 예를 들어, 사용자는 인벤토리 목록과 구매 비용을 소계 또는 평균 가격 라인으로 끝낼 수 있습니다. (실제 하위 합계 줄은 합계와 평균보다 훨씬 복잡합니다.) 따라서 목록은 확장 가능해야하지만 하위 합계 줄은 확장 할 수 없습니다. 결과적으로 새로운 행이나 새로운 열이 추가되거나 제거되는지 추적해야하므로 Excel 워크 시트의 수를 역사적 (캐시) 수와 교차 점검해야합니다. 새 행이나 열에는 실제 데이터가 없을 수 있으므로 UsedRange 속성을 사용하여 표시된 현재 행/열 개수를 확인했습니다. 따라서 UsedRange에 삭제 된 행/열이 포함되어있어 계산이 불가능합니다. 와, 워크 시트의 마지막 셀을 표시하는 하나의 셀 이름 범위를 사용

: 나는 앵커 효과를 해제 할 수있는 방법을 찾을 수 있지만


, 나는 마지막으로 일을 할 수있는 방법을 알아 냈어 UsedRange 속성을 사용하여 범위를 초기화합니다.

범위에 대한 사용자에게 표시하지 않으려면 워크 시트의 사용자 지정 속성에 데이터를 저장해보십시오. 그러나이 방법은 사용자 작업 추적에 대한 추가 고려 사항이 필요합니다. 행/열을 추가하면 범위 참조가 자동으로 변경됩니다.

+0

코드를 VBA로 변환하고 실행했습니다. 그것은 같은 결과를 낳았다. 'UsedRange' 객체가 작동하는 신비한 방식과 관련이 있다고 생각합니다. 지난 며칠간 여러 게시물을 읽었으며 아직도 어떻게 작동하는지 파악하려고합니다. – vknowles

+0

예, 매우 좌절되었습니다. 마지막으로 사용한 셀을 결정하기 위해 앵커를 설정하는 특정 방법이 필요하다는 것을 이해할 수 있지만 앵커를 제거하는 방법을 제공해야합니다. – Carson

+0

나는 그들이 의도적으로 그렇게하지 않는다고 생각합니다. 다른 Excel 버그와 비슷하게 보이지만 트리거는 폭이 변경된 범위를 숨기고 있습니다. 심지어 [파일 저장] (http://stackoverflow.com/a/11454176/11683)도 도움이되지 않습니다. – GSerg

답변

0

글쎄, UsedRange은 마지막 행과 열을 결정하는 데 적합하지 않습니다. 대신이 코드를 사용할 수 있습니다.

// get last row 
var WorksheetLastRow = worksheet.Cells.Find(
    What: "*", 
    SearchOrder: Excel.XlSearchOrder.xlByRows, 
    SearchDirection: Excel.XlSearchDirection.xlPrevious, 
    MatchCase: false 
).Row; 

// get last column 
var WorksheetLastCol = worksheet.Cells.Find(
    What: "*", 
    SearchOrder: Excel.XlSearchOrder.xlByColumns, 
    SearchDirection: Excel.XlSearchDirection.xlPrevious, 
    MatchCase: false 
).Column; 
+0

내 코드에서 UsedRange를 광범위하게 사용했습니다 ... UsedRange를 사용하여 삭제할 수있는 한 행 수를 얻는 데는 문제가 없습니다 ... 이에 대한 아이디어가 없습니까? – Carson

+0

방금이 방법을 시도했지만 형식이 지정된 셀, 더 이상 아이디어를 캡처 할 수 없습니까? – Carson

+0

UsedRange에 대한 잘못된 결과의 문제는 VSTO에서만 발생하지 않으며 Excel을 직접 사용할 때도 발생합니다. 예를 들어 워크 시트가 있다고 가정 해 보겠습니다. 8 행 2 열. 키보드에서 Ctrl + End를 누르면 마지막 셀 (마지막 행과 마지막 열에있는 셀)이 선택됩니다. 8 행 2 열 중 하나를 삭제하면 8 행 중 하나를 삭제하면 Ctrl + End를 누르면 행 7, 열 2가 표시됩니다. 그러나이 방법은 효과가 없습니다. 여전히 행 8 열 2가 나타납니다. – Xaver