2017-04-05 6 views
2

다음은 Excel Addin으로 달성하고자하는 작업입니다. Excel 사용자가 범위를 선택하고 삭제합니다. 해당 범위의 셀 데이터 (삭제 한 항목)를 로그 파일에 쓰고 싶습니다. 그래서 여러 질문에 대해 SheetChange 이벤트 처리기에서 삭제 된 범위를 가져올 수 없다고 말하면 저장해야합니다. 선택 변경 이벤트 메서드 처리기에서 전역 변수 LastRange에 범위를 저장하려고합니다. SheetChange 이벤트 핸들러에 LastRange이 필요합니다. 사용할 수 없습니다의 기본 RCW에서 분리 된Excel에서 삭제 된 범위 가져 오기

COM 개체 -

문제는 내가 COM 예외를 얻을 수있다.

나는 LastRange이 해제되어 따라서 예외가 발생한다는 것을 알고 있습니다. 나는 또 다른 SO 질문 here을 언급했다. 대리인에 대한 강력한 참조가 있어도 문제가 지속됩니다.

private ADXExcelSheet_EventHandler sheetChangeEventHandler; 
private ADXExcelSheet_EventHandler sheetSelectionChangeEventHandler; 

private void InitializeComponent() 
{ 
    sheetChangeEventHandler = new AddinExpress.MSO.ADXExcelSheet_EventHandler(SheetChange); 
    excelEvents.SheetChange += sheetChangeEventHandler; 
    sheetSelectionChangeEventHandler = new ADXExcelSheet_EventHandler(SheetSelectionChange); 
    excelEvents.SheetSelectionChange += sheetSelectionChangeEventHandler; 
} 

//.... 

Range LastRange; 

public void SheetSelectionChange(object sender, object sheet, object range) 
{ 
    LastRange = (range as Range); 
} 

public void SheetChange(object sender, object sheet, object range) 
{ 
    ClassX.Method1(range as Range, LastRange); 
} 

LastRange이 Method1 내에서 여전히 null인지 확실하지 않습니다. LastRange은 SheetChange에서 Method1()으로 올바르게 전달됩니다. 이 아이디어를 얻으려면 다른 아이디어가 필요하십니까?

+0

excelEvents가 addinexpress에서 가져온 것입니까? Application.SheetSelectionChange 이벤트 처리기는 약간 다릅니다. – Slai

+0

예. Excelevents from Addinexpress – user1

+0

Add-in Express는 이벤트 처리기가 완료된 직후 이벤트 처리기에 전달 된 모든 COM 개체를 해제하는 것처럼 보입니다. 해결 방법은 무엇입니까? 내가 삭제 된 범위 개체를 저장하고 다른 이벤트 처리기에서 재사용 싶어요. – user1

답변

0

범위를 복사하면 어떨까요?

var sheetConcrete = (Worksheet)sheet; 
var rangeConcrete = (Range)range; 
LastRange = sheetConcrete.Range[rangeConcrete.Address] 

추가 기능이 그 COM 객체를 추적하는 방법이 안

(당신이 작업을 얻을 수있는 구문을 재생해야 할 수도 있습니다) 그래서 살아 있어야한다.

+0

나는 이미 범위를 복사 해 보았습니다. – user1

+0

그럼 복사본을 만들면 어떻게됩니까? 액세스하려고하면 예외가 발생합니까? – briantyler

+0

예, 복사 된 개체가 유효하지 않은 것 같습니다. – user1